จะแทรกรูปหลายเหลี่ยม 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 อยู่ในระบบอ้างอิงที่ถูกต้องอยู่แล้ว แต่นี่ไม่ได้ระบุ ฉันจะระบุ SRID ใน GeoJSON ได้อย่างไร GeoJSON ต้องมีลักษณะอย่างไร

ปรับปรุง: เมื่อผมตัดรูปทรงเรขาคณิตที่สร้างขึ้นโดยST_GeomFromGeoJSONมีST_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 อย่างไร นี่เป็นวิธีที่ถูกต้องในการระบุ SRID ใน GeoJSON

ข้อกำหนด 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 Query ต่อไปนี้:

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
danijar

3
เนื่องจากหน่วยของ EPSG: 3857 เป็น (หลอก) เมตรและจุดกำเนิดอยู่ในมหาสมุทรแอตแลนติก คุณไม่มีความแม่นยำทศนิยม 6 หน่วยด้วยเมตรและข้อมูลนี้จะอยู่ในมหาสมุทรแอตแลนติกใกล้กับชายฝั่งแอฟริกา
Devdatta Tengshe

พิกัดมาจากอินพุตบนแผนที่และมีทศนิยมมากมาย สำหรับการทดสอบฉันวาดพื้นที่ในมหาสมุทรแอตแลนติกใกล้กับแอฟริกา แต่ต้องขอบคุณคุณฉันสามารถปรับปรุงแผนที่เพื่อปัดเศษพิกัดเป็นเมตรทั้งหมด
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));

ดังนั้นคุณแนะนำให้เปลี่ยน SRID มากกว่า 4326 เป็น 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 ได้อย่างไรและแตกต่างจากคำตอบที่มีอยู่
Devdatta Tengshe

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