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 데이터를 테이블 테스트 테이블에 삽입하고 싶습니다.

어떻게하면 되나요?

postgis 버전 2.1.3과 함께 postgres 버전 9.3.5를 사용하고 있습니다.


예를 들어 점 또는 다각형과 같은 단일 기능을 저장하는 방법에 대한 이전 질문과 관련이 있습니다. 내 질문은 GeoJSON 파일에 여러 기능을 저장하는 방법을 묻습니다. 여러 피처는 하나의 파일에 점, 선 및 다각형 피처 유형이 혼합되어 있음을 의미합니다.



안녕하세요 Ricardo, 나는 그 질문을 보았지만 내 문제를 다루지 않습니다. 단일 기능 유형이 아닌 기능 목록을 저장하고 싶습니다. 내 질문에서 내 GeoJSON 기능 모음을 살펴보십시오.
Jay

@Jay 그래서 지금 중 질문은 어떻게 하나의 기능으로 geojson 수집을 중단하거나 자세한 내용은 추가해야합니까 "입니다 (그 형상은 수집의 어떤 종류에 속하는지 아니면 정보를 저장?)
자쿱 카 니아

1
귀하의 답변에 감사합니다. GIS와 GeoJSON을 처음 사용했기 때문에 문제에 대한 조언을 원했습니다. 질문의 배경 : 사용자가지도에 지형지 물을 그리고 그려진 지형지 물 모음을 캡처합니다. 이 컬렉션을 고유 ID로 DB에 저장하고 싶습니다. 나중에 저장된 데이터를 제공된 ID로 가져올 수 있습니다. postgres에서 테스트 할 수있는 열은 2 개입니다. ID를 보유하기 위해 직렬 유형 인 gid 열과 기하학 유형 인 geom 열입니다.
Jay

1
@Jay 예, JSON을 저장할 수 있지만 지오메트리가 아니므로 가장 가까운 이웃을 쉽게 쿼리 할 수 ​​있습니다.
Jakub Kania

답변:


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;

세 가지 형상을 찾습니다. geom열은 기하학 오브젝트를 가지고 있으며,이 gid기능 번호입니다. 이 ST_AsText함수는 각 지오메트리에 해당 하는 WKT를 보여줍니다 . 또한 properties사양에 표시된대로 각 형상에 대해 정의 할 수있는 또는 속성 도 포함했습니다 .

 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.