ช่วยด้วยรูปหลายเหลี่ยม PostGIS รูปทรงเรขาคณิต - วงแหวนที่ไม่ปิด


10

ฉันได้รับสำเนาหนังสือสุดยอด 'Python Geospatial Development' โดย Erik Westra ( ลิงก์ Amazon ) และฉันกำลังทำงานอยู่ ปัจจุบันสอนให้ฉันโหลดข้อมูลชายฝั่ง GSHHS จากรูปร่างไฟล์ลงในฐานข้อมูล PostGIS เพื่อเตรียมสร้างแอปพลิเคชันเว็บเชิงพื้นที่

ปัญหาของฉันคือ: เมื่อฉันพยายามนำเข้าข้อมูล GSHHS ไปยัง PostGIS นั้นจะถูกปฏิเสธเนื่องจากรูปหลายเหลี่ยมชายฝั่งไม่ได้รับการพิจารณาว่า 'ถูกต้อง' โดยเฉพาะฉันได้รับข้อความแสดงข้อผิดพลาดที่อธิบายถึงรูปหลายเหลี่ยม (แต่ไม่ทั้งหมด) ของแนวชายฝั่งว่าเป็น 'วงไม่ปิด'

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

รูปหลายเหลี่ยมจะถูกแยกออกจาก shapefiles โดยใช้ไลบรารี OGR และส่งออกแต่ละรูปหลายเหลี่ยมไปยัง WKT ฉันลองสร้างรูปหลายเหลี่ยมใหม่ผ่าน Shapely และทดลองกับ WKB แต่ก็ไม่มีประโยชน์ ฉันได้รับสามารถที่จะโหลดข้อมูลเดียวกันใน PostGIS เป็นตาราง MULTIPOLYGON โดยใช้รถตักดิน shp2pgsql

ฉันสงสัยว่ามีใครบางคนที่นั่นหรือไม่:
(a) อาจใช้หนังสือเล่มเดียวกันติดอยู่ที่ปัญหาเดียวกันและมีคำตอบสำหรับฉันหรือไม่
(b) พบปัญหาที่คล้ายกันและพบวิธีแก้ปัญหาหรือไม่
(c) ไม่ปฏิบัติตามนั้นมีคำแนะนำ 'แนวปฏิบัติที่ดีที่สุด' บางประการเพื่อรับรองความถูกต้องของรูปทรงเรขาคณิตก่อนที่จะโหลดลงใน PostGIS

อัปเดต: เพื่อนร่วมงานแนะนำว่าปัญหา 'วงไม่ปิด' อาจเป็นอาการของปัญหาอื่น เป็นไปได้ว่าการกำหนดค่า PostGIS / PostgreSQL ของฉันมีข้อ จำกัด ด้านขนาด (เมื่อมีการทำธุรกรรมแทรก, ได้รับแพ็คเก็ต, สตริงข้อความ ฯลฯ )

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

ดังนั้นนี่อาจเป็นเธรดผู้ดูแลระบบฐานข้อมูล PostGIS มากกว่าเป็นเธรดเรขาคณิตที่ไม่ถูกต้อง


คุณสามารถให้ไฟล์ shp ตัวอย่างได้หรือไม่?
Mario Miler

ไม่มีข้อมูลที่ worries.The GSHHS ชายฝั่งฉันใช้เป็นดาวน์โหลด 96MB จากที่นี่ ข้อมูลเส้นขอบโลกที่ฉันใช้อยู่เป็นชุดข้อมูล World Borders จากthematicmapping.org
timmy

คำตอบ:


6

ฉันได้ดูข้อมูลของคุณและตัวอย่างหนังสือแล้วปัญหาคือมีรูปหลายเหลี่ยมที่ไม่ถูกต้องสามตัวในข้อมูลที่ประมวลผลในหนังสือ:

GSHHS_l_L1.shp

ID = 92-W

POLYGON ((-180.0 71.514793999999995,-179.69008299999999 71.577888999999999,-178.648889 71.577416999999997,-178.40644399999999 71.549916999999994,-177.406306 71.244167000000004,-177.877444 71.022889000000006,-179.500111 70.863749999999996,-179.93011100000001 70.979583000000005,-180.0 70.962072000000006))

ID = 486-W

POLYGON ((-180.0 -16.799126,-179.84419399999999 -16.691278,-179.80041700000001 -16.789193999999998,-179.850472 -16.878361000000002,-180.0 -16.959561))

GSHHS_l_L2.shp

ID = 7333-W

POLYGON ((-180.0 65.393473,-179.76583299999999 65.428332999999995,-179.95416700000001 65.385555999999994,-179.90972199999999 65.316389,-180.0 65.321635))

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

if geometry.IsValid():
       cursor.execute("INSERT INTO gshhs (level, geom) VALUES (%s, ST_GeomFromText(%s, 4326))", (level, wkt))

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

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

ฉันพยายามใช้ "เคล็ดลับบัฟเฟอร์" ( workshops.opengeo.org/postgis-intro/validity.html ) กับหุ่นดีและ ogr แต่ไม่ประสบความสำเร็จ หุ่นดีจะไม่อ่านรูปหลายเหลี่ยมที่ไม่ถูกต้องและ ogr จะไม่ดำเนินการบัฟเฟอร์ตอนนี้ฉันไม่รู้ว่าทำไม ถ้าฉันสะดุดกับคำตอบฉันจะแจ้งให้คุณทราบ บางทีคนอื่นอาจประสบความสำเร็จมากขึ้นกับปัญหานี้ ขอโทษ
Mario Miler

ฉันคิดว่าฉันได้รับการตรวจสอบรูปหลายเหลี่ยมของฉันทำงานแล้ว ฉันคิดว่าฉันกำลังใช้ฟังก์ชัน. CloseRings () ของ OGR ในทางที่ผิด ฉันถูกเรียกว่าเป็นวิธีของรูปหลายเหลี่ยม (เช่น poly.CloseRings ()) แต่ฉันต้องแยกแหวนเชิงเส้นออกจากรูปหลายเหลี่ยมแล้วเรียกใช้บนนั้น (เช่น lr = poly.GetGeometryRef (0); lr.CloseRings ()) ผลลัพธ์ถูกแทรกลงใน PostGIS สำเร็จแล้วและฉันสามารถใช้รูปหลายเหลี่ยมปัญหา 3 รายการใน QGis ได้โดยไม่ต้องกังวล มีค่าใช้จ่ายเล็กน้อยในการตรวจสอบความถูกต้องของรูปหลายเหลี่ยมทุกรูปแบบ
Timmy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.