แยกการแยกแหวนด้วยตนเองใน PostGIS


10

นี่คือการติดตามต่อไปจากคำถามก่อนหน้านี้ คุณจะเห็นว่าฉันเป็นผู้ใช้ PostGIS ใหม่

ฉันได้ดูความถูกต้องของโทโพโลยีในข้อมูลของฉันและพบปัญหาเกี่ยวกับโทโพโลยีประมาณ 1,700 รายการในชุดข้อมูลแบบโพลีกอน (รูปหลายเหลี่ยม) เหล่านี้คือ "Ring Self_intersection" ทั้งหมด

การใช้ข้อมูลที่มีประโยชน์ในงานนำเสนอนี้โดย Paul Ramsay (หน้า 20) ฉันพยายามบัฟเฟอร์ข้อมูลของฉันตามนั้น:

UPDATE schema.data ตั้งค่า the_geom = buffer (the_geom, 0.0) WHERE isvalid (the_geom) = false และ isvalid (buffer (the_geom, 0.0)) = true;

แต่ฉันได้รับคำตอบ:

ข้อสังเกต: แหวนแยกตนเองที่หรือใกล้จุด (แก้ไข) ข้อผิดพลาด: แถวใหม่สำหรับความสัมพันธ์ "sgm_buffer" ละเมิดข้อ จำกัด การตรวจสอบ "enforce_geotype_the_geom"

ข้อผิดพลาด ********** **********

ข้อผิดพลาด: แถวใหม่สำหรับความสัมพันธ์ "sgm_buffer" ละเมิดข้อ จำกัด การตรวจสอบ "enforce_geotype_the_geom" สถานะ SQL: 23514

ฉันได้ลองเพียง:

อัพเดต csgn.sgm_buffer ตั้ง the_geom = บัฟเฟอร์ (the_geom, 0.0)

และรับ:

ข้อผิดพลาด: แถวใหม่สำหรับความสัมพันธ์ "sgm_buffer" ละเมิดข้อ จำกัด การตรวจสอบ "enforce_geotype_the_geom"

ข้อผิดพลาด ********** **********

ข้อผิดพลาด: แถวใหม่สำหรับความสัมพันธ์ "sgm_buffer" ละเมิดข้อ จำกัด การตรวจสอบ "enforce_geotype_the_geom" สถานะ SQL: 23514

ดังนั้นฉันคิดว่าเทคนิคบัฟเฟอร์นี้จะไม่ทำงานกับปัญหาของฉัน หรือฉันกำลังทำอะไรผิดพลาด?

จากนั้นนายแรมเซย์ก็ดำเนินการในเอกสารเดียวกันเพื่อแนะนำเทคนิคเพิ่มเติมในการจัดการรูปหลายเหลี่ยม "ตัวเลข 8" ฉันไม่เข้าใจวิธีการเขียนโค้ดนี้อย่างสมบูรณ์ (หรือสิ่งที่กำลังทำอยู่และจะช่วยฉันได้หรือไม่):

เลือก ST_BuildArea (ST_Union ('LINESTRING EMPTY', ST_ExteriorRing ('POLYGON ((... )))'

ดังนั้น .... ใครก็ได้ช่วยได้บ้าง นี่คือการพิสูจน์ฝันร้ายที่แท้จริงด้วยเวลาอัน จำกัด ของฉันและทักษะที่ จำกัด ใน PostGIS


1
"เลือก geometry_type (the_geom) จาก sgm_buffer จำกัด 1" ส่งคืนอย่างไร นอกจากนี้เกี่ยวข้องกับการใช้งานจริง 40 ชั่วโมงที่กล่าวถึงในคำถามอื่น ๆ มีการกำหนดดัชนีเชิงพื้นที่ไว้ในตารางของคุณหรือไม่?
diciu

คุณอาจจำเป็นต้อง a ST_Multi()เพื่อบังคับให้รูปหลายเหลี่ยมทั้งหมดเป็นMULTIPOLYGONs (นี่คือสมมุติฐาน)
Mike T

ขอบคุณสำหรับความคิดเห็น - ฉันคิดว่ามีดัชนีพวกเขาดูเหมือนจะปรากฏใน pgAdminIII แต่บางทีฉันต้องรีเฟรชพวกเขา? ฉันสามารถหาวิธีแก้ปัญหาเพื่อเพิ่มความเร็วในการค้นหา - ฉันไม่รู้ว่าจะใช้เวลาในการดำเนินการอย่างไร Landcover มีคุณสมบัติประมาณ 20 ล้าน
ESRIHelp

คำตอบ:


12

ฉันคิดว่าสิ่งที่เกิดขึ้นคือรูปหลายเหลี่ยมที่ตัดกันตัวเองของคุณกลายเป็น MULTIPOLYGONS เมื่อบัฟเฟอร์

คุณมีสองตัวเลือก:

1 ลบข้อ จำกัด "enforce_geotype_the_geom" คุณสามารถทำได้ใน pgAdmin
2 ใส่ผลลัพธ์ในตารางใหม่แทนที่จะอัปเดตเก่า มักจะเป็นวิธีที่ดีในการทำสิ่งต่าง ๆ เพราะคุณจะไม่เปลี่ยนแปลงอะไรในตารางเดิม แบบสอบถามสามารถมีลักษณะดังนี้:

CREATE TABLE new_buffered_table as
SELECT ST_Buffer(the_geom,0.0) as the_geom, gid FROM original_table;

แน่นอนคุณอาจต้องการนำฟิลด์เพิ่มเติมมาไว้ในตารางใหม่ของคุณ

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


0

ฉันมีปัญหาแบบเดียวกันไม่กี่เดือนที่ผ่านมา ฉันมีรูปหลายเหลี่ยมในฐานข้อมูลที่มีการแยกตัวเองจำนวนมาก ฉันใช้วิธีการของ Niklas Aven แต่มันไม่ได้ผล ฉันใช้วิธีอื่นด้วย

วิธีการของฉันคือการลบจุดตัดตนเองออกจากรูปหลายเหลี่ยมของฉัน นี่คือแบบสอบถาม SQL ที่ฉันใช้:

     -- Create the new polygons 

SELECT ST_GeomFromText(polygone) as geom

   from (

    SELECT st_astext(ST_MakePolygon(linear)) as polygone

        from (
              SELECT st_astext
                ((ST_dump
                   (st_boundary
                      (ST_MakeValid
                     (ST_Transform
                        (ST_SETSRID
                           (geometry,4326),32631))))).geom) 
                          as linear from tables_name)
        as query2)

  as query1

where ST_area(polygone) > 1

ฉันคำนวณพื้นที่ของรูปหลายเหลี่ยมและการแยกตัวเองและฉันจะเก็บรูปหลายเหลี่ยมที่มีพื้นที่> 1 เท่านั้น1คือความอดทนเพราะพื้นที่ของการแยกด้วยตนเองนั้นมีขนาดเล็กมาก นอกจากนี้โปรดทราบว่าการเปลี่ยน SRID เป็นเมตรมีความสำคัญหากคุณมีข้อมูลเป็นองศา

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