2016-11-10 13 views
4

У меня есть база данных PostgreSQL/PostGIS, и я хочу преобразовать таблицу данных из базы данных в формат GeoJSON.Как преобразовать данные из базы данных PostGIS в GeoJSON в Java

Моя цель - использовать этот GeoJSON для создания карты с JavaScript. Я использую Java и JDBC в Spring MVC. Каков наилучший способ преобразования данных?

+1

Вы можете создать Geojson в Postgis. См. Http://postgis.net/docs/ST_AsGeoJSON.html. Или http://gis.stackexchange.com/questions/142391/store-a-geojson-featurecollection-to-postgres-with-postgis – mlinth

ответ

4

Это можно сделать в запросе, который извлекает данные из базы данных. Вы можете использовать функцию postgis ST_AsGeoJSON(). Вот ссылка на документацию для него.

http://postgis.org/docs/ST_AsGeoJSON.html

Одна вещь, чтобы отметить, что результат ST_AsGeoJSON() возвращает только геометрическую часть данных. Если вам нужно получить функцию geojson, вам нужно будет создать объект объекта и добавить к нему геометрию.

Примером результата, который следует ожидать при использовании ST_AsGeoJSON(), будет {"type": "Point", "coordinates": [12, 15]}.

Если вы хотите создать объект из объекта геометрии, это будет выглядеть примерно как {"type": "Feature", "properties": {}, "geometry": {"type": "Point", "coordinates": [12, 15]}}.

0

ogr2ogr - ваш друг. Стив Беннетт дает отличный пример с пользовательскими свойствами/столбцами выбором here, вдоль линий этого:

ogr2ogr -f GeoJSON out.json "PG: хост = локальный имя_бд = MYDB пользователь = MyUser пароля = mypw" -sql "SELECT column1, column2, column3 FROM mytable"

0

Наиболее очевидным ответом является использование ST_AsGeoJSON для преобразования геометрии в строку в базе данных. Однако это подталкивает некоторую логику приложения к базе данных и, возможно, что более важно, это приводит к тому, что гораздо большее количество данных передается по сети, поскольку текстовое представление GeoJSON гораздо менее компактно, чем расширенный Well Known Binary (EWKB), который Postgres использует иначе. Это также означает, что вы не можете сделать что-либо полезное в своих MVC-контроллерах с геометрией без десериализации его обратно на нечто вроде геометрии JTS.

Более богатый и потенциально быстрый (при наличии сети) решение заключается в использовании пространственных расширений для вашего провайдера JPA (например, Hibernate поддерживает это из коробки в версии 5 и имеет Hibernate-Spatial для версии 4) чтобы вытащить геометрию прямо в вашу сущность в виде JTS (или аналогичной) геометрии. Большинство реализаций будут использовать WKB (Well Known Binary) как компактное представление по проводу, а затем десериализуются в соответствующий тип Java, вместо того, чтобы преобразовывать каждые 64 битные (8 байтов) двоичные двойные в какую-то огромную структуру! С Hibernate можно сделать следующее (настроить определение в соответствии с требованиями для SRID типа и геометрии и т.д.):

@Column(columnDefinition = "geometry(MultiPolygon,4326)") 
private Geometry geom; 

Тогда скажите Spring, что вы используете PostGIS диалект в application.properties (или другой источник конфигурации):

spring.jpa.database-platform=org.hibernate.spatial.dialect.postgis.PostgisDialect 

Ваши репозитории данных Spring возвратят объекты с геометрией (также можно писать запросы JPQL в методах интерфейса репозитория для поддержки пространственных запросов, например, пересечение перекрестных полей и т. Д.).

Попав объект с населенной геометрией вы можете легко преобразовать это GeoJSON с Джексоном на ваших конечных точек, включая конвертеры для типов JTS в вашей сборке, например https://github.com/bedatadriven/jackson-datatype-jts:

<dependency> 
    <groupId>com.bedatadriven</groupId> 
    <artifactId>jackson-datatype-jts</artifactId> 
    <version>2.2</version> 
</dependency> 

, а затем добавить его в Джексон ObjectMappers созданного Spring путем создания подходящого боба в одном из ваших классов конфигурации приложений, например:

@Bean 
    public Jackson2ObjectMapperBuilder objectMapperBuilder() { 
      Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder(); 
      builder.modulesToInstall(new JtsModule()); 
      return builder; 
    } 

Вам может понадобиться больше конфигурации Джексон, чем это для других вещей (обработки пустой, отступы и т. д.), но это хорошее начало.

Теперь, когда вы возвращаете геометрию JTS на объект из ваших контроллеров Spring MVC, они автоматически преобразуются в геометрию GeoJSON. Вам придется либо реплицировать структуры GeoJSON Feature/FeatureCollection как классы, если вы хотите их использовать, или вернуть что-то (например, ваше Entity), которое может быть легко отображено в JavaScript в такой структуре.