QGISで等距離点を作成しますか?


22

QGISで道路に沿った特定の距離(既存のレイヤー)にポイント(新しいレイヤー)を作成しようとしています。ArcGIS Desktopを使用して、郡レベルでメーターごとにレギュラーポイントを作成しますか? ArcGISのソリューションを提供します。QGISでこれを達成するにはどうすればよいですか?QGISを使用してポイントをベクターレイヤーに追加しますか?ポイントの作成方法を説明しますが、距離については何もしません。


(私は変換を知らなかったため、長さの異なる尺度で提案されたソリューションを適用しました)@Nathansのソリューションはある程度働いていました、私は得ました...

ここに画像の説明を入力してください。ここでは、これらの等距離点の投影は元の線とは異なります。

@underdarkの提案で、私は得た

この画像ポイントは等距離ではないようです。私は理解していないこれらの両方のいくつかの投影の問題があると思います。



2
いくつかのポイント。まず、ラインは投影されたCRS(緯度/経度ではない)にある必要があります。第二に、あなたのラインは本当のポリラインですか?個々の行の文字列で構成される行では、どのメソッドも適切に動作しないと思います。ニック。
nhopton

また、私のコードでは、import locate行を複数回呼び出す必要はありません。一度だけ、あなたが呼び出すことができますそれを呼び出すlocate.pointsAlongLine(30)必要な限り
ネイサンW

別の方法(ここでいくつかの回答で示唆されている六分儀がQGIS <2.0のみであると仮定)、QChainageと呼ばれるプラグインを使用することもできます。
アンディ14年

回答:


14

注:現在、QGISプラグインがありますQChainage。これ以上のことをすべて行います。以下のコードはQGIS 2.0以降では古くなっています。

ファイルに貼り付けてQGIS内で使用できるPythonコードを次に示します。

QGISには、APIにライナーリファレンスを実行するメソッドがありますが、正しく動作させることができませんでしたが、コードの作成者に連絡して、何か間違っているのかどうかを確認します。

とりあえず便利な Pythonライブラリをインストールする必要があります。また、http://toblerity.github.com/shapely/manual.htmlにすばらしいドキュメントがあります。

これは、次の例http://toblerity.github.com/shapely/manual.html#interoperationで使用しているセクションです。

次のコードのほとんどは、フィーチャ、レイヤーを作成し、wkbとwktから変換するだけのQGIS定型コードです。コアビットは、point = line.interpolate(currentdistance)ラインに沿った距離でポイントを返すものです。行がなくなるまでこれをループでラップします。

import qgis
from qgis.core import *
from PyQt4.QtCore import QVariant
from shapely.wkb import loads
from shapely.wkt import dumps

vl = None
pr = None

def createPointsAt(distance, geom):
    if distance > geom.length():
        print "No Way Man!"
        return

    length = geom.length()
    currentdistance = distance
    feats = []  

    while currentdistance < length: 
        line = loads(geom.asWkb())
        point = line.interpolate(currentdistance)
        fet = QgsFeature()
        fet.setAttributeMap( { 0 : currentdistance } )
        qgsgeom = QgsGeometry.fromWkt(dumps(point))
        fet.setGeometry(qgsgeom)
        feats.append(fet)
        currentdistance = currentdistance + distance

    pr.addFeatures(feats)
    vl.updateExtents()

def pointsAlongLine(distance):
    global vl
    vl = QgsVectorLayer("Point", "distance nodes", "memory")
    global pr
    pr = vl.dataProvider()  
    pr.addAttributes( [ QgsField("distance", QVariant.Int) ] )
    layer = qgis.utils.iface.mapCanvas().currentLayer()
    for feature in layer.selectedFeatures():
        geom = feature.geometry()
        createPointsAt(distance, geom)

    QgsMapLayerRegistry.instance().addMapLayer(vl)

上記のコードをコピーしてファイルに貼り付け、~./qgis/pythonディレクトリ内のLocate.pyを呼び出し(Pythonパスにあるため)、QGIS内のPythonコンソールでこれを実行します。

 import locate
 locate.pointsAlongLine(30)

次のように、選択したラインに沿って30メートルごとにポイントを持つ新しいポイントレイヤーが作成されます。

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

注:コードはかなり荒いため、クリーンアップが必要になる場合があります。

編集:最新のQGIS開発ビルドは、これをネイティブに実行できるようになりました。

whileループを次のcreatePointsAtように変更します。

 while currentdistance < length: 
    point = geom.interpolate(distance)
    fet = QgsFeature()
    fet.setAttributeMap( { 0 : currentdistance } )
    fet.setGeometry(point)
    feats.append(fet)
    currentdistance = currentdistance + distance

削除できます

from shapely.wkb import loads
from shapely.wkt import dumps

@Nathanに感謝します。PythonのShapelyパッケージを取得できませんでした。Python 2.7をインストールしましたが、Shapelyインストーラーは、Python 2.7がレジストリにないことを示しています。Shapelyをインストールする別の方法はありますか。
Stat-R

stackoverflow.com/questions/3652625 / ...をフォローし、呼び出しlocateと使用のために上記の2行を入力しましたが、それでも等距離点は取得できませんでした。また、私はPythonの初心者ですので、コードを実行する場所を理解していませんでした(1)qgisディレクトリのpythonまたは(2)C:\ Python27 \?
Stat-R

どのOSを使用していますか?
ネイサンW

Windows 7 Professional
Stat-R

pythonファイルを作成C:\Users\{you user name}\.qgis\python開いている場合、その後、再起動QGIS、および`Plugins-> Pythonコンソールのに行く. Load a line layer, select a line a call 輸入locate`とlocate.pointsAlongLine(30)
ネイサンW

5

QGIS GRASSプラグインv.to.pointsツールを使用して、一定の間隔で線に沿ってポイントを作成できます

# convert line to points; dmax = distance between points
v.to.points -i -v -t in=road out=road_pts type=line dmax=90

dmaxを100として使用し、それぞれの結果の投影は次のとおりです。(CRSがそれ自体でどのように割り当てられているかわかりません。)CRS of Original Shape file, the line = EPSG:26915 - NAD83 / UTM zone 15N, CRS of Grass line vector obtained using v.in.ogr = EPSG:4269 - NAD83, CRS of Grass points vector obtained using v.to.points = EPSG:4326 - WGS 84
Stat-R

QGIS-> Sextante-> GRASS-> v.to.points
markusN

5

道路線に沿って一定間隔で連鎖をプロットしたい場合、「ラインからのプロファイル」プラグインを使用してこれを行うことができます。road lineレイヤーの下にDEMが必要ですが、手順は簡単で非常に簡単です。ニック。

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


これもかなり簡単で簡単な方法です、ありがとう!
Shepherdjo

2

Shapely(Python)/ GEOS(C ++)データモデルは平面で定義されることに注意してください。そのため、このshapely.geometry.LineString.interpolate(distance)方法を使用してポイントがGPS位置(緯度、経度)で構成されている場合、指定されLineStringたに沿ったユークリッド距離でGPS位置を出力します。

Shapely's interpolate()geos::linearref::LengthIndexedLineextractPointメソッドを使用するGEOSのクラスに基づいています。

緯度経度平面での等間隔の補間は、比較的短い距離を考慮したアプリケーションには十分であると思われます。ただし、一般的には、GISアプリケーション(WGS84で定義されている)の球体上の距離を考慮する必要があります。

Shapelyモジュールを使用する2つの回避策が考えられます。

  • LineStringプロパティはすべて与えられたポイントとそれらに沿って線形補間された曲線です。おそらく、補間された曲線にアクセスし、ユークリッド距離に代わる次の線積分を実装するメンバーを作成できます。区分的連続曲線を使用すると、半径に沿って曲線に沿って隣接する円の交点を計算することにより、所望の点を得ることができるため、このアプローチが好き r = radian_measure(arc_length) = arc_length / Rです。
  • 適切な距離関数(たとえば、haversine式)を使用して、(Shapelyコードに触れることなく)独自の補間方法をコーディングします。

これを実現するには、以下のStackOverflowの質問と特にこの回答を参照してください。

曲線に沿って等距離の点を生成することができます。しかし、あなたが本当の答えに何を望んでいるかについて、より多くの定義がなければなりません。申し訳ありませんが、このタスクのために作成したコードはMATLABにありますが、一般的なアイデアを説明できます。3つの可能性があります。

まず、点は単純なユークリッド距離の点で隣人から真に等距離にあるのでしょうか?そのためには、固定半径の円と曲線上の任意の点で交差点を見つける必要があります。次に、曲線に沿って進みます。

次に、距離が曲線自体に沿った距離を意味することを意図している場合、曲線が区分的線形曲線である場合、問題は再び簡単です。線分上の距離は簡単に測定できるため、曲線に沿って進むだけです。

最後に、曲線を3次スプラインにしたい場合、これも信じられないほど難しくありませんが、もう少し手間がかかります。ここでの秘trickは次のとおりです。

  • 曲線に沿ったポイントからポイントへの区分線形アーク長を計算します。それをtと呼ぶ 一対の3次スプラインx(t)、y(t)を生成します。

  • xとyをtの関数として微分します。これらは立方体のセグメントであるため、これは簡単です。導関数は区分的に
    二次関数になります。

  • odeソルバーを使用して曲線に沿って移動し、微分アーク長関数を統合します。MATLABでは、ODE45はうまく機能しました。

したがって、1

sqrt((x')^2 + (y')^2)

繰り返しになりますが、MATLABでは、ODE45を設定して、関数が指定された特定のポイントを横切る場所を特定できます。

MATLABのスキルがタスクに応じている場合は、interparcのコードで詳細を確認できます 。それはかなりよくコメントされたコードです。

3http : //www.mathworks.com/matlabcentral/fileexchange/34874-interparc


1

Sextanteには、役に立つツールがあります。SextanteはQgisプラグインリポジトリからダウンロードできます。 「ラインレイヤーのツール」 「等間隔のポイントへのライン」を

探してください


このプラグインはQGIS 2または3のために利用可能であるようには見えない
マーティン・バーチ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.