สวนสัตว์รูปทรงเรขาคณิตไม่ถูกต้อง


9

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

  • การชะลอตัวของฐานข้อมูล
  • ผลลัพธ์คิวรีไม่ถูกต้อง \ Null
  • ล็อกไฟล์โอเวอร์โหลดด้วยข้อผิดพลาดและคำเตือน
  • ผลลัพธ์ที่ไม่สอดคล้องกับตัวดำเนินการทางเรขาคณิต (เช่นทางแยก)

ฉันต้องการจัดหมวดหมู่ประเภทรูปทรงเรขาคณิตที่ไม่ถูกต้องเพื่อช่วยให้ทุกคนที่นี่ล้างข้อมูลของพวกเขา

โปรดตอบด้วยรูปทรงเรขาคณิตที่ไม่ถูกต้องที่คุณโปรดปราน (หนึ่งประเภทต่อคำตอบ) ยินดีต้อนรับภาพหน้าจอคำอธิบายและการแก้ปัญหา แต่พยายามทำให้คำตอบสั้น ๆ

คำตอบ:


6

8 ปีที่เหมืองทองเก่ารูปทรงเรขาคณิตที่ไม่ถูกต้องให้บริการโดยการทดสอบ IsValid ถอยหลัง PostGIS การทดสอบการถดถอยจำนวนมากถูกย้ายไปที่ GEOS เช่นที่นี่และที่นี่เช่นเดียวกับกระเป๋าอื่น ๆ ในแผนภูมิการทดสอบ (ขออภัยมีจำนวนมากเกินไปที่จะเน้นเลือกน้อยและวาง WKT ลงในตัวสร้างการทดสอบ JTS เพื่อให้เห็นภาพ )


3

ส่วนที่ไม่มีความยาว

ตัวอย่าง:

SELECT geomFromEWKT('LINESTRING(1 1, 1 1)');

                                    geomfromewkt                                    
------------------------------------------------------------------------------------
 0102000000020000000000000000000840000000000000104000000000000008400000000000001040

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

การตรวจสอบ: ใน PostGIS isValid()ศูนย์ส่วนความยาวสามารถตรวจพบได้โดยใช้

วิธีแก้ไข: พยายามรักษาส่วนเซกเมนต์ที่มีความยาวเป็นศูนย์


3

รูปหลายเหลี่ยมแบบตัดด้วยตนเอง

ป้อนคำอธิบายรูปภาพที่นี่

ตัวอย่าง:

SELECT isValid(geomFromEWKT('POLYGON((0 0, 1 1, 1 0, 0 1, 0 0))'));
NOTICE:  Self-intersection at or near point 0.5 0.5
 isvalid 
---------
 f
(1 row)

ปัญหา: การคำนวณที่ผิดตัวอย่างเช่นarea():

SELECT area(geomFromEWKT('POLYGON((0 0, 1 1, 1 0, 0 1, 0 0))'));
 area 
------
    0
(1 row)

สิ่งนี้สามารถทำให้เกิดข้อบกพร่องการหารศูนย์ด้วยฟังก์ชั่นโทร

การตรวจสอบ:ใน PostGIS isValid()ส่วนตัดด้วยตนเองสามารถตรวจพบได้โดยใช้

โซลูชัน:การแปลงเป็นMULTIPOLYGON(ดูความคิดเห็น)


รูปร่างเดียวกันนั้นมีค่าเทียบเท่า:MULTIPOLYGON(((0 0, 0 1, 0.5 0.5, 0 0)),((1 1, 1 0, 0.5 0.5, 1 1)))
Mike T

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