私が見つけることができるものから、この正確な状況に対する既存の解決策はないようですが、それでもQGISでこれを実行できるようにしたかったので、Pythonスクリプトに突入しました。
処理アルゴリズムを記述するためのガイドは、https://docs.qgis.org/2.18/en/docs/user_manual/processing/scripts.htmlにあります。
このコードを使用するには、処理ツールボックスを開き、[スクリプト]、[ツール]の順に展開します。[新しいスクリプトを作成]を選択し、以下のコードをコピーしてスクリプトウィンドウに貼り付けます(空白は構文的に重要であるため、Pythonコードをコピーして貼り付けるときは注意してください。問題が発生した場合は、空白を表示するテキストエディターにコードを挿入し、正しくコピーされたことを確認します)。好きな場所に保存してください。ウィンドウの上部にスクリプトの実行ボタンがあります。保存した後、「ファイルからスクリプトを追加」して、「ユーザースクリプト」の下にスクリプトを永続的に置くことができます。
処理ウィンドウが表示されたら、ベクタージオメトリを含むレイヤーを選択し、runを選択します。スクリプトは、「抽出ノード」と同じように動作しますが、呼び出された列を追加し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