2016-11-10 32 views
4

私はPostgreSQL/PostGISデータベースを持っており、データテーブルをデータベースからGeoJSONフォーマットに変換したいと思います。PostGISデータベースのデータをJavaのGeoJSONに変換する方法

私の目的は、このGeoJSONをJavaScriptでマップを作成するために使用することです。 Spring MVCでJavaとJDBCを使用しています。データを変換する最良の方法は何ですか?

+1

PostgisでGeojsonを作成することができます。 http://postgis.net/docs/ST_AsGeoJSON.htmlを参照してください。またはhttp://gis.stackexchange.com/questions/142391/store-a-geojson-featurecollection-to-postgres-with-postgis – mlinth

答えて

4

これは、データベースからデータを取り出すクエリで実行できます。ポストギス機能ST_AsGeoJSON()を使用することができます。ここにはそのドキュメントへのリンクがあります。注意すべき

http://postgis.org/docs/ST_AsGeoJSON.html

ことの一つは、ST_AsGeoJSON()の結果は、データのみのジオメトリ部分を返すことです。ジオジソン機能を取得する必要がある場合は、フィーチャオブジェクトを作成し、それにジオメトリを追加する必要があります。

ST_AsGeoJSON()を使用するときに期待する結果の例は、{"type": "Point", "coordinates": [12, 15]}です。

ジオメトリオブジェクトからフィーチャを作成する場合は、{"type": "Feature", "properties": {}, "geometry": {"type": "Point", "coordinates": [12, 15]}}のようになります。

0

ogr2ogrはお友達です。スティーブ・ベネットは、本の線に沿って、カスタムプロパティ/カラム選択hereと優れた例を示します:

ogr2ogr -fにGeoJSON out.json "PG:ホスト= localhostをdbnameに= mydbというユーザー= myuserの パスワード= mypw" -sql "SELECT column1、column2、column3 from mytable"

0

もっとも明らかな答えは、ST_AsGeoJSONを使用してジオメトリをデータベース上の文字列に変換することです。しかし、これはアプリケーションロジックをデータベースにプッシュし、さらに重要なことに、GeoJSONテキスト表現は、Postgresが使用する拡張Well Known Binary(EWKB)よりはるかにコンパクトであるため、ネットワークを介して転送されるデータ量がはるかに大きくなります。また、JTSジオメトリのようなものにデシリアライズせずに、ジオメトリを持つMVCコントローラで有用なことを行うことができないことを意味します。

JPAプロバイダのために空間的な拡張機能を使用する方法がより洗練され、潜在的に高速です(例えば、Hibernateはバージョン5でこれをサポートし、バージョン4ではHibernate-Spatialを使用しました)ジオメトリをJTS(または同様の)ジオメトリとしてエンティティに直接プルすることができます。ほとんどの実装では、WKB(Well Known Binary)をワイヤー上のコンパクトな表現として使用し、64ビット(8バイト)のバイナリ・ダブルをいくつかの巨大な構造に変換するのではなく、適切なJavaタイプにデシリアライズします。

@Column(columnDefinition = "geometry(MultiPolygon,4326)") 
private Geometry geom; 

次にあなたがapplication.propertiesでPostGISの方言(または他の設定ソース)を使用している春を告げる:

Hibernateで一つは(SRIDとジオメトリタイプなどに必要とされるような定義を調整する)は、次の操作を行うことができます
spring.jpa.database-platform=org.hibernate.spatial.dialect.postgis.PostgisDialect 

Springデータリポジトリは、ジオメトリを持つエンティティを返すようになりました(リポジトリインタフェースメソッドで、バウンディングボックスの交差などの空間クエリをサポートするためにも可能です)。

<dependency> 
    <groupId>com.bedatadriven</groupId> 
    <artifactId>jackson-datatype-jts</artifactId> 
    <version>2.2</version> 
</dependency> 

、その後に追加:

はあなたのビルドでJTSタイプのためのコンバータ、例えばhttps://github.com/bedatadriven/jackson-datatype-jtsを含むことにより、簡単にあなたのエンドポイントにジャクソンとにGeoJSONにこれを変換することができます人口のジオメトリを持つエンティティを得ましたアプリケーション・コンフィギュレーション・クラスのいずれかに適したBeanを作成することによって、春が作成したジャクソンObjectMappers、例えば:あなたはより多くの他のもののために、これよりもジャクソンの設定(NULL処理が必要になる場合があり

@Bean 
    public Jackson2ObjectMapperBuilder objectMapperBuilder() { 
      Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder(); 
      builder.modulesToInstall(new JtsModule()); 
      return builder; 
    } 

、インデントなど)、それは良いスタートです。

Spring MVCコントローラからオブジェクトにJTSジオメトリを返すと、自動的にGeoJSONジオメトリに変換されます。 GeoJSON Feature/FeatureCollection構造体をクラスとして複製するか、JavaScriptでそのような構造体に簡単にマッピングできるもの(例えばEntity)を返す必要があります。

関連する問題