Name

ST_AsGeoJSON — GeoJSON形式のジオメトリまたは地物を返します。

Synopsis

text ST_AsGeoJSON(record feature, text geom_column="", integer maxdecimaldigits=9, boolean pretty_bool=false, text id_column='');

text ST_AsGeoJSON(geometry geom, integer maxdecimaldigits=9, integer options=8);

text ST_AsGeoJSON(geography geog, integer maxdecimaldigits=9, integer options=0);

説明

ジオメトリについてはGeoJSONの"geometry"オブジェクトとして返し、行についてGeoJSONの"feature"オブジェクトとして返します。

GeoJSONのジオメトリと地物の表現は、GeoJSON specifications RFC 7946に準拠しますが、入力ジオメトリのCRSががWGS84経度緯度 (EPSG:4326, urn:ogc:def:crs:OGC::CRS84)以外の時は準拠しません。GeoJSONのgeometryオブジェクトに短いCRS SRID識別子がデフォルトで追加されます。2次元と3次元のジオメトリの両方に対応します。GeoJSONはSFS 1.1ジオメトリタイプにのみ対応します (たとえば曲線には対応していません)。

geom_columnパラメータは複数のジオメトリカラムを区別するために使われます。省略すると、レコードの最初のジオメトリカラムに決定されます。逆にパラメータを渡すとカラムの型の調査が省かれます。

maxdecimaldigits引数は、出力で使用される小数部の桁数の最大値を減らすために使われます (デフォルトでは9)。EPSG:4326を使っていて、表示専用でジオメトリを出力する場合には、maxdecimaldigits=6が、多くの地図で良い選択となります。

[Warning]

任意引数maxdecimaldigitsを使用することで、出力ジオメトリが不正になる可能性があります。これを回避するには、前もってST_ReducePrecisionに適切なグリッドサイズを与えてこれを使用します。

options引数は、GeoJSON出力でBBOXまたはCRSを追加するために使われます。次のようにします。

  • 0: オプションなし

  • 1: GeoJSON BBOX

  • 2: GeoJSON Short CRS (たとえば EPSG:4326)

  • 4: GeoJSON Long CRS (たとえば urn:ogc:def:crs:EPSG:4326)

  • 8: EPSG:4326でない場合にGeoJSON Short CRS (デフォルト)

id_columnパラメータは、返されるGeoJSONの地物の"id"メンバの値設定に使われます。GeoJSON RFCによると、これは、主キーのように地物が共通して使用する識別子を持つときは常に*使うべき*とされています。指定しない場合には、生成される地物に"id"メンバが入りません。ジオメトリ以外のカラムは、潜在的なキーも含めて、地物の"properties"メンバ内に入ります。

GeoJSON仕様では、ポリゴンは右手規則を使い、この方向を求めるクライアントがあります。これはST_ForcePolygonCCW を使用して確実に対応します。仕様はまたジオメトリの座標系としてWGS84 (SRID=4326)が求められます。必要ならST_TransformST_Transform( geom, 4326 )のように使って、ジオメトリをWGS84に座標変換します。

GeoJSONはgeojson.iogeojsonlint.comで、オンラインでのテストと表示が可能です。また、Webマッピングフレームワークで広く対応されています。

Availability: 1.3.4

Availability: 1.5.0 ジオグラフィが導入されました。

Changed: 2.0.0 デフォルト引数と名前付き引数に対応しました。

Changed: 3.0.0 レコードの入力に対応しました

Changed: 3.0.0 EPSG:4326以外の場合のSRID出力。

Changed: 3.5.0 地物のidを含むカラムを指定できるようになりました

この関数は3次元に対応し、Z値を削除しません。

FeatureCollectionの生成:

SELECT json_build_object(
    'type', 'FeatureCollection',
    'features', json_agg(ST_AsGeoJSON(t.*, id_column =
> 'id')::json)
    )
FROM ( VALUES (1, 'one', 'POINT(1 1)'::geometry),
              (2, 'two', 'POINT(2 2)'),
              (3, 'three', 'POINT(3 3)')
     ) as t(id, name, geom);
{"type" : "FeatureCollection", "features" : [{"type": "Feature", "geometry": {"type":"Point","coordinates":[1,1]}, "id": 1, "properties": {"name": "one"}}, {"type": "Feature", "geometry": {"type":"Point","coordinates":[2,2]}, "id": 2, "properties": {"name": "two"}}, {"type": "Feature", "geometry": {"type":"Point","coordinates":[3,3]}, "id": 3, "properties": {"name": "three"}}]}

Featureの生成:

SELECT ST_AsGeoJSON(t.*, id_column =
> 'id')
FROM (VALUES (1, 'one', 'POINT(1 1)'::geometry)) AS t(id, name, geom);
st_asgeojson
-----------------------------------------------------------------------------------------------------------------
 {"type": "Feature", "geometry": {"type":"Point","coordinates":[1,1]}, "id": 1, "properties": {"name": "one"}}

データをGeoJSON使用に準拠したWGS84経度緯度に変換するのを忘れないで下さい。

SELECT ST_AsGeoJSON(ST_Transform(geom,4326)) from fe_edges limit 1;
st_asgeojson
-----------------------------------------------------------------------------------------------------------

{"type":"MultiLineString","coordinates":[[[-89.734634999999997,31.492072000000000],
[-89.734955999999997,31.492237999999997]]]}

3次元ジオメトリへの対応:

SELECT ST_AsGeoJSON('LINESTRING(1 2 3, 4 5 6)');
{"type":"LineString","coordinates":[[1,2,3],[4,5,6]]}