PostGISを使用してGeoJSON FeatureCollectionをPostgreSQLに保存しますか?


21

GeoJSONは初めてです。示されているGeoJSON機能コレクションがあり、それをpostgresテーブル(testtable)に保存したいと思います。私のpostgresテーブルには、シリアルIDとジオメトリ列があります。

{
    "type": "FeatureCollection",
    "features": [
        {
            "type": "Feature",
            "geometry": {
                "type": "Point",
                "coordinates": [
                    2565453.1826721914,
                    -3835048.659760314
                ]
            }
        },
        {
            "type": "Feature",
            "geometry": {
                "type": "LineString",
                "coordinates": [
                    [
                        2727584.7219710173,
                        -3713449.1942418693
                    ],
                    [
                        2732476.691781269,
                        -3992291.473426192
                    ]
                ]
            }
        },
        {
            "type": "Feature",
            "geometry": {
                "type": "Polygon",
                "coordinates": [
                    [
                        [
                            2442627.9025405287,
                            -3705499.954308534
                        ],
                        [
                            2425506.008204649,
                            -3886502.837287831
                        ],
                        [
                            2425506.008204649,
                            -3886502.837287831
                        ],
                        [
                            2555143.2081763083,
                            -3910962.686339088
                        ],
                        [
                            2442627.9025405287,
                            -3705499.954308534
                        ]
                    ]
                ]
            }
        }
    ]
}

GeoJSONデータをテーブルtesttableに挿入したいと思います。

どうすればいいですか?

postgresバージョン9.3.5とpostgisバージョン2.1.3を使用しています


ポイントやポリゴンなどの単一のフィーチャを保存する方法に答える、以前に尋ねられた質問に導かれました。私の質問は、GeoJSONファイルに複数の機能を保存する方法を尋ねます。複数のフィーチャとは、1つのファイルにポイント、ライン、ポリゴンフィーチャタイプが混在していることを意味します。



こんにちはリカルド、私はその質問を見ましたが、それは私の問題に対処しません。単一の機能タイプではなく、機能のリストを保存したい。質問にあるGeoJSON機能のコレクションをご覧ください。
ジェイ

@Jayだから今、あなたの質問は、「geojsonコレクションを単一の機能に分割する方法、またはより多くの情報を追加する必要がある(これらのジオメトリが何らかのコレクションに属する情報を保存する必要がある)」
Jakub Kania

1
ご回答ありがとうございます。私はGISとGeoJSONを初めて使用するので、手元にある私の問題に関するいくつかの指針が必要でした。質問の背景:ユーザーがマップ上にフィーチャを描画し、描画されたフィーチャのコレクションをキャプチャします。このコレクションを一意のIDでDBに保存したいと思います。後で、保存されたデータを指定されたIDで取得できます。postgresのテスト可能ファイルには2つの列があります。IDを保持するためのシリアルタイプのgid列、およびジオメトリタイプのgeom列。
ジェイ

1
@Jayはい、JSONを保存できますが、ジオメトリではないため、最も近い隣人を簡単に照会できます。
ヤクブカニア

回答:


26

少なくともPostgreSQLバージョン9.3がある場合、いくつかのJSON関数と演算子を使用して、ST_GeomFromGeoJSONで必要なGeoJSON仕様の関連部分を抽出して、ジオメトリを作成できます。

以下を試してください。上部のJSONを置き換えることができます。

WITH data AS (SELECT '{ "type": "FeatureCollection",
    "features": [
      { "type": "Feature",
        "geometry": {"type": "Point", "coordinates": [102.0, 0.5]},
        "properties": {"prop0": "value0"}
        },
      { "type": "Feature",
        "geometry": {
          "type": "LineString",
          "coordinates": [
            [102.0, 0.0], [103.0, 1.0], [104.0, 0.0], [105.0, 1.0]
            ]
          },
        "properties": {
          "prop0": "value0",
          "prop1": 0.0
          }
        },
      { "type": "Feature",
         "geometry": {
           "type": "Polygon",
           "coordinates": [
             [ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0],
               [100.0, 1.0], [100.0, 0.0] ]
             ]
         },
         "properties": {
           "prop0": "value0",
           "prop1": {"this": "that"}
           }
         }
       ]
     }'::json AS fc)

SELECT
  row_number() OVER () AS gid,
  ST_AsText(ST_GeomFromGeoJSON(feat->>'geometry')) AS geom,
  feat->'properties' AS properties
FROM (
  SELECT json_array_elements(fc->'features') AS feat
  FROM data
) AS f;

3つのジオメトリを検索します。geom列には、ジオメトリオブジェクトを持っており、gid機能番号です。このST_AsText関数は、各ジオメトリに相当するWKTを表示します。またproperties、仕様に示されているように、各ジオメトリに定義できるor属性を含めました。

 gid |                   geom                   |              properties
-----+------------------------------------------+--------------------------------------
   1 | POINT(102 0.5)                           | {"prop0": "value0"}
   2 | LINESTRING(102 0,103 1,104 0,105 1)      | {                                   +
     |                                          |           "prop0": "value0",        +
     |                                          |           "prop1": 0.0              +
     |                                          |           }
   3 | POLYGON((100 0,101 0,101 1,100 1,100 0)) | {                                   +
     |                                          |            "prop0": "value0",       +
     |                                          |            "prop1": {"this": "that"}+
     |                                          |            }
(3 rows)

ST_SetSRIDを使用して、ジオメトリにSRIDを割り当てる必要があります。

または、単一の異種GEOMETRYCOLLECTIONが必要な場合は、次のようにコンパクトにできます。

SELECT ST_AsText(ST_Collect(ST_GeomFromGeoJSON(feat->>'geometry')))
FROM (
  SELECT json_array_elements('{ ... put JSON here ... }'::json->'features') AS feat
) AS f;

GEOMETRYCOLLECTION(POINT(2565453.18267219 -3835048.65976031),LINESTRING(2727584.72197102 -3713449.19424187,2732476.69178127 -3992291.47342619),POLYGON((2442627.90254053 -3705499.95430853,2425506.00820465 -3886502.83728783,2555143.20817631 -3910962.68633909,2442627.90254053 -3705499.95430853)))

Postgres OnLine JournalのJSONおよびPostGIS関数を使用したGeoJSON機能コレクションの作成も参照してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.