Automatische Erstellung von senkrechten Linien zwischen einer Punktebene und einer Linienebene

10

Ich verwende QGIS und suche nach einem Skript oder Plugin, mit dem eine große Anzahl senkrechter Linien von einer Punktebene zu Linien in einer separaten Linienebene erstellt werden kann.

Bisher habe ich versucht, die Hub-Distanz-Funktion in MMQGIS (die Linien in Punkte umzuwandeln und die Punkte dann mit dem nächsten Hub zu verbinden) und das entsprechende Tool der QGIS-Geoalgorithmen zu verwenden. Beides hat nicht funktioniert. Beide dauern mehr als 2 Stunden und erzeugen entweder Linien der gesamten Ebene oder Linien, die nicht senkrecht oder mit den Punkten verbunden sind.

Im Bild sehen Sie den aktuellen Status des Projekts. Die senkrechten Linien sollten von den Punkten zur nächsten Linie verlaufen. Am Ende möchte ich Schnittpunkte mit einer Linie zwischen den Punkten und den Ländergrenzen verwenden, um einen Puffer aus vierseitigen Polygonen zu erstellen, der zwei Polygone tief ist. Ich erwähne dies für den Fall, dass es einen einfacheren Weg gibt, dies zu tun. Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein

Ich weiß, dass es einige Beiträge zum Erstellen senkrechter Linien gibt, aber keiner von beiden hat mein Problem gelöst.

Monodie
quelle
1
@ Germán Carrillo Diese Frage ist kein genaues Duplikat der bestehenden Frage "Senkrechte Linien in PyQGIS zeichnen?" ( gis.stackexchange.com/questions/59169/… ), da die Antwort nicht die Methode 'nextSegmentWithContext' in einer Schleife verwendet, um jede Interaktion zwischen Punkten und Feature-Linien zu untersuchen und einen Mindestabstand zum Erstellen einer Linienspeicherschicht zu nehmen. Es ist unmöglich, weil diese Antwort nur Punkte verwendet. Bitte überprüfen Sie es erneut.
Xunilk
1
Ich finde die andere Antwort immer noch eine gute Grundlage, um diese Frage zu lösen. Das OP hätte in der ursprünglichen Frage erwähnen sollen, dass er / sie über verwandte Beiträge informiert war UND uns mitteilen sollte, warum sie / er nicht für ihn / sie gearbeitet haben. Trotzdem gute Antwort, danke fürs posten!
Germán Carrillo

Antworten:

7

Das nächste Skript automatisiert die Erstellung senkrechter Linien zwischen einer Punktebene und einer Linienebene. Die erstellten senkrechten Segmente (Merkmale einer Speicherschicht) verlaufen von den Punkten zum nächsten Merkmal der Linienschicht.

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)

Ich habe es mit einer Situation ausprobiert, die der in der Frage dargestellten sehr ähnlich ist:

Geben Sie hier die Bildbeschreibung ein

Nach dem Ausführen des Codes in der Python-Konsole von QGIS wurde Folgendes erhalten:

Geben Sie hier die Bildbeschreibung ein

xunilk
quelle
Hat wunderbar funktioniert. Ich muss es ein wenig aufräumen, da ich einige Außenseiter wie in Ihrem Beispiel bekomme, aber ansonsten hat es nur Sekunden gedauert und sieht perfekt aus. Vielen vielen Dank.
Monody
4

Hier ist derselbe Code wie in der akzeptierten Antwort, der nur für Python 3.x (oder QGIS v3.x) angepasst wurde:

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)
sys49152
quelle