Angenommen, es gibt Punktebene A mit 300 Punkten und Punktebene B mit einem Punkt
Wie erstelle ich eine Linienebene, die alle Punkte in Ebene A mit dem einen Punkt in Ebene B verbindet?
Verwenden von QGIS und / oder PostGIS.
Angenommen, es gibt Punktebene A mit 300 Punkten und Punktebene B mit einem Punkt
Wie erstelle ich eine Linienebene, die alle Punkte in Ebene A mit dem einen Punkt in Ebene B verbindet?
Verwenden von QGIS und / oder PostGIS.
Antworten:
In QGIS können Sie das Connect Points- Plugin verwenden, das Sie herunterladen können von:
Plugins > Manage and Install Plugins...
Beispiel:
Hier sind ein paar Schichten, layer_Ahat eine Reihe von Punkten; layer_Bhat einen. Stellen Sie sicher, dass beide Ebenen ein ganzzahliges Feld enthalten, in dem die Werte genau gleich sind (z. B. haben beide Ebenen ein idFeld, in dem alle Werte vorhanden sind 1). Das Plugin verwendet dies, um Ihre Punkte zu verbinden. Wenn Ihr Plugin aktiviert ist, gehen Sie zu seinen Einstellungen:
Beachten Sie, dass dieses Plugin experimentell ist und Sie die Show also experimental pluginsOption aktivieren müssen (dank @blue_chip ):
Plugins > Manage and Install Plugins > Settings
Wenn beide Ebenen Punkte sind, sollte die folgende Abfrage funktionieren. Fügen Sie einfach Ihre eigenen Daten ein. Ich habe einen Test mit dem Erstellen von Linien aus 1 Ebene mit mehr als 150 Punktzeilen und einer Ebene mit 1 Punkt durchgeführt
drop table if exists line;
create table line as
select layer1.id ,st_makeline(layer1.geom,point.geom) as geom from layer1,point
Angenommen, Sie gehen von dieser Situation aus (eine Punktebene mit einem Merkmal und eine Punktebene mit 300 Merkmalen):
Sie können diesen Code über die Python-Konsole ausführen (nachdem Sie die beiden interessierenden Ebenen in QGIS geladen haben):
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)
um dieses Ergebnis zu erhalten:
Sie müssen nur die Namen für die Ebenen ( '1point'und '300points') an die Namen anpassen, mit denen sie im Ebenenbedienfeld geladen werden .
Mein Ansatz funktioniert unabhängig von der Anzahl der Features in beiden Ebenen.