แยกทุกบรรทัดในชั้นที่จุดยอดโดยใช้ QGIS?


11

ฉันต้องการแยกทุกบรรทัดในเลเยอร์ QGIS โดยอัตโนมัติที่จุดยอด ( เช่นนี้ )

ฉันค้นหา google เสร็จแล้วและพบบทความนี้ซึ่งค่อนข้างใกล้เคียง แต่ขั้นตอนการทำงานนั้นซับซ้อน เนื่องจากฉันจะต้องฝึกอบรมเพื่อนร่วมงานของฉัน (ที่ไม่คุ้นเคยกับ GIS) เพื่อใช้เครื่องมือนี้ฉันต้องการบางสิ่งที่เรียบง่ายเหมือนปลั๊กอินหรือบางสิ่งที่ไม่ต้องการ GRASS เนื่องจากเป็นเวลานานจากปี 2010 - เวลาของคำตอบก่อนหน้านี้ฉันสงสัยว่ามีวิธีใดที่ดีกว่าในการบรรลุผลลัพธ์เดียวกันหรือไม่


คุณสามารถใช้เครื่องมือ GRASS จาก QGIS nowdays.Maybe Vector-> Geometry Tools-> ชิ้นส่วนเดี่ยวเพื่อ multipart ช่วยได้ กล่องเครื่องมือ Sextante ควรมี "ระเบิดเลเยอร์บรรทัด" และมีปลั๊กอิน "คุณสมบัติแยก"
simplexio

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

@simplexio: ด้วยกล่องเครื่องมือ Sextante ฉันได้รับข้อความแสดงข้อผิดพลาดเหมือนในคำตอบของ Bernd V. และฉันไม่พบปลั๊กอิน 'คุณสมบัติแยก' ที่ใดก็ได้ในเน็ต
Cao Minh Tu

@Micha: ขั้นตอนนั้นอาจจะถูกต้อง แต่มันจะซับซ้อนเกินไปสำหรับเพื่อนร่วมงานของฉัน - ที่ไม่คุ้นเคยกับ GIS ดังนั้นฉันจะถือว่ามันเป็นทางเลือกสุดท้ายเมื่อทุกอย่างล้มเหลว :)
Cao Minh Tu

@Cao Minh Tu: ฉันทดสอบ 'คุณสมบัติแยก' อีกครั้งบน Linux Master และ Win7 1.8 ด้วยเลเยอร์บรรทัดที่สร้างขึ้นใหม่และทำงานได้ โปรดสร้างเลเยอร์ทดสอบตั้งแต่เริ่มต้นและนำไปใช้ที่นั่น อาจมีข้อผิดพลาดในเลเยอร์ดั้งเดิมของคุณซึ่งจะต้องแก้ไขก่อน!
Bernd V.

คำตอบ:


17

สายระเบิดจากกล่องเครื่องมือการประมวลผลจะแยกบรรทัดทั้งหมดที่จุดยอดของพวกเขาเพื่อแยกบรรทัด

การประมวลผลเมนู -> กล่องเครื่องมือ พิมพ์ "explode" ลงในช่องค้นหาเพื่อค้นหาฟังก์ชั่น เลือกเลเยอร์บรรทัดของคุณจากเมนูดร็อปดาวน์และเริ่มต้น สิ่งนี้จะสร้างเลเยอร์ใหม่

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

หมายเหตุ:เนื่องจาก QGIS กำลังเคลื่อนไหวอย่างรวดเร็วข่าวสารทั้งหมดด้านล่างนี้ล้าสมัยแล้ว

ผมคิดว่าระเบิดสายจะเป็นที่ Noob โซลูชั่นผ่าน กล่อง SEXTANTE QGIS Geoalgorithms > Vector geometry tools > Explode lines. น่าเสียดายที่ตอนนี้ดูเหมือนจะไม่ทำงานฉันได้รับข้อความแสดงข้อผิดพลาดเท่านั้น

Traceback (most recent call last):
  File "path/.qgis//python/plugins\sextante\core\GeoAlgorithm.py", line 145, in execute
    self.processAlgorithm(progress)
  File "path/.qgis//python/plugins\sextante\algs\Explode.py", line 58, in processAlgorithm
    features = QGisLayers.features(layer)
NameError: global name 'layer' is not defined

โซลูชันที่ใช้งานได้คือSplit Feature-Plugin จากที่เก็บ "สนับสนุน" ซึ่งทำงานให้ฉัน

โดยทั่วไปฉันชอบฟังก์ชั่น sextante มากกว่าปลั๊กอินแยกต่างหากทำให้เวิร์กโฟลว์ที่มี sextante เร็วขึ้นมากและไม่สร้างไฟล์ขยะในขั้นตอนกลาง (หากใช้งานได้)

แก้ไข:น่าเสียดายที่ปลั๊กอินจำนวนมากไม่ได้ถูกย้ายไปยังที่เก็บปลั๊กอินอย่างเป็นทางการ แต่ยังคงใช้ได้เฉพาะผ่านพื้นที่เก็บข้อมูลปลั๊กอิน "สนับสนุน": http://pyqgis.org/repo/contributedซึ่งถูกลบออกจากที่เก็บเริ่มต้น รายการที่มีรุ่น 1.8

คุณสามารถดาวน์โหลดได้ทีละไฟล์และแตกไฟล์เหล่านี้ในโฟลเดอร์. qgis / python / plugins หรือเพิ่มที่อยู่นี้ในรายการที่เก็บของปลั๊กอิน: Plugins -> Fetch python plugins -> Tab "Repositories" -> Add ... -> enter a name and the url.


คุณช่วยบอกฉันได้ไหมว่าจะหาปลั๊กอิน 'แยกคุณสมบัติ' ได้อย่างไร - ฉันหามันไม่เจอในที่เก็บปลั๊กอินอย่างเป็นทางการ? ด้วย SEXTANTE Explode lines ฉันได้รับข้อความแสดงข้อผิดพลาดเหมือนกับของคุณ - มีรายงานข้อผิดพลาดที่นี่: hub.qgis.org/issues/7157
Cao Minh Tu

@Cao Minh Tu: ขออภัยลืมอย่างสมบูรณ์ว่าฉันได้เพิ่มที่เก็บเก่าลงในรายการของฉันซึ่งปลั๊กอินนี้อยู่อย่างพิเศษ ดูการแก้ไขของฉัน
Bernd V.

ฉันลองปลั๊กอิน Split Feature แล้วไม่มีข้อความแสดงข้อผิดพลาด แต่เลเยอร์เอาต์พุตไม่มีอะไรเลย
Cao Minh Tu

มีข้อผิดพลาดเพียง 404 ข้อที่pyqgis.org/repo/contributed - มีการเปลี่ยนแปลง URL หรือไม่
til_b

@til_be ดูการแก้ไขของฉัน
Bernd V.

4
  1. เปิด / สร้าง mapset GRASS (เพื่อให้คุณสามารถเรียกใช้เครื่องมือในข้อมูลของคุณ)
  2. เปิดเครื่องมือ GRASS / นำเข้าไฟล์รูปร่างที่คุณต้องการแบ่งออกเป็นฐานข้อมูล GRASS
  3. เรียกใช้ v.split.vert (ตั้งค่าจำนวนสูงสุดของจุดยอด = 2)

โซลูชันนี้จะเก็บค่า z ไว้ในรูปทรงเซกเมนต์
Tamas Kosa

1
    segment_list = []
    for feature in feature_list:
        vertices = feature.geometry().asPolyline() # returns list of vertices comprising polyline
        for point in range(len(vertices)-1):
            segment = QgsFeature()
            segment.setGeometry(QgsGeometry.fromPolyline([vertices[point], vertices [point+1]]))
            segment.setAttributes(feature.attributes())
            segment_list.append(segment)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.