如何使用JDBC将多边形插入PostGIS

时间:2018-11-20 16:40:24

标签: java jdbc polygon postgis

我将多边形作为一组点。 (文本或JSON表示形式)

我需要执行以下操作:

1)使用JDBC将多边形插入PostGIS

2)我正在获取对象坐标(点),我需要检查该点是否在多边形内。

我看到了不同的示例,但没有找到任何使用JDBC(Java)的示例。

能否请您分享简单的Java代码段或将我指向已经存在的示例。

在我的情况下,注意多边形不是一个循环

谢谢 奥列格。

2 个答案:

答案 0 :(得分:1)

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)您可以为此使用jts(如上所述),也可以使用类似的Postgis查询

    SELECT * FROM table_name
    WHERE st_contains(geom, st_setsrid(st_makepoint(99.404296875, 58.60261057364717), 4326))

答案 1 :(得分:1)

您可以使用经典的JDBC调用,主要区别在于编写的PL / SQL和使用的输入/输出格式。

1。构造Java geom对象

  • Postgis可以读取某些格式(请参阅2.)。因此,应使用可以以这种格式之一导出的java对象。
  • 输入(例如文件或字符串)可以由阅读器直接读取。

示例:请参见gcloud config set project 'my-set-project'

  • 还可以构造自己的几何对象并将其转换为正确的格式。

示例:参见org.locationtech.jts.io类和org.locationtech.jts.geom(导出为WKT格式)

2。插入数据

您可以使用数据格式使用Postgis Geometry Constructors来构造对象。有多种格式可用:WKT,EWKT,GeoJSON,GML,KML等。 例如:

org.locationtech.jts.geom.Geometry.toText()

3.获取包含点的多边形

您可以使用Postgis Spatial Relationships and Measurements函数。就您而言,ST_ContainsST_Intersects可能是正确的。

INSERT INTO table(geom) VALUES ST_GeomFromEWKT(?)