[英]how to insert polygon to PostGIS using JDBC
I am getting polygon as a set of points. 我将多边形作为一组点。 (text or JSON representation)
(文本或JSON表示形式)
I need to do the following: 我需要执行以下操作:
1) insert polygon to PostGIS using JDBC 1)使用JDBC将多边形插入PostGIS
2) I am getting an object coordinate ( point ) and I need to check if this point inside polygons or not. 2)我得到一个对象坐标(点),我需要检查这个点是否在多边形内。
I saw different examples but I didn't find any which is using JDBC ( Java ). 我看到了不同的示例,但是没有找到任何使用JDBC(Java)的示例。
Can you please share the simple java snippet or pointing me to already an existing example. 您能否分享简单的Java代码段或将我指向已经存在的示例。
Note polygon in my case is not a cycle 注意在我的情况下多边形不是循环
Thanks Oleg. 谢谢奥列格。
1) You can use something like that 1)你可以使用类似的东西
String url = "jdbc:postgresql://localhost:5432/test";
try (java.sql.Connection conn = DriverManager.getConnection(url, "user", "password")) {
Class.forName("org.postgresql.Driver");
GeometryFactory geometryFactory = new GeometryFactory(new PrecisionModel(), 4326);
PackedCoordinateSequenceFactory csFactory = new PackedCoordinateSequenceFactory();
CoordinateSequence sequence = csFactory.create(5, 2);
sequence.setOrdinate(0 /*first point*/, 0, 92.63671875);
sequence.setOrdinate(0 /*first point*/, 1, 56.88500172043518);
sequence.setOrdinate(1, 0, 101.66748046874999);
sequence.setOrdinate(1, 1, 56.88500172043518);
sequence.setOrdinate(2, 0, 101.66748046874999);
sequence.setOrdinate(2, 1, 59.80063426102869);
sequence.setOrdinate(3, 0, 92.63671875);
sequence.setOrdinate(3, 1, 59.80063426102869);
sequence.setOrdinate(4 /*closed point*/, 0, 92.63671875);
sequence.setOrdinate(4 /*closed point*/, 1, 56.88500172043518);
// pass an array of Coordinate or a CoordinateSequence
Polygon geo = geometryFactory.createPolygon(sequence);
// you can use it to check if this point inside polygons
// or you can use just query, something like that SELECT * FROM table_name WHERE st_contains(geom, your_point)
boolean isContains = geo.contains(geometryFactory.createPoint(new Coordinate(99.404296875,
58.60261057364717)));
WKBWriter writer = new WKBWriter();
PreparedStatement preparedStatement =
conn.prepareStatement("INSERT INTO table_name (geom) VALUES (ST_GeomFromWKB(?, 4326))");
preparedStatement.setBytes(1, writer.write(geo));
int rows = preparedStatement.executeUpdate();
if (rows > 0) {
System.out.println(" Successful insert! ");
} else {
System.out.println(" Failed insert!");
}
preparedStatement.close();
} catch (Exception e) {
e.printStackTrace();
}
dependencies for that (pom.xml, use repository http://repo.boundlessgeo.com/main/):
`<dependencies>
<dependency>
<groupId>org.locationtech.jts</groupId>
<artifactId>jts-core</artifactId>
<version>1.16.0</version>
</dependency>
<dependency>
<groupId>org.locationtech.jts</groupId>
<artifactId>jts-modules</artifactId>
<version>1.16.0</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-main</artifactId>
<version>20.1</version>
</dependency>
<dependency>
<groupId>org.geotools</groupId>
<artifactId>gt-geojson</artifactId>
<version>20.1</version>
</dependency>
<dependency>
<groupId>org.geotools.jdbc</groupId>
<artifactId>gt-jdbc-postgis</artifactId>
<version>20.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.2.1</version>
<scope>compile</scope>
</dependency>
</dependencies>`
2) You can use jts for that (as you can see above) or you can use Postgis query like that 2)您可以为此使用jts(如上所示),也可以使用Postgis查询
SELECT * FROM table_name
WHERE st_contains(geom, st_setsrid(st_makepoint(99.404296875, 58.60261057364717), 4326))
You can use classic JDBC calls, the main differences will be in the PL/SQL you write and in input/output format used. 您可以使用经典的JDBC调用,主要区别在于编写的PL / SQL和使用的输入/输出格式。
Example: see org.locationtech.jts.io
示例:请参见
org.locationtech.jts.io
Example: see org.locationtech.jts.geom
classes and org.locationtech.jts.geom.Geometry.toText()
(exports to WKT format) 示例:请参见
org.locationtech.jts.geom
类和org.locationtech.jts.geom.Geometry.toText()
(导出为WKT格式)
You can construct objects using Postgis Geometry Constructors , using your data format. 您可以使用Postgis Geometry构造函数使用数据格式来构造对象。 There are multiple formats availables: WKT, EWKT, GeoJSON, GML, KML etc. For instance:
有多种格式可用:WKT,EWKT,GeoJSON,GML,KML等。例如:
INSERT INTO table(geom) VALUES ST_GeomFromEWKT(?)
You can use Postgis Spatial Relationships and Measurements functions. 您可以使用Postgis 空间关系和度量功能。 In your case ST_Contains or ST_Intersects may be accurate.
就您而言, ST_Contains或ST_Intersects可能是准确的。
SELECT geom FROM table WHERE ST_Contains(geom, ST_GeomFromEWKT(?))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.