QGISでポリラインに沿ってランダムなポイントを作成しますか?


11

QGISでポリラインシェープファイルに沿ってランダムなポイントを作成しようとしています。基本的には、「リサーチツール」の「ランダムポイント」ツールと同様ですが、ポリゴンではなくポリライン用です。

ラインファイルをポリゴンシェープファイルに変換してみましたが、一部の領域はポリゴンで埋められますが、他の領域は長いラインタイプのポリゴンのままです。

私はQGISにかなり慣れていないので、Pythonコードに精通していません。


Rを使用する場合は、spatstatパッケージに線上にランダムなポイントを作成するツールが含まれています。
ミチャ

コードをありがとう。誰かがそれを変更するのを手伝って、ランダムな開始点で等間隔に線上に点を配置できるようにしようと思っていませんか?よろしくお願いします。私はpythonの実用的な知識を持っていません。

回答:


14

このコードは、QGISの最新の開発ビルドで動作します。

from qgis.utils import iface
from qgis.core import *
from PyQt4.QtCore import QVariant
import random

def createRandomPoints(count):       
    # Create a new memory layer to store the points.
    vl = QgsVectorLayer("Point", "distance nodes", "memory") 
    pr = vl.dataProvider()  
    pr.addAttributes( [ QgsField("distance", QVariant.Int) ] )
    layer = iface.mapCanvas().currentLayer()

    # For each selected object
    for feature in layer.selectedFeatures():
        geom = feature.geometry()
        length = geom.length()
        feats = []
        # Loop until we reach the needed count of points.
        for i in xrange(0,count):
            # Get the random distance along the line.
            distance = random.uniform(0, length)
            # Work out the location of the point at that distance.
            point = geom.interpolate(distance)

            # Create the new feature.
            fet = QgsFeature()
            fet.setAttributeMap( { 0 : distance } )
            fet.setGeometry(point)
            feats.append(fet)

        pr.addFeatures(feats)
        vl.updateExtents()  

    QgsMapLayerRegistry.instance().addMapLayer(vl)

あなたはPythonコードにあまり慣れていないと言っていましたが、これはかなり簡単に実行できるはずです。上記のコードをファイル(私の名前はと呼ばlocate.pyれます)にコピーし、~/.qgis/pythonWindows 7 C:\Users\{your user name}\.qgis\python\またはWindows XPの場合は、その中に配置します。C:\Documents and Settings\{your user name}\.qgis\python\

ファイルがpythonフォルダーに入ったら、QGISを開き、いくつかの線オブジェクトを選択します。
レイヤー選択

次に、Pythonコンソールを開き、次のコードを実行します。

import locate.py 
locate.createRandomPoints(10)

Pythonコンソール

結果は次のようになります

結果

もう一度実行したい場合は、さらにいくつかの行を選択locate.createRandomPoints(10)して、Pythonコンソールでもう一度実行します。

注:Locate.createRandomPoints(10)ここで10は、ラインごとに生成するポイントの数です


ご助力いただきありがとうございます!コードを保存するための形式がわからない-py拡張子の付いたファイルにするにはどうすればよいですか?これらがかなり基本的な質問であれば申し訳ありません。
Cec.g

テキストを通常のテキストファイルにコピーし、拡張子を.pyとして保存します。
ネイサンW

私はそれを試しましたが、このエラーが表示されます:ImportError:Locate.pyという名前のモジュールはありません
Cec.g

これはファイルパスです:C:\ Users \ Cecily \ .qgis \ python
Cec.g

import locatePythonコンソールで.py を使用する必要はありませんか。
ネイサンW

3

ポリラインを(最低限)バッファリングし、結果のポリゴンでサンプリングを実行できます。他の制限要因がなければ、それ自体で問題なく動作する可能性があります。最小のポイント間間隔、密度などで。

より複雑なケースでは、より密度の高いランダムサンプルを作成し、2番目のステップで適切な(何であれ)ポイントを選択します。同様のことがデンシファイツールで実行できますが、すべてのポイントはポリライン上にあります。

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