จากสิ่งที่ฉันสามารถพบได้ดูเหมือนจะไม่เป็นทางออกที่มีอยู่สำหรับสถานการณ์ที่แน่นอนนี้ แต่ฉันยังต้องการที่จะสามารถทำได้ใน 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