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은 어떻게 생겼습니까?
danijar

답변:


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. 둘째, 좌표를 살펴보면 지리적 좌표계에서 값이 Latlong 인 것처럼 보이며 EPSG : 4326 일 가능성이 큽니다. 그런 다음 EPSG : 3857로 변환해야합니다.

이 두 가지를 수정하면 다음 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 버전 및 테이블의 Create Statement로 질문을 업데이트하십시오.


좌표가 EPSG : 3857이 아닌 것으로 생각하는 이유는 무엇입니까?
danijar

3
EPSG : 3857의 단위는 (의사) 미터이고 원점은 대서양에 있기 때문입니다. 미터로 소수점 이하 6 자리의 정확도를 얻지 못할 수 있으며이 데이터는 아프리카 해안 근처의 대서양에 있습니다.
Devdatta Tengshe 10

좌표는지도에서 입력 한 값이며 소수점이 많습니다. 테스트를 위해 아프리카 근처 대서양에 한 지역을 그렸습니다. 그러나 덕분에 좌표를 전체 미터로 반올림하기 위해지도를 개선 할 수 있습니다.
danijar

@ 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));

따라서 4326 이상의 SRID를 3857로 변환하는 것이 좋습니다. 그런 다음 ST_Transform (ST_SetSRID (..., 4326), 3857)을 직접 시도 할 수 없었습니다. 이 추가 변환 단계가 필요한 이유는 무엇입니까?
danijar

난 당신이 당신이 제안 아마 무엇을 요구하는지 테스트해야합니다 생각 만 가지고 무엇을, 당신이 필요로하는 단계를 시도하고 게시
GERY

이것이 내가 얻는 것입니다. ERROR: transform: couldn't project point (9.25253e-302 6.08985e+159 1.18576e-322): latitude or longitude exceeded limits (-14)
danijar

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의 질문에 어떻게 답변하는지, 기존 답변과 다른 점을
설명해 주시겠습니까?

솔직히 JSON 문자열이어야하며 질문의 문자열이 아니며 적어도 하나의 답변의 문자열이 아닙니다. 이 답변은 명백한 점을 지적 할 수 있지만 반드시 모든 사람에게 명백하지는 않으므로 약간의 크레딧이 필요합니다.
Forbesmyester
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.