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

How to convert data from PostGIS database into GeoJSON in Java

本文关键字:数据 转换 GeoJSON 数据库 Java 中将 PostGIS      更新时间:2023-09-26

我有一个PostgreSQL/PostGIS数据库,我想把我的数据表从数据库转换成GeoJSON格式。

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

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

https://postgis.net/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。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中映射到这样的结构。