Erstellen einer Linienebene, die viele Punkte in der Ebene mit einem Punkt in einer anderen Ebene verknüpft?

9

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.

Ruffydude
quelle
Versuchen Sie es mit der Funktion st_makeline
ziggy
@ziggy hat versucht, genau das zu tun, aber die Dokumentation ist nicht sehr klar und es gibt kein Beispiel mit Geometrien aus verschiedenen Tabellen
Luffydude
Ich habe diese Funktion nie benutzt, aber ich würde mir vorstellen, dass es so etwas sein würde: Wählen Sie t1.columns usw., t2.columns usw. aus. st_makeline (t1.geom, t2.geom) von t1, t2
ziggy
@ziggy bekommen Syntaxfehler in den Klammern, als ich versuchte, id, geom als st_makeline (a.geom, b.geom) auszuwählen,
Luffydude
poste

Antworten:

4

In QGIS können Sie das Connect Points- Plugin verwenden, das Sie herunterladen können von:

Plugins > Manage and Install Plugins...

Beispiel:

  1. 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:

    Schnittstelle


  1. Wählen Sie die Optionen:

    die Einstellungen


  1. Ergebnis:

    Ergebnis


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
Joseph
quelle
2
Ich bin mir nicht sicher, warum meine Bearbeitung gelöscht wurde, aber falls Sie sie nicht gelesen haben: Wow, Leute, hier gibt es einige ziemlich unterschiedliche Antworten. Ein Python, ein Plugin und ein Postgis. Geben Sie dem Plugin das Häkchen, da es das GIS-Noob-freundlichste ist und auch wegen des Smileys. Vielen Dank an alle!
Ruffydude
@Luffydude - Ihre Bearbeitung wurde wahrscheinlich gelöscht, weil sie nicht viel zu Ihrer Gesamtfrage beigetragen hat, aber Sie haben Recht, sehr unterschiedliche Antworten! :)
Joseph
1
Sie müssen experimentelle Plugins aktivieren, um dieses zu finden. Ich musste etwas länger schauen, bis es mir dämmerte. Plugins> Setting> Check Zeige auch experimentelle Plugins
blue_chip
@blue_chip - Entschuldigung, das hätte ich erwähnen sollen. Wird das in bearbeiten :)
Joseph
3

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

Geben Sie hier die Bildbeschreibung ein

zickig
quelle
3

Angenommen, Sie gehen von dieser Situation aus (eine Punktebene mit einem Merkmal und eine Punktebene mit 300 Merkmalen):

Geben Sie hier die Bildbeschreibung ein

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:

Geben Sie hier die Bildbeschreibung ein

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.

mgri
quelle