QGISを使用して、ラインに沿って指定された距離にポイントを作成しますか?


20

QGISを使用して、ラインに沿って、指定された距離にポイントを作成します。SEXTANTE Toolboxで2つのGRASSツールを見つけました。

  • v.to.points
  • v.segment

v.to.pointsを試し、マップ単位でポイント間の最大距離を100に設定して、これを取得しました:

線に沿った点

近くで見る

2枚目の写真は、上の写真からよく見えます。結果は私が望むものでしたが、より少ないポイントを取得したいのですが、最大距離を1000または1000000に設定しても、結果は同じでした。

v.segmentを使用しようとしましたが、セグメントルールを含むファイルがありませんでした。

Underdarkからアドバイスがあり、間隔を指定してDensifyジオメトリを試しました。最初に、入力と同じポリラインシェープファイルを作成し、次に抽出ノードを使用してそれらのポイントを取得しようとしました。しかし、結果は、距離間隔の設定に関係なく、v.to.pointsを使用した場合と同じでした。

線に沿って、指定された距離にポイントを作成するにはどうすればよいですか?



この有益なアドバイスをくれてありがとう!スクリプトを使用する場合、Pythonをインストールする必要がありますか?または、新しいバージョンのQGIS 2.0では、既にこの関数が組み込まれていますか?
ハインツ

5
QGIS 2.0には、QChainageと呼ばれるプラグインがあります。プラグインを取得してインストールします。
ウィリー

「Sextante」ツールボックスは、QGIS 2.2.0+では「Processing」と呼ばれ、間隔が指定された「Densifyジオメトリ」はProcessingToolbox / QGISGeoalgorithms / VectorGeometryToolsメニューの下にあります。選択した間隔よりも近い
Dave X 14

回答:


20

Pythonコンソールで:

1)crea_mem_layer.pyでメモリ層クラス(属性なしの完全なクラス)を作成します)

class Create_vlayer(object):
    '''creation of a virtual layer''' 
     def __init__(self,nom,type):
         self.type=type
         self.name = nom
         self.layer =  QgsVectorLayer(self.type, self.name , "memory")
         self.pr =self.layer.dataProvider() 
     def create_point(self,geometry):
         # add point to the layer
         self.seg = QgsFeature()
         self.seg.setGeometry(QgsGeometry.fromPoint(geometry))
         self.pr.addFeatures([self.seg])
         self.layer.updateExtents()
     @property
     def display_layer(self):
         #end of layer and display layer 
         QgsMapLayerRegistry.instance().addMapLayers([self.couche])

2)ベクトル代数関数(algèbre_vect_PyQGIS.pyから)

import math 
def mag(point):
    # magnitude of a vector
    return math.sqrt(point.x()**2 + point.y()**2)
def diff(point2, point1):
    # substraction betwen two vector
    return QgsPoint(point2.x()-point1.x(), point2.y() - point1.y())
def length(point1,point2):
    # with PyQGIS: sqrDist
    return math.sqrt(point1.sqrDist(point2))

3)方向余弦

def dircos(point):
    cosa = point.x() / mag(point)
    cosb = point.y()/ mag(point)
    return cosa,cosb

4)ラインまたはラインセグメントの処理

def pairs(list):
    # list pairs iteration 
    for i in range(1, len(list)):
    yield list[i-1], list[i]

layer = qgis.utils.iface.activeLayer()
# interval between points
interval = 5 m
# create virtual layer
gen_pt  = Create_vlayer("mid5", "Point")

for elem in layer():
    line = elem.geometry()
    for seg_start, seg_end in pairs(line.asPolyline()):
       line_start = QgsPoint(seg_start)
       line_end = QgsPoint(seg_end)
       # mid point = vector coordinates [x2-x1,y2-y1]
       pointm =diff(line_end, line_start)
       # direction cosines of the segment
       cosa,cosb = dircos(pointm)
       # length of the segment
       lg = length(line_end, line_start)
       # generate and add points to the virtual layer 
       for i in range(interval,lg,interval):
           gen_pt.create_point(QgsPoint(line_start.x()  + (i * cosa), line_start.y() + (i*cosb)))

# display layer
gen_pt.display_layer

結果

ポリライン、ShapelyまたはPyQGIS2を使用した等距離点、方向余弦

ポリライン格好良いvector_algebra

次に、間隔を調整します


ジャンクションを見ると、ライン上に既存のノードポイントが保持されているように見えるため、ライン上に既にある頂点よりも低い解像度にそれらを細くすることはできません。OPのような複雑で曲線のある線では、これらの手順はあまり効果がありません。
デイブX 14

スクリプトを完全に適合させることができます。
遺伝子14

17

QChainageと呼ばれるプラグインがあり、これはまさにあなたが望むことをします。間隔距離を指定すると、プラグインは指定された間隔でラインに沿ってポイントを作成します。


*これはラインノードをキャプチャしないため、必要な場合はジオメトリツールも使用する必要があります。ノードを抽出し、チェーンポイントに追加します。
ジェイソン14年

1
GIS SEへようこそ!ここにコメントとして追加した情報は、その下にある編集ボタンを使用することで、実際の回答に組み込まれると思います。コピー/貼り付けでこれを行うことができ、その隣にある小さな十字をクリックしてコメントを削除できます。
PolyGeo

11

Sextante Densifyジオメトリツールを変更して特定の距離を受け入れるスクリプトを作成しました。intervalを指定すると、Densifyジオメトリと呼ばれます

Densifyを実行した後、ノードの抽出ツールを使用してポイントを抽出できます。

Githubから入手でき、インストール手順は私のブログにあります。

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


このツールは、SextanteをインストールせずにQGISで利用できるようです(QGIS 2.18.7)。メニューには表示されませんでしたが、Processing Toolboxでの検索中にQGISジオアルゴリズムとして検出されました。
ネイトワナー

0

pythonスクリプトを使用したくない場合は、「Profile from line」プラグインをインストールして使用するだけで、ラスター値列を無視/削除できます。連鎖は、サンプリング間隔に設定したものになります。


QGIS 2.2.0では、「プロファイルツール」、「qProf」および「VoGIS-ProfilTool」が表示されますが、「ラインからのプロファイル」ツールは表示されません。
デイブX 14

0

これが安定リリースであるかどうかはよくわかりませんが、1.9アルファ版のGeoalgorithims-> Vectorの下のsextanteツールボックスには、「ラインをポイントに変換」オプションがあります。ただし、ラインに沿った距離用のフィールドを追加した場合は素晴らしいことです。

興味深いことに、ベクターレイヤーからNAMEフィールドが追加されました。

Nathan WoodrowのPythonスクリプトを動作させようとしましたが、私はpythonを使いません。そして、一般的なコードではそうです。


0

私はこの問題に長い間苦労していましたが、最終的にはQChainageを使用して探していたものを多少なりとも得ました。私が共有したいのは、他の人を助けることができるものです。ライン上でSAGAジオプロセシングディゾルブツールを使用すると、QChainageが誤った結果を生成します。別のディゾルブツールを使用すると、正常に機能します。

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