レイヤー内の多くのポイントを別のレイヤー内の1つのポイントにリンクするラインレイヤーを作成しますか?


9

300ポイントのポイントレイヤーAと1ポイントのポイントレイヤーBがあるとします

レイヤーAのすべてのポイントをレイヤーBの1つのポイントに接続するラインレイヤーを作成するにはどうすればよいですか?

QGISおよび/またはPostGISの使用。


st_makeline関数を使用してみてください
ziggy

@ziggyはまさにそれを実行しようとしましたが、ドキュメントはあまり明確ではなく、異なるテーブルのジオメトリの例はありません
Luffydude

iveはこの関数を使用したことはありませんが、次のようなものになると思います。selectt1.columns etc、t2.columns etc .. st_makeline(t1.geom、t2.geom)from t1、t2
ziggy

@ziggy select id、geom as st_makeline(a.geom、b.geom)を試行したときにブラケットで構文エラーが発生する
Luffydude

質問全体を投稿する
ziggy

回答:


4

QGISでは、以下からダウンロードできるConnect Pointsプラグインを使用できます。

Plugins > Manage and Install Plugins...

例:

  1. ここにいくつかのレイヤーがlayer_Aあり、たくさんのポイントがあります。layer_B持っています。両方のレイヤーに、値がid完全に同じである整数フィールドが含まれていることを確認してください(たとえば、両方のレイヤーにすべての値がであるフィールドがあります1)。プラグインはこれを使用してポイントを接続します。プラグインが有効になったら、その設定に移動します。

    インターフェース


  1. オプションを選択します。

    設定


  1. 結果:

    結果


このプラグインは実験的なものであるため、Show also experimental pluginsオプションを有効にする必要があることに注意してください(@blue_chipに感謝):

Plugins > Manage and Install Plugins > Settings

2
なぜ私の編集が削除されたのかはわかりませんが、とにかくあなたがそれを読んでいない場合のために:ここでかなり多様な答えがあります。1つのPython、1つのプラグイン、1つのPostgis。プラグイン1に目盛りを付けると、GISの初心者にやさしいため、スマイリーな顔にも対応できます。皆さんありがとう!
ルフィデュード2017年

@Luffydude-全体の質問に多くは追加されなかったため、編集はおそらく削除されましたが、あなたは正しい、非常に異なる答えです!:)
ジョセフ

1
これを見つけるには、実験的なプラグインを有効にする必要があります。夜明けまでもう少し長く見なければなりませんでした。プラグイン>設定>チェック実験的なプラグインも表示
blue_chip

@blue_chip-申し訳ありませんが、私はそれを述べるべきでした。:)で編集します
ジョセフ

3

両方のレイヤーがポイントの場合、以下のクエリは、独自のデータを接続するだけで機能します。150ポイント以上の行を持つ1つのレイヤーと1ポイントを持つレイヤーから線を作成するテストを行いました

drop table if exists line;
create table line as
select layer1.id ,st_makeline(layer1.geom,point.geom) as geom from layer1,point

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


3

この状況から始めると仮定します(1つのポイントレイヤーに1つのフィーチャ、1つのポイントレイヤーに300のフィーチャ):

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

このコードは、Pythonコンソールから実行できます(QGISで対象の2つのレイヤーを読み込んだ後)。

from qgis.core import *
from qgis.PyQt.QtCore import QVariant

layer1 = QgsMapLayerRegistry.instance().mapLayersByName('1point')[0]
crs = layer1.crs().toWkt()
layer2 = QgsMapLayerRegistry.instance().mapLayersByName('300points')[0]

outLayer = QgsVectorLayer('Linestring?crs='+ crs, 'line_output' , 'memory')
prov = outLayer.dataProvider()
fields = layer1.pendingFields()
for field in layer2.pendingFields():
    fields.append(field)
prov.addAttributes(fields)
outLayer.updateFields()

for feature in layer1.getFeatures():
    coords = feature.geometry().asPoint()
    attr1 = feature.attributes()

    for feat in layer2.getFeatures():
        seg_start = coords
        seg_end = feat.geometry().asPoint()
        attr2 = feat.attributes()
        attrs = attr1 + attr2
        outGeom = QgsFeature()
        outGeom.setGeometry(QgsGeometry.fromPolyline([seg_start, seg_end]))
        outGeom.setAttributes(attrs)
        prov.addFeatures([outGeom])

QgsMapLayerRegistry.instance().addMapLayer(outLayer)

この結果を取得するには:

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

レイヤー('1point''300points')の名前を、レイヤーパネルに読み込まれるときの名前に合わせるだけです。

私のアプローチは、両方のレイヤーの機能の数とは無関係に機能します。

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