ลดความซับซ้อนของรูปหลายเหลี่ยมที่อยู่ติดกันโดยใช้เครื่องมือลดความซับซ้อนของรูปทรงเรขาคณิต QGIS


10

ฉันมี Shapefile ขนาดใหญ่ที่มี 200,000 รูปหลายเหลี่ยม แต่ไฟล์นั้นใหญ่เกินไปสำหรับแอปพลิเคชันที่จะใช้ ฉันต้องการที่จะสรุปรูปหลายเหลี่ยมเหล่านี้และสร้างไฟล์ที่เล็กกว่ามาก

ฉันได้ลองทำสิ่งนี้ใน QGIS โดยใช้เครื่องมือ "ลดความซับซ้อนของรูปทรงเรขาคณิต" ฉันได้ลองในส่วนเล็ก ๆ ของ Shapefile ของฉันและฉันมีความสุขกับผลลัพธ์ แต่มีปัญหาเล็ก ๆ ซึ่งฉันไม่รู้วิธีแก้ปัญหา ฉันต่อท้ายรูปภาพเพื่อแสดงปัญหา

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

ฉันจะทำให้ Shapefile นี้ง่ายขึ้นและรักษาขอบเขตทั่วไประหว่างรูปหลายเหลี่ยมเป็นบรรทัดเดียวและกำจัดพื้นที่ที่สร้างหลังจากการทำให้เป็นเรื่องง่ายได้อย่างไร

รูปหลายเหลี่ยมแบบย่อใน QGIS

ข้อมูลเพิ่มเติม:

หลังจากทำตามคำแนะนำที่แนะนำ

  1. แปลงรูปหลายเหลี่ยมเป็นเส้น
  2. ลดความซับซ้อนของเส้น
  3. แปลงบรรทัดกลับเป็นรูปหลายเหลี่ยม

ฉันได้รับผลลัพธ์ดังต่อไปนี้ มันดีกว่าเมื่อก่อน แต่ฉันยังคงได้พื้นที่นอกรูปหลายเหลี่ยมดั้งเดิม (ดูพื้นที่สีขาวในภาพด้านล่าง)

@ แอนดรูว์แนะนำให้ฉันเชื่อมโยงแต่ละบรรทัดกับรูปหลายเหลี่ยมที่อยู่ติดกัน แต่ไม่ทราบว่าจะต้องทำอย่างไรใน QGIS

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

ฉันยังคงพยายามทำให้กระบวนการรูปหลายเหลี่ยมลดความซับซ้อน ฉันได้ปฏิบัติตามคำแนะนำที่แนะนำในโพสต์นี้และเมื่อฉันคิดว่าฉันได้ผลลัพธ์ที่ยอมรับได้จะมีปัญหาอีกหนึ่งปรากฏขึ้น ด้านล่างนี้เป็นบทสรุปของสิ่งที่ฉันทำกับภาพผลลัพธ์ ทุกขั้นตอนดำเนินการโดยใช้ PROCESSING กล่องเครื่องมือใน QGIS

  1. ก่อนอื่นฉันเปลี่ยนรูปหลายเหลี่ยมเป็นเส้น
  2. ประการที่สองฉันทำความสะอาดบรรทัดโดยใช้ v.clean พร้อมตัวเลือกพัก ส่งผลให้ LAYER CLEANED VECTOR LAYER และ ERROR LAYER เลเยอร์ข้อผิดพลาด (จุดสีเขียวบนรูปภาพที่ให้) มีจุดสีเขียวในทุกจุดตัดของเส้น ผมไม่ทราบว่าสิ่งนี้หมายความว่า.
  3. ประการที่สามฉันลดความซับซ้อนของบรรทัดโดยใช้เครื่องมือ "SIMPLIFY GEOMETRY" (ผลลัพธ์เป็นเส้นสีแดงในภาพ) การเปรียบเทียบเส้นสีแดงแบบง่ายและเส้นสีส้มดั้งเดิมฉันมีความสุขกับผลลัพธ์
  4. ประการที่สี่ฉันต้องการแปลงบรรทัดกลับเป็นรูปหลายเหลี่ยมโดยใช้เครื่องมือ "รูปหลายเหลี่ยม" ใน "กำลังดำเนินการ" และได้ผลลัพธ์ที่ฉันไม่ได้คาดหวัง (ภาพที่สองที่มีรูปหลายเหลี่ยมสีมะกอกสีเทาเข้ม) ดูเหมือนว่าจุดเชื่อมต่อข้อผิดพลาดของจุดเชื่อมต่อ polygonizer และสร้างชุดรูปหลายเหลี่ยมที่แตกต่างอย่างสิ้นเชิงโดยไม่สนใจเส้นที่เรียบง่าย

มีคนช่วยอธิบายสิ่งที่ผิดพลาดได้ไหม

เหตุใดเส้นที่เรียบง่ายสีแดงจึงไม่แปลงเป็นรูปหลายเหลี่ยมอย่างง่าย

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

นี่คือภาพสองภาพที่มีผลลัพธ์ของสองขั้นตอนสุดท้ายของกระบวนการ:

เส้นแบบง่ายและเส้นดั้งเดิม

ผลลัพธ์ของบรรทัดที่ถูกทำให้เรียบง่ายของ Plygonized


@nhopton บนหน้าเว็บPolygonizer plugins.qgis.org/plugins/Polygonizerบอกว่ามัน "สร้างรูปหลายเหลี่ยมจากจุดตัดกัน" สิ่งนี้แสดงให้เห็นว่ารูปหลายเหลี่ยมจะถูกสร้างขึ้นเมื่อใดก็ตามที่มีจุดตัดบรรทัด (แต่บางทีการตีความของฉันอาจผิด) สิ่งที่ฉันต้องการคือการกำจัดช่องว่างที่สร้างขึ้นเมื่อใช้เครื่องมือ "ลดความซับซ้อนของรูปทรงเรขาคณิต" และถ้า Polygonizer สามารถทำได้ฉันจะ hapy มาก
David

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

วิธีที่ดีในการรักษาโทโพโลยีประกอบด้วยเวิร์กโฟลว์ที่ @radouxju แนะนำ (ยกเว้นการคำนวณ centroid ที่ไม่จำเป็น) และแสดงในรูปแบบการประมวลผลในคำตอบของฉัน หรือฉันคิดว่า GRASS v.generalizeเป็นอีกตัวเลือกที่ยอดเยี่ยม หวังว่านี่จะช่วยได้
Antonio Falciano

คำถามที่เกี่ยวข้อง: gis.stackexchange.com/questions/20799/…
simon04

คำตอบ:


7

ฉันได้ผลลัพธ์ที่ดีเมื่อใช้ GRASS v.generalize จาก Processing Toolbox โดยใช้ค่าเริ่มต้น:

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

บางบรรทัดยังคงไม่มีการแตะต้อง


ประสบความสำเร็จในการใช้วิธีนี้หลังจากตั้งค่าv.in.ogr snap toleranceตั้งแต่ -1 (ไม่มี snap) ถึง 0.00001 ตามที่ @Kantan แนะนำ
cm1

4

ฉันประสบปัญหากับ Qgis2.16 แต่ไม่สามารถรับ GRASS เพื่อให้ได้ผลลัพธ์ที่ถูกต้องเช่น @AndreJ ทอพอโลยี

วิธีแก้ไขปัญหาที่ดีคือการเปลี่ยน v.in.ogr snap tolerance ในพารามิเตอร์ขั้นสูงของเครื่องมือv.generalize.simplify ค่าเริ่มต้นคือ -1 ซึ่งป้องกันการหักใน GRASS

ด้วยการใส่ค่าเล็ก ๆ น้อย ๆ ที่นี่ (เช่น 1e-05 m) การหักมุมจะเปิดใช้งานและ GRASS จะจดจำเส้นขอบที่ใช้ร่วมกันของรูปหลายเหลี่ยม การทำให้เข้าใจง่ายจะให้เลเยอร์ที่ถูกต้องทอพอโลยีโดยไม่มีรู

หมายเหตุ: โดยการตั้งค่าความทนทานต่อการสแน็ปเป็นค่าที่สูงกว่าก็เป็นไปได้ที่จะแก้ไขรูปหลายเหลี่ยมเพื่อให้สามารถลบรูปหลายเหลี่ยมบาง ๆ ได้หากคุณต้องการ ติดตามการทำงานด้วย v.clean โดยใช้ rmarea และขีด จำกัด ใหญ่พอที่จะลบสิ่งที่เหลืออยู่ขนาดเล็กและคุณก็ทำเสร็จแล้ว!


3

ก่อนแปลงรูปหลายเหลี่ยมของคุณเป็นเส้น

ใช้ v.clean เพื่อทำความสะอาดโทโพโลยีของคุณ (ด้วยตัวเลือก "ตัวแบ่ง")

จากนั้นคุณลดความซับซ้อนของเส้นของคุณ

ในที่สุดคุณเปลี่ยนเส้นของคุณกลับไปเป็นรูปหลายเหลี่ยม (ใช้รูปหลายเหลี่ยม)

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


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

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

@ David ฉันคิดว่าปัญหาของคุณอาจเกิดจากขั้นตอนที่ 3 บรรทัดไปยังรูปหลายเหลี่ยม ในเครื่องมือประมวลผลมีเครื่องมือที่เรียกว่า "รูปหลายเหลี่ยม" และฉันจะลองสิ่งนี้ ฉันคิดว่านี่ยังคงต้องติดตั้งแพ็คเกจ Shapely และ Numpy สิ่งนี้กล่าวว่าฉันไม่สามารถรับ "รูปหลายเหลี่ยม" เพื่อทำงานให้ฉันใน QGIS-Master ได้ในนาทีนี้ N.
nhopton

2

คุณสามารถแก้ปัญหาด้วยโมเดลการประมวลผล (เช่น SEXTANTE) ดังนี้:

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

เวอร์ชันของสคริปต์:

##Simplify polygons=name
##vectorlayer_input=vector
##number_tolerance=number 0.0
##output_layer_alg3=output vector
outputs_0=Processing.runalg("qgis:polygonstolines", vectorlayer_input, None)
outputs_1=Processing.runalg("qgis:simplifygeometries", outputs_0['OUTPUT'], number_tolerance, None)
outputs_2=Processing.runalg("qgis:linestopolygons", outputs_1['OUTPUT'], None)
outputs_3=Processing.runalg("qgis:joinattributestable", outputs_2['OUTPUT'], vectorlayer_input, ID, ID, output_layer_alg3)

หมายเหตุ:ข้อ จำกัด เพียงอย่างเดียวคือว่าสนามร่วมกันจะต้องมีIDในเพราะเป็นเขตเดียวของการส่งออกของJoin attributes table Lines to polygonsนั่นเป็นเหตุผลที่เขตข้อมูลทั่วไปไม่ใช่อินพุตตัวแปรของโมเดล ดังนั้นต้องมีIDฟิลด์ในชั้นรูปหลายเหลี่ยมอินพุท

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