QGISを使用して属性データに従ってラインに沿ってポイントを作成しますか?


9

QGISの線に沿って等間隔のポイントを作成したいのですが、各ラインには、「ピース」と呼ばれる列にそれらのポイント上にあるポイントの数の属性があり、これらの値はほとんどすべての場合で異なります。

ここに画像の説明を入力してください

私の最初の考えは、属性テーブルの値に従ってラインを等分に分割し、ラインの重心にポイントを置くことでしたが、できませんでした。

この質問は私がやりたいことと非常によく似ていますが、QGISの質問ではありません。

複数のポリラインに沿って同じ数のポイントを作成するにはどうすればよいですか?

このトピックのstackexchangeで見つけることができる最も類似した質問は、ポイント間の特定の距離に関するもので、フィールドに簡単に入力できる数値です(線に沿ってポイント作成する、または線をポイントに変換するアルゴリズムの場合など)。属性テーブルの特定のデータについて。そのような目的での使用方法を見つけることができませんでした。

ラインの始点と終点にポイントがない場合は素晴らしいですが、ライン上に属性テーブルと同じ数のポイントがある場合は、ちょうど月の上にいます。

回答:


10

これは、トリックを実行する必要がある簡単なPyQGISスクリプトです

from qgis.core import QgsFeature, QgsVectorFileWriter, QgsGeometry

def create_points(feat,writer):
    geometry = feat.constGeometry()
    if not geometry:
        return
    length = geometry.length()
    # -----------------
    # change 'num_points' to match your field name for the number of points field
    # -----------------
    num_points = feat['num_points']
    delta = length / ( num_points + 1.0 )
    distance = 0.0
    for i in range(num_points):
        distance += delta
        output_feature = QgsFeature(feat)
        output_feature.setGeometry( geometry.interpolate(distance) )
        writer.addFeature(output_feature)

layer = iface.activeLayer()

# ---------------
# change 'd:/test_points.shp' to desired output file name
# ---------------

writer = QgsVectorFileWriter('d:/test_points.shp',None, layer.fields(), QGis.WKBPoint, layer.crs())

for f in layer.getFeatures():
    create_points(f,writer)

del writer

num_pointsデータに合わせてフィールド名と出力ファイル名を変更し、入力レイヤーを選択して、Pythonコンソールで実行します。


何らかの理由で、このスクリプトをコピーした後、エラーメッセージがポップアップ表示されます:ファイル "<input>"、1行目length = geometry.length()^ IndentationError:予期しないインデント
Skye

1
ndawson-pythonコンソールに簡単にコピー/貼り付けできるようにフォーマットを編集しましたが、気に入らない場合は自由にロールバックしてください=)。@Skye-コードをテキストエディターにコピーし、フィールド名と出力パスを変更してから、もう一度pythonコンソールにコードをコピーすることをお勧めします。うまくいけば、もうインデントエラーはないはずです。
ジョセフ

1
お二人ありがとうございます!! :) ndawson、あなたのスクリプトは素晴らしく、@ Joseph、あなたのフォーマット編集はとても役に立ちました!さらに、出力パスで「\」ではなく「/」マークを使用する必要があることがわかりました。
スカイ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.