Как вставить полигон в PostGIS, используя JDBC - PullRequest
0 голосов
/ 20 ноября 2018

Я получаю многоугольник в виде набора точек.(текстовое или JSON-представление)

Мне нужно сделать следующее:

1) вставить полигон в PostGIS, используя JDBC

2) Я получаю координату объекта (точка)и мне нужно проверить, находится ли эта точка внутри многоугольников или нет.

Я видел разные примеры, но я не нашел ни одного, использующего JDBC (Java).

Можете ли вы поделиться простымфрагмент java или указывает на уже существующий пример.

Обратите внимание, полигон в моем случае не цикл

Спасибо, Олег.

Ответы [ 2 ]

0 голосов
/ 24 апреля 2019

Вы можете использовать классические вызовы JDBC, основные отличия будут в том, какой PL / SQL вы пишете, и в используемом формате ввода / вывода.

1.Построить объекты Geom 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Отношения и измерения функций.В вашем случае ST_Contains или ST_Intersects может быть точным.

SELECT geom FROM table WHERE ST_Contains(geom, ST_GeomFromEWKT(?))
0 голосов
/ 22 ноября 2018

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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...