กำลังจัดเก็บ GeoJSON FeatureCollection ไปยัง PostgreSQL ด้วย PostGIS


21

ฉันใหม่สำหรับ GeoJSON ฉันมีชุดคุณสมบัติ GeoJSON ตามที่แสดงและต้องการเก็บไว้ในตาราง postgres (testtable) ตาราง postgres ของฉันมีซีเรียลนัมเบอร์และคอลัมน์รูปทรงเรขาคณิต

{
    "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 ลงในตารางทดสอบ

ฉันจะไปเกี่ยวกับมันได้อย่างไร

ฉันใช้ postgres รุ่น 9.3.5 กับ postgis เวอร์ชัน 2.1.3


ฉันถูกนำไปยังคำถามที่ถามก่อนหน้านี้ซึ่งตอบวิธีเก็บคุณสมบัติเดียวเช่นจุดหรือรูปหลายเหลี่ยม คำถามของฉันถามวิธีการบันทึกคุณสมบัติหลายอย่างในไฟล์ GeoJSON ฉันหมายถึงการผสมผสานของจุดเส้นและรูปหลายเหลี่ยมในหนึ่งไฟล์


มีความเป็นไปได้ที่ซ้ำกันของวิธีแทรกรูปหลายเหลี่ยม GeoJSON ในตาราง PostGIS
Ricardo Oliveira

สวัสดี Ricardo ฉันเห็นคำถามนั้นแล้ว แต่ไม่ได้แก้ปัญหาของฉัน ฉันต้องการบันทึกรายการคุณสมบัติไม่ใช่เพียงคุณสมบัติประเภทเดียว โปรดดูที่ชุดคุณลักษณะ GeoJSON ของฉันในคำถามของฉัน
Jay

@Jay ดังนั้นตอนนี้คำถามของคุณคือ "ฉันจะแยกคอลเลคชั่น geojson ออกเป็นฟีเจอร์เดียวหรือคุณต้องการเพิ่มข้อมูลเพิ่มเติม (อาจจะเก็บข้อมูลที่รูปทรงเรขาคณิตเหล่านั้นเป็นของคอลเลกชันบางประเภท)
Jakub Kania

1
ขอบคุณ @John สำหรับคำตอบของคุณ เนื่องจากฉันใหม่กับ GIS และ GeoJSON ฉันต้องการตัวชี้บางอย่างสำหรับปัญหาของฉัน พื้นหลังของคำถาม: ผู้ใช้ดึงคุณสมบัติบนแผนที่และฉันจับคอลเลกชันของคุณสมบัติที่วาด ฉันต้องการบันทึกคอลเลกชันนี้ใน DB ด้วยรหัสเฉพาะ ต่อมาสามารถดึงข้อมูลที่บันทึกไว้สำหรับรหัสที่ให้มา ทดสอบได้ใน postgres มี 2 คอลัมน์ คอลัมน์ gid ที่เป็นประเภทอนุกรมเพื่อเก็บ id และคอลัมน์ geom ที่เป็นประเภทรูปทรงเรขาคณิต
Jay

1
@Jay ใช่คุณสามารถจัดเก็บ JSON แต่แล้วมันจะไม่เป็นรูปทรงเรขาคณิตดังนั้นคุณจะสามารถ 'ค้นหาเพื่อนบ้านที่ใกล้ที่สุดได้อย่างง่ายดาย ฯลฯ
Jakub Kania

คำตอบ:


26

สมมติว่าคุณมีอย่างน้อย PostgreSQL รุ่น 9.3 คุณสามารถใช้ไม่กี่ฟังก์ชั่น JSON และผู้ประกอบการที่จะดึงส่วนที่เกี่ยวข้องของสเป GeoJSONจำเป็นโดยST_GeomFromGeoJSONในการสร้างรูปทรงเรขาคณิต

ลองต่อไปนี้ซึ่งคุณสามารถแทนที่ 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)

คุณควรกำหนด SRID สำหรับรูปทรงเรขาคณิตโดยใช้ ST_SetSRID

หรือถ้าคุณต้องการ 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)))

ดูสิ่งนี้ด้วย การสร้างการรวบรวมคุณลักษณะ GeoJSON ด้วยฟังก์ชัน JSON และ PostGISจาก Postgres OnLine Journal ซึ่งทำหน้าที่ตรงกันข้าม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.