我有一个PostgreSQL / PostGIS数据库,我想将我的数据表从数据库转换为GeoJSON格式。
我的目的是使用这个GeoJSON来创建一个带有JavaScript的地图。我在Spring MVC中使用Java和JDBC。转换数据的最佳方法是什么?
这可以在将数据从数据库中提取出来的查询中完成。你可以使用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]}}
。
ogr2ogr是你的朋友。 Steve Bennett为自定义属性/列选择here提供了一个很好的例子,其中包括:
ogr2ogr -f GeoJSON out.json“PG:host = localhost dbname = mydb user = myuser password = mypw”-sql“SELECT column1,column2,column3 FROM mytable”
最明显的答案是使用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类型的转换器(例如https://github.com/bedatadriven/jackson-datatype-jts)轻松地将其转换为端点上的杰克逊GeoJSON:
<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结构,则必须将GeoJSON Feature / FeatureCollection结构复制为类,或者将可以轻松映射到JavaScript中的某些内容(例如,您的实体)返回到此类结构中。