QGIS แยกโหนดที่มีค่า M สำหรับอ้างอิงเชิงเส้น


10

ฉันมีชั้น MultiLineStringZM ในฐานข้อมูล sqlite และฉันพยายามที่จะเห็นภาพการวัดหรือค่า m ที่จุดสุดยอด ฉันได้ลองค้นหาข้อมูลเกี่ยวกับวิธีการทำสิ่งนี้ใน QGIS และสิ่งที่ฉันสามารถรวบรวมได้คือสิ่งนี้ไม่สามารถทำได้โดยตรงจากเลเยอร์ linestring และจุดนั้นต้องแยกออกเป็นเลเยอร์อื่น

ฉันใช้Vector-> Geometry Tools-> Extract nodesเพื่อสร้างชั้นหลายจุดที่เป็นจุดสุดยอดของชั้น multlinestring ของฉัน แต่กระบวนการสูญเสียค่า m ของจุดยอด ฉันต้องการ m-values ​​ที่เก็บรักษาไว้โดยการบันทึก m-value เป็นคุณลักษณะของจุดหรืออย่างอื่น?

ภายในเรามีเครื่องมือบรรทัดคำสั่งที่แปลง linestrings เป็น shapefile จุดด้วยค่า m ที่เก็บไว้เป็นแอตทริบิวต์ในแต่ละจุดและฉันใช้มันเพื่อตรวจสอบว่ามีค่า m- กำหนดให้กับจุดยอดและฉันสามารถใช้ ถ้าฉันต้องทำ แต่ถ้าเป็นไปได้มันจะดีถ้าทำสิ่งนี้ได้โดยตรงภายใน QGIS

แก้ไข - ทำซ้ำสิ่งที่ฉันได้กล่าวข้างต้น แต่เน้นความจริงที่ว่าเรามีเครื่องมือบรรทัดคำสั่งที่สามารถบรรลุผลลัพธ์ที่ฉันกำลังมองหาที่ใช้ไลบรารี GDAL ดังนั้นวิธีแก้ปัญหาแสดงคำตอบเพียงบางส่วนใน PyQGIS ไม่ใช่คำตอบที่ฉันกำลังมองหา ฉันกำลังมองหาเครื่องมือในตัวปลั๊กอินที่พร้อมสำหรับ QGIS หรือสคริปต์ที่สมบูรณ์ที่สามารถแยก (ไม่สร้าง / สร้าง) และแสดงค่า m-visualize จากเรขาคณิต MultiLineStringZM หรือเรขาคณิต LineStringZM


คุณสามารถใช้ปลั๊กอิน LRS เพื่อรับค่า m คุณจะต้องแตกโหนดแล้วรับมาตรการจาก linestring โดยใช้ปลั๊กอิน LRS หรือระยะทางตามเครื่องมือบรรทัด
jbalk

@ jbalk ฉันได้ลองปลั๊กอิน LRS และ QChainage แล้วและปลั๊กอินเหล่านั้นทั้งคู่ดูเหมือนจะถูกตั้งค่าเพื่อสร้างการวัดตามช่วงเวลาปกติไม่ใช่สำหรับการใช้การวัดที่มีอยู่เว้นแต่ว่าฉันขาดอะไรไปและฉันใช้ปลั๊กอินอย่างไม่ถูกต้อง .
TJ Rockefeller

จากหน้าปลั๊กอิน LRS: - ปลั๊กอินรองรับการสอบเทียบ, การสร้างกิจกรรมตรงเวลาและเชิงเส้นและการคำนวณการวัดคะแนน - นี่คือเว็บไซต์ blazek.github.io/lrs ถามคำถามเกี่ยวกับปลั๊กอิน LRS บนเว็บไซต์นี้หากคุณสามารถ ไม่ต้องคิดออก
jbalk

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

คุณสามารถสร้างคะแนนทุกๆ 1,000 ม. ตามเส้นของคุณเพื่อใช้สำหรับการสอบเทียบ หรือดูระยะทางตามเครื่องมือบรรทัดในกล่องเครื่องมือ SAGA และ GRASS ภายใน QGIS เพื่อรับค่า m
jbalk

คำตอบ:


6

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

คำแนะนำสำหรับการเขียนอัลกอริทึมการประมวลผลสามารถดูได้ที่นี่https://docs.qgis.org/2.18/en/docs/user_manual/processing/scripts.html

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

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

##input_layer=vector
##output_layer=output vector

from qgis.core import QgsWKBTypes, QgsField, QgsVectorFileWriter, QgsFeature, QgsGeometry
from PyQt4.QtCore import QVariant

def addVertices( geometry, writer, inFeature ):
    coordinateSequence = geometry.coordinateSequence()
    for rings in coordinateSequence:
        for points in rings:
            for point in points:
                feature = QgsFeature( fields )
                feature.setGeometry( QgsGeometry( point ) )
                type = point.wkbType()
                attributes = inFeature.attributes()
                if QgsWKBTypes.hasM( type ):
                    attributes.append( point.m() )
                if QgsWKBTypes.hasZ( type ):
                    attributes.append(point.z())
                feature.setAttributes( attributes )
                writer.addFeature( feature )
    return

inlayer = processing.getObject( input_layer )
provider = inlayer.dataProvider()
fields = provider.fields()
geomType = QgsWKBTypes.Type(inlayer.wkbType())
outputGeomType = QgsWKBTypes.Point

if QgsWKBTypes.hasM( geomType ):
    outputGeomType = QgsWKBTypes.addM( outputGeomType )
    fields.append( QgsField( "MValue", QVariant.Double ) )

if QgsWKBTypes.hasZ( geomType ):
    outputGeomType = QgsWKBTypes.addZ( outputGeomType )
    fields.append( QgsField( "ZValue", QVariant.Double ) )

layer_options = 'SHPT=' + QgsWKBTypes.displayString(outputGeomType)
writer = QgsVectorFileWriter( output_layer, 'UTF-8', fields,  outputGeomType , inlayer.crs(), layerOptions=[layer_options] )

features = inlayer.getFeatures()
featureCount = inlayer.featureCount()
featureIndex = 0

for f in features:
    percent = ( featureIndex/float( featureCount ) ) * 100
    progress.setPercentage( percent )
    g = f.geometry().geometry()
    addVertices( g, writer, f )
    featureIndex +=1

del writer

4

ด้วย QGIS 3.0 หรือใหม่กว่าภารกิจนี้ไม่สำคัญ ใน "การประมวลผลกล่องเครื่องมือ" (เปิดด้วย ctrl + alt + t หรือการประมวลผล -> กล่องเครื่องมือ) ค้นหา "แยกยอด" และเรียกใช้อัลกอริทึมนั้น

เลือกบรรทัด M หรือ ZM หรือรูปหลายเหลี่ยมเรขาคณิตของคุณเป็นเลเยอร์อินพุตและเรียกใช้

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

หากจำเป็นต้องใช้ค่า M เป็นเขตข้อมูลในตารางแอตทริบิวต์เครื่องคำนวณฟิลด์สามารถใช้กับนิพจน์เช่น m($geometry)

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