简体   繁体   中英

how to insert polygon to PostGIS using JDBC

I am getting polygon as a set of points. (text or JSON representation)

I need to do the following:

1) insert polygon to PostGIS using JDBC

2) I am getting an object coordinate ( point ) and I need to check if this point inside polygons or not.

I saw different examples but I didn't find any which is using JDBC ( Java ).

Can you please share the simple java snippet or pointing me to already an existing example.

Note polygon in my case is not a cycle

Thanks Oleg.

1) You can use something like that

        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

    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.

1. Construct Java geom objects

  • Some formats can be read by Postgis (see 2.). So a java object which can be exported in one of this format should be used.
  • The input (file or string for instance) can be directly be read by a reader.

Example: see org.locationtech.jts.io

  • It's also possible to construct yourself geometric objects and convert them into the right format.

Example: see org.locationtech.jts.geom classes and org.locationtech.jts.geom.Geometry.toText() (exports to WKT format)

2. Inserting data

You can construct objects using Postgis Geometry Constructors , using your data format. There are multiple formats availables: WKT, EWKT, GeoJSON, GML, KML etc. For instance:

INSERT INTO table(geom) VALUES ST_GeomFromEWKT(?)

3. Getting polygons containing a point

You can use Postgis Spatial Relationships and Measurements functions. In your case ST_Contains or ST_Intersects may be accurate.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM