GeoJSONポリゴンをPostGISテーブルに挿入する方法は?


33

GeoJSONからPostGISテーブルにポリゴンを挿入する必要があります。これは、SQLクエリがどのように見えるかです。

INSERT INTO tablename (name, polygon)
VALUES (
    'Name',
    ST_GeomFromGeoJSON(
        '{
            "type": "Polygon",
            "coordinates": [
                [7.734375,51.835777520452],
                [3.8671875,48.341646172375],
                [7.20703125,43.580390855608],
                [18.6328125,43.834526782237],
                [17.9296875,50.289339253292],
                [13.7109375,54.059387886624],
                [7.734375,51.835777520452]
            ]
        }'
    )
)

残念ながら、エラーメッセージが表示されます。

ERROR:  Geometry SRID (0) does not match column SRID (3857)

GeoJSONはすでに正しい参照システムにあります。しかし、これは指定されていません。GeoJSONでSRIDを指定するにはどうすればよいですか?GeoJSONはどのように見える必要がありますか?

更新:で作成されたジオメトリをラップするST_GeomFromGeoJSONST_SetSRID(..., 3857)、別のエラーがスローされます。私の見解では、ジオメトリにZ次元があるとは思えません。

ERROR:  Geometry has Z dimension but column does not

私はあなたがテーブルにSRIDがあることを指定する必要があると思う:4326、それはあなたのテーブルにSRIDがあることになります:3857のが、あなたにGeoJSONが長い/緯度があります(すなわちSRID 4326またはWGS84。)
Geryの

3857を使用します。GeoJSONはどのように見える必要がありますか?
ダニジャー

回答:


32

PostGISのソースコードを見てみると、SRIDをどのように解析するかがわかりました。GeoJSONでSRIDを指定する正しい方法を次に示します。

GeoJSON仕様では、ポリゴンの座標は線ストリングの配列であるとされています。したがって、追加のブラケットでそれらをラップする必要がありました。

{
    "type":"Polygon",
    "coordinates":
    [
        [
            [-91.23046875,45.460130637921],
            [-79.8046875,49.837982453085],
            [-69.08203125,43.452918893555],
            [-88.2421875,32.694865977875],
            [-91.23046875,45.460130637921]
        ]
    ],
    "crs":{"type":"name","properties":{"name":"EPSG:3857"}}
}

16

JSONにはいくつかの問題があります。

  1. まず、座標は配列の配列でなければなりません。
  2. 次に、座標を見ると、値は地理座標系(ほとんどの場合EPSG:4326)でLatlongであるように見えます。次に、それをEPSG:3857に変換する必要があります。

これら2つのことを修正したら、次のSQLクエリを使用して行を挿入できます。

INSERT INTO "Parcels"("Name", the_geom)
    VALUES ('Corrected_Shape', 
    ST_TRANSFORM(ST_GeomFromGeoJSON('{
    "type":"Polygon",
    "coordinates":[[
        [-91.23046875,45.460130637921],
        [-79.8046875,49.837982453085],
        [-69.08203125,43.452918893555],
        [-88.2421875,32.694865977875],
        [-91.23046875,45.460130637921]
    ]],
    "crs":{"type":"name","properties":{"name":"EPSG:4326"}}
}'),3857));

これが機能しない場合(つまり、Z diemsnionで引き続きエラーが発生する場合)、質問をPostGisバージョンで更新し、テーブルのステートメントを作成してください。


座標がEPSG:3857にないのはなぜだと思いますか?
ダニジャー

3
EPSG:3857の単位は(擬似)メートルであり、起源は大西洋にあるためです。メートルで10進数の6桁の精度は得られず、このデータはアフリカ沿岸近くの大西洋にあります。
Devdatta Tengshe

座標はマップ上の入力からのものであり、小数が多く含まれています。テストのために、アフリカの近くの大西洋の領域を描きました。しかし、あなたのおかげで、地図を改善して座標をメートル単位に丸めることができます。
ダニジャー

@danijar:それなら大丈夫です。これらの座標がEPSG:4326にある場合、米国の東部州の上にあります。
Devdatta Tengshe

5

geojsonは代わりにUTM値を持っている必要があります。Projまたは他のオンラインツールでそれを変換できますが、テーブルに挿入する前にpostgisで簡単かつ直接行うことができます。

SELECT ST_AsText(ST_Transform(ST_GeomFromGeoJSON
    (
        {
            "type":"Polygon",
            "coordinates":[
                [7.734375,51.835777520452],
                [3.8671875,48.341646172375],
                [7.20703125,43.580390855608],
                [18.6328125,43.834526782237],
                [17.9296875,50.289339253292],
                [13.7109375,54.059387886624],
                [7.734375,51.835777520452]
            ]
        }
    ),4326),3857));

それでは、SRIDを4326から3857に変換することをお勧めしますか?次に、ST_Transform(ST_SetSRID(...、4326)、3857)を直接試すことができますか?なぜこの追加の変換ステップが必要なのでしょうか?
ダニジャー

私は、あなたがであることを示唆おそらく何か、求めているかをテストすべきだと思うだけで、あなたが得たものを、必要なステップにそれを試してみて、ポスト
Geryの

これは私が得るものです。ERROR: transform: couldn't project point (9.25253e-302 6.08985e+159 1.18576e-322): latitude or longitude exceeded limits (-14)
ダニジャー

3
INSERT INTO tablename (name, polygon)
VALUES
(
    'Name',
    ST_GeomFromGeoJSON
    (
        '{
            "type":"Polygon",
            "coordinates":[
                [7.734375,51.835777520452],
                [3.8671875,48.341646172375],
                [7.20703125,43.580390855608],
                [18.6328125,43.834526782237],
                [17.9296875,50.289339253292],
                [13.7109375,54.059387886624],
                [7.734375,51.835777520452]
            ]
        }'
    )
)

「 '」がありません


4
あなたはこの答えに多くのコンテキストを追加し、それはOPの質問に答えると、既存の回答は異なっているどのように説明できる
Devdatta Tengshe

正直なところ、JSON 文字列である必要があり、質問の文字列ではなく、少なくとも1つの回答の文字列ではありません。この答えは明白なことを指摘するかもしれませんが、それは誰にとっても必ずしも明白ではないので、いくらかの名誉に値します。
フォーブスミスター
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.