【问题标题】:how to insert polygon to PostGIS using JDBC如何使用 JDBC 将多边形插入 PostGIS
【发布时间】:2023-03-06 21:24:01
【问题描述】:

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

我需要做以下事情:

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

2) 我得到一个对象坐标 (point),我需要检查这个点是否在多边形内。

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

您能否分享一下简单的 java sn-p 或指向我已经存在的示例。

注意多边形在我的例子中不是一个循环

谢谢 奥列格。

【问题讨论】:

    标签: java jdbc polygon postgis


    【解决方案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))
    

    【讨论】:

      【解决方案2】:

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

      1。构造 Java 几何对象

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

      例子:org.locationtech.jts.io

      • 也可以自己构建几何对象并将它们转换为正确的格式。

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

      2。插入数据

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

      INSERT INTO table(geom) VALUES ST_GeomFromEWKT(?)
      

      3. 获取包含点的多边形

      您可以使用 Postgis Spatial Relationships and Measurements 函数。在您的情况下,ST_ContainsST_Intersects 可能是准确的。

      SELECT geom FROM table WHERE ST_Contains(geom, ST_GeomFromEWKT(?))
      

      【讨论】:

        猜你喜欢
        • 2021-01-31
        • 2017-01-12
        • 2014-04-20
        • 2016-04-11
        • 2020-03-21
        • 2013-10-03
        • 2021-05-04
        • 2016-12-20
        • 2011-11-27
        相关资源
        最近更新 更多