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

How to convert data from PostGIS database into GeoJSON in Java

我有一个 PostgreSQL/PostGIS 数据库,我想将我的数据 table 从数据库转换为 GeoJSON 格式。

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

这可以在从数据库中提取数据的查询中完成。您可以使用 postgis 函数 ST_AsGeoJSON()。这是它的文档 link。

https://postgis.net/docs/ST_AsGeoJSON.html

需要注意的一件事是 ST_AsGeoJSON() 的结果仅 returns 数据的几何部分。如果需要获取 geojson 特征,则必须创建特征对象并将几何添加到其中。

使用 ST_AsGeoJSON() 时预期的结果示例为 {"type": "Point", "coordinates": [12, 15]}

如果你想从几何对象中创建一个特征,它看起来像 {"type": "Feature", "properties": {}, "geometry": {"type": "Point", "coordinates": [12, 15]}}

ogr2ogr 是你的朋友。 Steve Bennett 给出了一个很好的示例,其中包含自定义 properties/columns 选择 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) 紧凑。这也意味着如果不将几何体反序列化回 JTS 几何体之类的东西,您将无法在 MVC 控制器中使用该几何体做任何有用的事情。

更丰富、可能更快(如果涉及网络)的解决方案是为您的 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 数据存储库现在将 return 具有几何图形的实体(也可以在存储库接口方法上编写 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 配置,但这是一个好的开始。

现在,当您 return 来自 Spring MVC 控制器的对象上的 JTS 几何图形时,它们将自动转换为 GeoJSON 几何图形。如果你想使用它们,你将不得不复制 GeoJSON Feature / FeatureCollection 结构作为 类,或者 return 可以在 JavaScript 中轻松映射到这样的东西(例如你的实体)一个结构。