如何在Java中将PostGIS数据库中的数据转换为GeoJSON
How to convert data from PostGIS database into GeoJSON in Java
我有一个PostgreSQL/PostGIS数据库,我想把我的数据表从数据库转换成GeoJSON格式。
我的目的是使用这个GeoJSON创建一个地图与JavaScript。我在Spring MVC中使用Java和JDBC。转换数据的最佳方式是什么?
这可以在从数据库中提取数据的查询中完成。可以使用postgis的ST_AsGeoJSON()
函数。这里是它的文档链接。
需要注意的一点是,ST_AsGeoJSON()
的结果只返回数据的几何部分。如果你需要得到一个geojson特征,那么你必须创建特征对象,并将几何图形添加到其中。
使用ST_AsGeoJSON()
时,您应该期望的结果的一个示例是{"type": "Point", "coordinates": [12, 15]}
。
如果你想在几何对象之外创建一个特征,它看起来像{"type": "Feature", "properties": {}, "geometry": {"type": "Point", "coordinates": [12, 15]}}
。
ogr2ogr是你的朋友。Steve Bennett给出了一个极好的自定义属性/列选择示例,如下所示:
ogr2ogr -f GeoJSON out。PG:host=localhost dbname=mydb user=myuser . jsonpassword=mypw" -sql "SELECT column1, column2, column3 FROM mytable"
最明显的答案是使用ST_AsGeoJSON将几何图形转换为数据库中的字符串。然而,这会将一些应用程序逻辑推到数据库中,也许更重要的是,它会导致更多的数据通过网络传输,因为GeoJSON文本表示远不如Postgres使用的扩展的众所周知的二进制(EWKB)紧凑。这也意味着,如果不将其反序列化回JTS几何结构,您就无法在MVC控制器中使用几何结构做任何有用的事情。
一个更丰富、可能更快(如果涉及到网络)的解决方案是为JPA提供程序使用空间扩展(例如Hibernate在版本5中支持这个,并且在版本4中有Hibernate- spatial),将几何图形直接作为JTS(或类似的)几何图形拉到实体中。大多数实现将使用WKB(众所周知的二进制)作为在线上的紧凑表示,然后反序列化为适当的Java类型,而不是将每个64位(8字节)二进制双精度转换为一些巨大的结构!使用Hibernate可以做以下事情(根据SRID和几何类型等的需要调整定义):
@Column(columnDefinition = "geometry(MultiPolygon,4326)")
private Geometry geom;
然后告诉Spring您在应用程序中使用PostGIS方言。属性(或其他配置源):
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>
,然后通过在应用程序配置类中创建合适的bean,将其添加到Spring创建的Jackson objectmap中,例如:
@Bean
public Jackson2ObjectMapperBuilder objectMapperBuilder() {
Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
builder.modulesToInstall(new JtsModule());
return builder;
}
您可能需要更多的Jackson配置来处理其他事情(null处理,缩进等),但这是一个好的开始。
现在,当您从Spring MVC控制器返回对象的JTS几何形状时,它们将自动转换为GeoJSON几何形状。如果你想使用这些,你将不得不复制GeoJSON特征/特征回忆结构作为类,或者返回一些东西(例如你的实体),可以很容易地在JavaScript中映射到这样的结构。
- 将json回调数据转换为日期
- 如何通过数据分组将json数据转换为嵌套的json数据格式
- 如何将JSON数据转换为变量,解析并输出为HTML
- 如何将 Oracle 数据转换为 JSON,然后在 JavaScript 中使用
- D3:使用 nest 函数将带有父键的平面数据转换为层次结构
- 我需要帮助在 javascript 中将 JSON 数据转换为 3 级多维数组
- 将 XML 数据转换为 json 格式 AngularJS
- 将数据转换为类似于JSON的字符串
- 使用Jquery将Ajax jsonp数据转换为数组
- 将数据库中的数据转换为可下载的PDF文件
- 将image src数据:转换为Uint8Array
- JSON数据转换为表单字段
- 我正在尝试创建一个带有数据转换的按钮,但不起作用
- 将普通数据转换为xml数据的图像滑块
- 如何将人类可读的数据转换为时间戳(使用JS)
- 使用.HTML()将JSON数据转换为HTML
- 将表单元格数据转换为单独.js文件中的内部链接
- 如何将数组数据转换为对象数组
- XML 数据转换为 PHP 或 JS
- 将 SharePoint 列表数据转换为 HTML