繁体   English   中英

如何在 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() 这是它的文档链接。

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 给出了一个很好的例子, 这里有自定义属性/列选择,大致如下:

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 使用的扩展众所周知的二进制 (EWKB) 紧凑。 这也意味着您无法在 MVC 控制器中使用几何体做任何有用的事情,除非将其反序列化为 JTS 几何体之类的东西。

一个更丰富、可能更快(如果涉及网络)的解决方案是为您的 JPA 提供者使用空间扩展(例如,Hibernate 在第 5 版中支持开箱即用,并且在第 4 版中有 Hibernate-Spatial)来拉几何直接作为 JTS(或类似)几何图形进入您的实体。 大多数实现将使用 WKB(众所周知的二进制)作为在线上的紧凑表示,然后反序列化为适当的 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 类型的转换器,轻松将其转换为端点上的带有 Jackson 的 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;
    }

对于其他事情(空处理、缩进等),您可能需要比这更多的 Jackson 配置,但这是一个好的开始。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM