ポイントレイヤーとラインレイヤーの間の垂線の自動作成


10

QGISを使用していて、ポイントレイヤーから別のラインレイヤーのラインに多数の垂直線を作成できるスクリプトまたはプラグインを探しています。

これまで、MMQGISのハブ距離関数(ラインをポイントに変換し、ポイントを最も近いハブに接続する)とQGIS地理アルゴリズムのそれぞれのツールを使用してみました。どちらもうまくいきませんでした。どちらも2時間以上かかり、すべてのレイヤーの線、またはポイントに垂直または接続されていない線を作成します。

写真では、プロジェクトの現在のステータスを確認できます。垂直線は、ポイントから最も近い線まで延びる必要があります。最後に、ポイントと国境を結ぶ線との交点を使用して、2ポリゴンの深さである4辺ポリゴンのバッファを作成します。これを行う簡単な方法がある場合に備えて、これについて触れます。 ここに画像の説明を入力してください ここに画像の説明を入力してください

垂線を作成する方法についていくつかの記事があることは知っていますが、どちらも私の問題を解決しませんでした。


1
@GermánCarrilloこの質問は、「PyQGISで垂直線を引く?」という既存の質問とまったく同じではありません。(gis.stackexchange.com/questions/59169/…)答えは、ループ内で「closestSegmentWithContext」メソッドを使用していないため、最小距離を取ってラインメモリレイヤーを作成するために、ポイントとフィーチャライン間の各相互作用を探索しません。この回答はポイントのみを使用しているため、不可能です。もう一度確認してください。
xunilk 2017年

1
私はまだこの質問を解決するために他の答えが良い根拠を見つける。OPは元の質問で、関連する投稿を知っていて、なぜ彼らが彼/彼女のために働かなかったのかを私たちに話してくれたことを述べるべきでした。それでも、良い回答です。投稿ありがとうございます。
ヘルマン・カリージョ

回答:


7

次のスクリプトは、ポイントレイヤーとラインレイヤーの間の垂線の作成を自動化しました。作成された垂直セグメント(メモリレイヤーのフィーチャ)は、ポイントからラインレイヤーの最も近いフィーチャまで続きます。

mapcanvas = iface.mapCanvas()

layers = mapcanvas.layers()

p_lyr = layers[0]
l_lyr = layers[1]

epsg = p_lyr.crs().postgisSrid()

uri = "LineString?crs=epsg:" + str(epsg) + "&field=id:integer""&field=distance:double(20,2)&index=yes"

dist = QgsVectorLayer(uri, 
                      'dist', 
                      'memory')

QgsMapLayerRegistry.instance().addMapLayer(dist)

prov = dist.dataProvider()

lines_features = [ line_feature for line_feature in l_lyr.getFeatures() ] 
points_features = [ point_feature for point_feature in p_lyr.getFeatures() ]

feats = []

for p in points_features:

    minDistPoint = min([l.geometry().closestSegmentWithContext( p.geometry().asPoint() ) for l in lines_features])[1]
    feat = QgsFeature()
    feat.setGeometry(QgsGeometry.fromPolyline([p.geometry().asPoint(), minDistPoint]))
    feat.setAttributes([points_features.index(p),feat.geometry().length()])
    feats.append(feat)

prov.addFeatures(feats)

私は質問で提示されたのと非常に似た状況でそれを試しました:

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

QGISのPythonコンソールでコードを実行した後、コードが取得されました。

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


驚異的に働いた。私はあなたの例のようにいくつかの不適合を取得するので、それを少し片付ける必要がありますが、それ以外は数秒しかかからず、完璧に見えます。本当にありがとう。
Monody 2017年

4

以下は、Python 3.x(またはQGIS v3.x)でのみ機能するように調整された、承認済みの回答と同じコードです。

from qgis.core import QgsProject

mapcanvas = iface.mapCanvas()

layers = mapcanvas.layers()

p_lyr = layers[0]
l_lyr = layers[1]

epsg = p_lyr.crs().postgisSrid()

uri = "LineString?crs=epsg:" + str(epsg) + "&field=id:integer""&field=distance:double(20,2)&index=yes"

dist = QgsVectorLayer(uri,
                      'dist',
                      'memory')

QgsProject.instance().addMapLayer(dist)

prov = dist.dataProvider()

lines_features = [ line_feature for line_feature in l_lyr.getFeatures() ]
points_features = [ point_feature for point_feature in p_lyr.getFeatures() ]

feats = []

for p in points_features:

    minDistPoint = min([l.geometry().closestSegmentWithContext( p.geometry().asPoint() ) for l in lines_features])[1]
    feat = QgsFeature()
    feat.setGeometry(QgsGeometry.fromPolylineXY([p.geometry().asPoint(), minDistPoint]))
    feat.setAttributes([points_features.index(p),feat.geometry().length()])
    feats.append(feat)

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