2016-11-10 45 views
4

我有PostgreSQL/PostGIS数据库,我想将我的数据表从数据库转换为GeoJSON格式。如何将PostGIS数据库中的数据转换为Java中的GeoJSON

我的目的是使用这个GeoJSON创建一个JavaScript的地图。我在Spring MVC中使用Java和JDBC。转换数据的最佳方式是什么?

+1

您可以在Postgis中创建Geojson。请参阅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:主机=本地主机DBNAME = mydb的用户=为myuser 密码= mypw” -sql“SELECT column1,column2,column3 FROM mytable”

0

最明显的答案是使用ST_AsGeoJSON将几何转换为数据库中的字符串。然而,这会将一些应用程序逻辑推入数据库,可能更重要的是,它会通过网络传输更多的数据,因为GeoJSON文本表示比Postgres使用的扩展的已知二进制文件(EWKB)要小得多。这也意味着您无法在您的MVC控制器中使用几何体进行任何有用的操作,而无需将其反序列化回JTS几何体。

更丰富且可能更快(如果涉及到网络),解决方案是为您的JPA提供程序使用空间扩展(例如,Hibernate在第5版中支持此开箱即用,并且在第4版中使用了Hibernate-Spatial)将几何体作为JTS(或类似的)几何体直接拖入实体中。大多数实现将使用WKB(已知二进制)作为紧密表示,然后将其反序列化为适当的Java类型,而不是将每个64位(8字节)二进制转换为一个巨大的结构!与Hibernate一个可以做以下(按要求SRID和几何类型等调整定义):

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

然后告诉您正在使用在application.properties的PostGIS的方言(或其他配置源)春节:

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

您的Spring数据存储库现在将返回具有几何的实体(也可以在存储库接口方法上编写JPQL查询以支持空间查询,例如边界框相交等)。

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

,然后将其添加到:

了具有通过包括为JTS类型在构建器,如https://github.com/bedatadriven/jackson-datatype-jts得到了与填充的几何实体可以与杰克逊在你的终端很容易地将它转换为以GeoJSON杰克逊ObjectMappers由Spring在应用程序中配置类的一个创造一个合适的bean创建,如:

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

您可能需要杰克逊的比这其他的东西更多的配置(空处理,缩进等),但这是一个好的开始。

现在,当您从Spring MVC控制器返回对象的JTS几何体时,它们将自动转换为GeoJSON几何体。如果您想使用这些结构,您必须复制GeoJSON Feature/FeatureCollection结构作为类,或者将可以轻松映射到JavaScript的某些内容(例如您的实体)返回到这种结构中。

相关问题