線形参照用のM値を持つQGIS抽出ノード


10

SQLiteデータベースにMultiLineStringZMレイヤーがあり、頂点のメジャーまたはM値を視覚化しようとしています。QGISでこれを行う方法に関する情報を調べてみましたが、収集できたすべてのことは、これをラインストリングレイヤーから直接行うことはできず、ポイントを別のレイヤーに抽出する必要があることです。

マルチラインストリングレイヤーの頂点を表すマルチポイントレイヤーを作成するためにVector-> Geometry Tools-> Extract nodesを使用しましたが、プロセスは頂点のm値を失います。m値をポイントの属性として保存するか、何か他の方法でm値を保持する必要がありますか?

内部的には、ラインストリングをポイントシェープファイルに変換するコマンドラインツールがあり、m値が各ポイントの属性として保存されています。これを使用して、頂点にm値が割り当てられていることを確認しました。それは私がしなければならない場合ですが、可能であれば、これをQGISの内部で直接実行できればよいでしょう。

編集 -私が上で言ったことを繰り返しますが、GDALライブラリを使用する私が探している結果を達成できるコマンドラインツールがあるという事実を強調します。 PyQGISは私が探している答えではありません。組み込みツール、QGIS用にすぐに作成できるプラグイン、またはMultiLineStringZMまたはLineStringZMジオメトリからm値を抽出(作成/生成ではなく)して視覚化できる完全なスクリプトを探しています。


LRSプラグインを使用してm値を取得できます。ノードを抽出し、LRSプラグインまたはラインツールに沿った距離を使用して、ラインストリングからメジャーを取得する必要があります。
jbalk

@jbalk LRSプラグインとQChainageプラグインを試してみましたが、これらのプラグインは両方とも定期的にメジャーを生成するように設定されているようです。 。
TJロックフェラー

LRSプラグインのページから:-プラグインは、ポイントの測定、定時イベントおよび線形イベントの作成、計算のサポートをサポートしています- 可能であれば 、このサイトのLRSプラグインについてWebサイト blazek.github.io/lrsに質問してくださいそれを理解しないでください。
jbalk

調整するまでLRSプラグインを使用して何もできないように見えます。これを調整するには、属性として保存されているメジャーを持つポイントレイヤーが必要です。これは、まさにMultiLineStringZMから取得しようとしているものです。なので、この状況では役に立たないと思います。
TJロックフェラー

校正に使用するラインに沿って1000mごとにポイントを作成できます。または、QGIS内のSAGAおよびGRASSツールボックスのラインツールに沿った距離を見て、m値を取得します。
jbalk 2017年

回答:


6

私が見つけることができるものから、この正確な状況に対する既存の解​​決策はないようですが、それでも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

4

QGIS 3.0以降では、この作業は簡単です。"Processing Toolbox"(ctrl + alt + tまたはProcessing-> Toolboxで開く)で "Extract vertices"を検索し、そのアルゴリズムを実行します。

MまたはZMラインまたはポリゴンジオメトリを入力レイヤーとして選択して実行します。

頂点は、元のジオメトリの内容に応じて、MおよびZの値がそのまま抽出されます。

属性テーブルのフィールドとしてM値が必要な場合、フィールド計算機を次のような式で使用できます。 m($geometry)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.