กำลังตรวจจับรูปหลายเหลี่ยมแบบกิ่งหรือไม่?


13

ฉันมีเวกเตอร์เลเยอร์ที่มีรูปหลายเหลี่ยมหลายล้านที่ครอบคลุมอย่างต่อเนื่อง ฉันต้องการจำแนกพวกเขาตามรูปร่างของพวกเขา ฉันกำลังใช้ดัชนีรูปร่างหลายรูปแบบจากนิเวศวิทยาภูมิทัศน์เช่นความกะทัดรัด ( 4piA / P ^ 2 ), ความกว้างเฉลี่ย ( 2A / P ), หมายเลขรูปร่าง ( P / sqrt (A) ) ฉันเห็นคำตอบนี้เพื่อคำนวณความกลม / ความกะทัดรัดของ รูปหลายเหลี่ยม?

ปัญหาของฉันคือว่าตัวชี้วัดเหล่านี้ทั้งหมดใช้อัตราส่วนของพื้นที่และเส้นรอบวงเท่านั้น แม้แต่ดัชนีมิติเศษส่วนก็ใช้พื้นที่และปริมณฑลเท่านั้น ( 2ln (0.25P) / ln (A) ) แต่ฉันจะแยกความแตกต่างของรูปหลายเหลี่ยมสองรูปได้ด้วยพื้นที่และปริมณฑลเดียวกัน แต่มีรูปร่างที่แตกต่างกันอย่างไร ชอบรูปหลายเหลี่ยมที่แยกย่อยนี้ A:

รูปหลายเหลี่ยมกิ่งกับแถบโค้ง

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

ฉันตั้งใจแสดงรูปหลายเหลี่ยม B เป็นแถบโค้งและไม่เป็นแถบเส้นตรงเพราะฉันรู้ว่าดัชนี Circumcircle ที่เกี่ยวข้องซึ่งตรวจจับรูปร่างที่ยืดยาวตรง แต่รูปหลายเหลี่ยมของฉันอาจมีรูปวงกลมเหมือนกัน แม้ว่าฉันจะสร้างตัวเรือนูนและคำนวณอัตราส่วนของพื้นที่Apolygon / Aconvexมันอาจคล้ายกันมากที่นี่

ดังนั้นฉันจะแยกความแตกต่างของรูปหลายเหลี่ยมที่แยกจาก A ของรูปหลายเหลี่ยม B ในข้อมูลเวกเตอร์โดยอัตโนมัติได้อย่างไร (การแปลงเป็นแรสเตอร์จะต้องใช้ขนาดเซลล์ที่เล็กมากชุดข้อมูลขนาดใหญ่และการขาดหน่วยความจำจึงไม่สามารถทำได้) มีดัชนีรูปร่างอื่น ๆ ซึ่งรวมถึงพารามิเตอร์อื่น ๆ หรือไม่? เป็นการดีที่วิธีการจะแยกความแตกต่างไม่เพียง แต่รูปหลายเหลี่ยมแยกอย่างชัดเจน แต่แม้ C และ D:

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

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

ฉันยินดีต้อนรับโซลูชัน / อัลกอริทึมทางคณิตศาสตร์ซึ่งฉันจะนำไปใช้ใน Python ในภายหลัง


1
คุณไม่ต้องการ Python มาก ลอง ! รูปร่าง!. convexHull () symmetricDifference (! shape!) ในเครื่องคิดเลข ลองครั้งแรกกับสำเนาย่อยชุดเล็ก ดูวิธีใช้เรขาคณิต arcpy สำหรับไวยากรณ์ที่ถูกต้อง
FelixIP

นี่อาจเป็นคำถามที่ยอดเยี่ยม แต่ในขณะนี้คุณกำลังถามคำถามหลายข้อโดยไม่คาดเดาว่าคุณกำลังถามเกี่ยวกับ QGIS หรือ ArcGIS Desktop แล้วก็โยนใน Python ด้วย เมื่อคุณระบุสิ่งที่คุณพยายามอย่างแม่นยำแล้วจะเป็นการง่ายขึ้นสำหรับผู้ตอบที่มีศักยภาพจะช่วยคุณในการติดค้าง ฉันขอแนะนำให้เน้นไปที่ QGIS เพื่อหลีกเลี่ยงคำตอบแรกของคุณ
PolyGeo

1
ฉันมีข้อมูลในฐานข้อมูลทางภูมิศาสตร์ของ Esri เพราะรูปร่างไฟล์มีขนาดเกิน 2 กิกะไบต์แล้ว ฉันสามารถทำอะไรบางอย่างเกี่ยวกับเรื่องนี้หากมีวิธีการทำงานใน QGIS หรือที่อื่น แต่ฉันไม่ได้ถามในซอฟต์แวร์เฉพาะ ฉันกำลังถามเกี่ยวกับตัวชี้วัดซึ่งเป็นวิธีการตรวจสอบรูปร่างด้วยเส้นขอบที่ซับซ้อนทางคณิตศาสตร์ (แยก) 1 คำถาม บทความทางวิทยาศาสตร์ที่มีสูตรก็โอเคฉันจะคิดว่าจะนำไปใช้ได้อย่างไร
nadya

1
ความคิดแรกของฉันก็เหมือนกับของคุณโดยดูที่ความแตกต่างระหว่างจำนวนและขนาดของรูปหลายเหลี่ยมที่เหลือหลังจากลบต้นฉบับจากฮัลล์นูน (หรือเว้า) (ดูรูปร่างอัลฟ่า)
2856

1
ถ้าเพียงโครงกระดูกนั้นเร็วพอที่จะคำนวณฉันจะใช้เพื่อคำนวณ 4A / PL, พื้นที่, เส้นรอบวง, ความยาวระหว่างโหนดโครงกระดูกของฟาร์มเพื่อความกระชับ เช่นเดียวกันกับวงกลมที่ถูกจารึกไว้ที่ใหญ่ที่สุด
FelixIP

คำตอบ:


11

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

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

ตัวอย่าง:

  • เมื่อคุณวาดตัวอักษร Y คุณต้องใช้จังหวะต่อเนื่องอย่างน้อย 2 ครั้ง (= 2 polylines) ดังนั้นจึงมีการแตกแขนงเนื่องจากจังหวะน้อยที่สุดคือ> 1
  • เมื่อคุณวาดตัวอักษร L คุณใช้จังหวะต่อเนื่องอย่างน้อย 1 ครั้ง มันไม่ได้แยก

ตัวอย่างเพิ่มเติมของตรรกะนี้:

  • เมื่อคุณวาด A: 2 strokes = มันจะแตกแขนง
  • เมื่อคุณทำให้ B: 3 สโตรก = มันจะแตกแขนง
  • เมื่อคุณวาด C: 1 stroke = มันจะไม่แตกแขนง
  • ฯลฯ

ฉันไม่ได้ลองอะไรเลยลองใช้ตรรกะ แต่ฉันคิดว่ามันใช้ได้

ดู: Skeletonize vectors ใน QGIS / Pythonหรือhttp://postgis.net/docs/ST_StraightSkeleton.html

หรือ

ตัวอย่าง

ที่มา: การแยก centerline ของ Complex-Polygon ใน PostGIS / Python

แก้ไข:สำหรับกรณี C & D คุณจะต้องมีรูปร่าง B ที่กรองแล้ว (ไม่แยก)

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

ขอบคุณสำหรับความคิดฉันจะพยายามสร้าง centerlines
nadya

เพียงแค่ปัญหาที่จะแยกแยะรูปหลายเหลี่ยม C และ D ของฉันจะยังคงอยู่
nadya

คุณอาจต้องใช้วิธีการที่แตกต่างกันสำหรับกรณีที่แตกต่างกันและแยกงาน เมื่อคุณมีรูปหลายเหลี่ยมที่ไม่ใช่สาขา (B) คุณสามารถปรับ B เพื่อลองหา C และ D ปัญหาคือฉันไม่เห็นตรรกะที่คุณใช้เพื่อแยกความแตกต่าง C จาก D คุณอาจต้องใช้วลีที่ชัดเจนด้วย เกณฑ์
gisnside

1
ความแตกต่างระหว่าง C และ D น่าจะเป็นใน C ด้านข้างของรูปหลายเหลี่ยมนั้นอยู่ห่างจากกึ่งกลางโดยประมาณในขณะที่ D ด้านข้างเป็นระยะทางที่ไม่สม่ำเสมอจากจุดกึ่งกลาง
csk

1
@csk ฉันเห็นว่า ฉันเดาว่าการแปลเป็นโค้ดจะเป็นการคำนวณสถิติเกี่ยวกับระยะห่างระหว่างเส้นกลางและเส้นขอบ ด้วยการทำให้เส้นขอบของเส้นขอบมีความหนาแน่นมากขึ้นจากนั้นจึงแปลงจุดนี้เป็นจุด + ทำให้ระยะทางจากงานที่เทียบเท่าบนเส้นกลางจะทำให้สถิติเกี่ยวกับพฤติกรรมนี้ หากค่าเบี่ยงเบนมาตรฐานสูงอาจเป็นไปได้ว่ารูปร่างจะไม่สม่ำเสมอ ยากที่จะเห็นวิธีการทำเช่นนั้นบน tousands of polygons แม้ว่า ... ความท้าทายที่ดีที่นั่น
gisnside
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.