300ポイントのポイントレイヤーAと1ポイントのポイントレイヤーBがあるとします
レイヤーAのすべてのポイントをレイヤーBの1つのポイントに接続するラインレイヤーを作成するにはどうすればよいですか?
QGISおよび/またはPostGISの使用。
300ポイントのポイントレイヤーAと1ポイントのポイントレイヤーBがあるとします
レイヤーAのすべてのポイントをレイヤーBの1つのポイントに接続するラインレイヤーを作成するにはどうすればよいですか?
QGISおよび/またはPostGISの使用。
回答:
QGISでは、以下からダウンロードできるConnect Pointsプラグインを使用できます。
Plugins > Manage and Install Plugins...
例:
ここにいくつかのレイヤーがlayer_A
あり、たくさんのポイントがあります。layer_B
持っています。両方のレイヤーに、値がid
完全に同じである整数フィールドが含まれていることを確認してください(たとえば、両方のレイヤーにすべての値がであるフィールドがあります1
)。プラグインはこれを使用してポイントを接続します。プラグインが有効になったら、その設定に移動します。
このプラグインは実験的なものであるため、Show also experimental plugins
オプションを有効にする必要があることに注意してください(@blue_chipに感謝):
Plugins > Manage and Install Plugins > Settings
この状況から始めると仮定します(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'
)の名前を、レイヤーパネルに読み込まれるときの名前に合わせるだけです。
私のアプローチは、両方のレイヤーの機能の数とは無関係に機能します。