簡體   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