如何将数据从PostGIS数据库转换为Java中的GeoJSON

时间:2016-11-10 01:44:58

标签: javascript json postgresql postgis geojson

我有一个PostgreSQL / PostGIS数据库,我希望将数据表从数据库转换为GeoJSON格式。

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

3 个答案:

答案 0 :(得分:3)

这可以在将数据从数据库中提取出来的查询中完成。您可以使用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]}}

答案 1 :(得分:0)

ogr2ogr是你的朋友。 Steve Bennett为自定义属性/列选择here提供了一个很好的例子,如下所示:

  

ogr2ogr -f GeoJSON out.json" PG:host = localhost dbname = mydb user = myuser   密码= mypw" -sql" SELECT column1,column2,column3 FROM mytable"

答案 2 :(得分:0)

最明显的答案是使用ST_AsGeoJSON将几何转换为数据库中的字符串。但是,这会将一些应用程序逻辑推送到数据库中,或许更重要的是,它会导致通过网络传输更多数据,因为GeoJSON文本表示远不如Postgres使用的扩展的Well Known Binary(EWKB)紧凑。这也意味着您无法在具有几何体的MVC控制器中执行任何有用的操作,而无需将其反序列化为类似JTS几何体的类型。

更丰富,可能更快(如果涉及到网络),解决方案是为JPA提供程序使用空间扩展(例如,Hibernate在版本5中支持这种开箱即用,并且版本4具有Hibernate-Spatial)将几何体作为JTS(或类似)几何体直接拉入实体。大多数实现将使用WKB(Well Known Binary)作为线上的紧凑表示,然后反序列化为适当的Java类型,而不是将每个64位(8字节)二进制双精度转换为一些巨大的结构!使用Hibernate,可以执行以下操作(根据SRID和几何类型等需要调整定义):

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

然后告诉Spring您在application.properties(或其他配置源)中使用PostGIS方言:

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

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

获得具有填充几何体的实体后,您可以通过在构建中包含JTS类型的转换器,轻松地将其转换为端点上的杰克逊GeoJSON,例如https://github.com/bedatadriven/jackson-datatype-jts

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

然后通过在一个应用程序配置类中创建一个合适的bean,将它添加到Spring创建的Jackson ObjectMappers中,例如:

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

对于其他事情(空处理,缩进等),你可能需要更多配置杰克逊,但这是一个良好的开端。

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