ความหมายของรูปทรงเรขาคณิตที่ไม่ถูกต้องคืออะไร


15

ฉันได้นำเข้าข้อมูลบางส่วนในฐานข้อมูล Postgis และรูปทรงเรขาคณิตบางส่วนมีการรายงานที่ไม่ถูกต้อง (ST_IsValidReason รายงานการแยกตัวเองหรือการแยกแหวนด้วยตนเอง)

ดูเหมือนว่าข้อความค้นหาที่ฉันทำไม่ได้รับผลกระทบจากลักษณะที่ไม่ถูกต้องของรูปทรงเหล่านี้ (ฉันใช้ ST_Distance แบบสอบถามเท่านั้น)

อะไรคือสิ่งที่แตกหักเมื่อรูปทรงเรขาคณิตไม่ถูกต้อง

การแก้ไขรูปทรงเรขาคณิตเหล่านี้ "อัตโนมัติ" (บัฟเฟอร์ (geom, 0) หรือ ST_SimplifyPreserveTopology (geom, 0.0001)) เป็นตัวเลือกหรือไม่?

คำตอบ:


19

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

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

  • ผลลัพธ์ไม่ถูกต้อง (นั่นคือST_Distanceจะส่งคืนตัวเลขที่ไม่ถูกต้องหรือผิดธรรมดา)
  • ปัญหาประสิทธิภาพการทำงานของฐานข้อมูล: การเก็บข้อมูลที่ผิดรูปแบบสามารถสร้างความเสียหายอย่างหนักต่อประสิทธิภาพของฐานข้อมูลและสร้างไฟล์บันทึกขนาดใหญ่เนื่องจากการเรียกใช้ฟังก์ชันทุกครั้งจะเขียนข้อผิดพลาดไปยังบันทึกและทำให้งานฐานข้อมูลทั่วไปชะงัก
  • ฐานข้อมูลล่ม
  • แอปพลิเคชันขัดข้อง - อาจเกิดจากการรับข้อมูลที่ผิดรูปแบบจากฐานข้อมูลหรือโดยการรับผลลัพธ์ที่ไม่สมเหตุผล (เช่นระยะทางลบเป็นต้น)
  • พฤติกรรมปีศาจ (ดูลิงค์ด้านบน) นี่คือผลที่เลวร้ายที่สุดของทั้งหมด คุณจะมีสิ่งแปลก ๆ เกิดขึ้น การช้าลงการสูญเสียข้อมูลขัดข้องผลลัพธ์ที่ไม่สมเหตุสมผลหยุดชั่วคราวไม่มีการตอบสนองและสาปแช่งอื่น ๆ อีกมากมาย คุณอาจไม่สามารถมองเห็นพวกเขาหรือทำซ้ำพวกเขาเพราะพวกเขาทั้งหมดอยู่ภายใต้หมวดหมู่ "ไม่ได้กำหนด" ในเอกสารทุกฉบับ

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


คุณช่วยอธิบายเพิ่มเติมเกี่ยวกับการใช้บัฟเฟอร์เล็ก ๆ ได้ไหม? ฉันจะทำอย่างไร
diciu

1
ST_Buffer(the_geom, 0.0000001)อาจทำเคล็ดลับสำหรับการแยกตนเอง ใช้เฉพาะในกรณีที่ผลที่ตามมาของรูปทรงเรขาคณิตขนาดใหญ่ขึ้นเล็กน้อยไม่รุนแรง
Adam Matan

1
ประสบการณ์ของฉันคือการแก้ไขข้อมูลที่มีรูปแบบไม่ถูกต้องเป็นการสอบสวน แต่ถึงแม้ว่าจะใช้เวลานาน แต่ก็คุ้มค่ากับความพยายาม ST_Buffer(the_geom, 0.0000001)เคล็ดลับแน่นอนจะช่วยให้มาก
Chau

สิ่งนี้คือ ST_Buffer แก้ไขรูปทรงเรขาคณิต แต่ผลลัพธ์ไม่ใช่สิ่งที่ฉันคาดหวัง - สำหรับรูปหลายเหลี่ยมที่ไม่ถูกต้องนี้ ( openstreetmap.org/browse/way/51954364 ) ST_Buffer ส่งกลับเฉพาะสี่เหลี่ยมมุมซ้ายบนเท่านั้น ST_SimplifyPreserveTopology ดูเหมือนจะใกล้เคียงกับสิ่งที่ฉันต้องการ (รูปทรงเรขาคณิตที่ถูกต้อง แต่ใกล้เคียงกับต้นฉบับที่ไม่ถูกต้องที่สุด) ข้อเสียในการใช้ ST_SimplifyPreserveTopology?
diciu

รูปทรงเรขาคณิตที่ควรจะดำเนินการเป็นสองรูปหลายเหลี่ยมไม่เป็นหนึ่งเดียวMULTIPOLYGON POLYGONลองรับ WKT ดั้งเดิมถ้าเป็นไปได้
Adam Matan

13

คุณสามารถป้องกันรูปทรงเรขาคณิตที่ไม่ถูกต้องเข้าสู่ฐานข้อมูลของคุณในสถานที่แรก สำหรับผู้ใช้ PostgreSQL / PostGIS นี้เป็นเรื่องง่ายที่จะทำอย่างไรกับข้อ จำกัด ของการตรวจสอบ ตัวอย่างเช่นพิจารณาตารางที่public.my_valid_tableมีคอลัมน์รูปหลายเหลี่ยมgeomใช้ SQL / DDL ต่อไปนี้:

ALTER TABLE public.my_valid_table
  ADD CONSTRAINT enforce_valid_geom CHECK (st_isvalid(geom));

หมายเหตุ: ตารางนี้จะต้องมีรูปหลายเหลี่ยมที่ถูกต้องก่อนที่จะบังคับใช้ข้อ จำกัด

หากคุณพยายามแทรก / เพิ่มรูปทรงเรขาคณิตที่ไม่ถูกต้องคุณจะเห็นข้อผิดพลาด:

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