Mehrere Punkte an der Linie in QGIS ausrichten?

11

Ich möchte mehrere Punkte an einer Linie oder Linien innerhalb einer Ebene ausrichten, wobei eine bestimmte Toleranz oder ein Puffer um die Linienobjekte verwendet wird. Bitte beachten Sie die beigefügte Beispielskizze.

In diesem Beispiel befinden sich die Punkte, die der Linie im VOR dem Bild am nächsten liegen, innerhalb von 5 Karteneinheiten der Linie, während die äußersten Punkte mehr als 10 Karteneinheiten entfernt sind. Ich möchte die nächstgelegenen Punkte auf der nächsten Linie einrasten lassen und dabei eine Toleranz von 5 Karteneinheiten verwenden, um das Ergebnis im AFTER-Bild zu erzielen.

Geben Sie hier die Bildbeschreibung ein

Ed Camden
quelle
Der Punkt muss also 0 Karteneinheiten seitlich der Linie sein, aber interessiert es Sie, wo der Punkt in Längsrichtung der Linie in Bezug auf die ursprüngliche Position des Punkts endet?
Joe
Das ideale Szenario wäre, die Punkte über einen senkrechten Pfad zur Linie zu verschieben. Es ist jedoch beabsichtigt, relativ kleine Toleranzen zu verwenden. Wenn die Punkte in Längsrichtung oder in Breitenrichtung in Richtung der Linie bewegt werden, werden die Punkte nicht so stark von einer bevorzugten senkrechten Position versetzt.
Ed Camden
Ich bin mir nicht sicher, ob dies der beste Weg ist, aber ein Weg, den ich mir vorstellen kann, besteht darin, Python-Code zu schreiben, um die beiden Datensätze zu analysieren und einige Punktkoordinaten zu erzeugen. Wenn Sie denken, dass Sie dies möchten, lassen Sie es mich wissen und ich kann Ihnen eine Antwort geben. Wenn beispielsweise für jeden Punkt der Absolutwert von lat dist von der Linie <= 5 Einheiten ist, dann ist der laterale Abstand = 0. Sie müssten eine gdal-Bibliothek importieren, um die x, y-Werte in Koordinaten umzuwandeln. Siehe Kommentare in: gis.stackexchange.com/questions/185445/…
Joe
Mit PyQGIS kann eine Speicherschicht erzeugt werden, in der Punkte gemäß der zuvor berücksichtigten Toleranz von 5 Karteneinheiten und einem senkrechten Pfad zur Linie gefangen werden. Siehe meine Antwort.
Xunilk

Antworten:

15

In der (unveröffentlichten) QGIS 3.0-Version ist hierfür ein Tool integriert. Sie können einen nächtlichen Schnappschuss von der QGIS-Website erhalten, um diesen im Voraus zu testen.

Um dies zu tun:

  1. Führen Sie den Verarbeitungsalgorithmus "Geometrien an Ebene ausrichten" aus
  2. Wählen Sie Ihre Punktebene als "Eingabeebene" aus
  3. Wählen Sie die Linienebene als "Referenzebene" aus
  4. Geben Sie eine geeignete Toleranz ein (maximale Entfernung, um Punkte beim Einrasten zu bewegen)
  5. Ändern Sie das Verhalten in "Nächsten Punkt bevorzugen".

Geben Sie hier die Bildbeschreibung ein

Hier ist das Ergebnis, bei dem die ursprünglichen Punkte als "x" und die eingerasteten Punkte als grüne Punkte angezeigt werden. Ich habe hier eine Toleranz verwendet, damit nur einige der Eingabepunkte erfasst werden.

Geben Sie hier die Bildbeschreibung ein

Ndawson
quelle
Genau das brauche ich. Leider installiert mein Arbeitgeber nur LTR-Versionen von QGIS und wir alle dürfen keine Testversionen herunterladen und installieren. (seufzt) Ich denke, es ist eine Frage des Wartens. Ist dies eine Standard- / eingebaute Funktion oder ein Plug-In?
Ed Camden
Standardfunktionalität basierend auf Änderungen in den c ++ - Klassen - es gibt keine Möglichkeit, diese manuell in eine ältere Version zu kopieren. Sie könnten möglicherweise versuchen, OSGEO4W auf einem anderen Computer zu installieren und dann den Ordner osgeo4w auf einen USB-Stick zu kopieren, um ihn auf Ihrer Workstation auszuführen. Ich hatte in der Vergangenheit Glück mit diesem Ansatz.
Ndawson
1
Für die alte Version schauen Sie sich dieses Plugin an. docs.qgis.org/2.14/de/docs/user_manual/plugins/…
iRfAn
Es scheint, dass das Plugin die Ebenen von Punkten nicht unterstützt.
Mykola Kozyr
7

Dies kann mit PyQGIS geleistet werden . Für die nächste Situation:

Geben Sie hier die Bildbeschreibung ein

Der folgende Code wurde unter Berücksichtigung einer Toleranz von 5 Karteneinheiten in der Python-Konsole von QGIS ausgeführt:

from math import sqrt

registry = QgsMapLayerRegistry.instance()

points = registry.mapLayersByName('points')
line = registry.mapLayersByName('line')

feat_points = [ feat for feat in points[0].getFeatures() ]
feat_line = line[0].getFeatures().next()

new_points = []

for feat in feat_points:
    pt = feat.geometry().asPoint()
    sqrdist, point, vertex = feat_line.geometry().closestSegmentWithContext(pt)
    if sqrt(sqrdist) <= 5:
        new_points.append(point)
    else:
        new_points.append(pt)

epsg = points[0].crs().postgisSrid()

uri = "Point?crs=epsg:" + str(epsg) + "&field=id:integer""&index=yes"

mem_layer = QgsVectorLayer(uri,
                           'new_points',
                           'memory')

prov = mem_layer.dataProvider()

feats = [ QgsFeature() for i in range(len(new_points)) ]

for i, feat in enumerate(feats):
    feat.setAttributes([i])
    feat.setGeometry(QgsGeometry.fromPoint(new_points[i]))

prov.addFeatures(feats)

QgsMapLayerRegistry.instance().addMapLayer(mem_layer)

Es wurde eine Speicherschicht erzeugt, in der Punkte gemäß der zuvor betrachteten Toleranz von 5 Karteneinheiten und einem senkrechten Pfad zur Linie gefangen wurden.

Geben Sie hier die Bildbeschreibung ein

xunilk
quelle
2

Sie können dies auch im Feldrechner mit dem refFunctions-Plugin tun. Mit dem Feldrechner können Sie eine Ebenengeometrie sowie Felder aktualisieren. Mit refFunctions erhalten Sie eine "Geomdistance" -Funktion, mit der Sie die nächste Linie innerhalb einer bestimmten Entfernung finden können (oder "Geomnearest", wenn Sie keinen Schwellenwert möchten). Sie geben ein Attribut oder die Geometrie zurück, und die Funktion "next_point" findet die nächstgelegene Punkt auf eine bestimmte Geometrie. Ordnen Sie sie wie folgt an, um neue Geometrien für Ihre Punktebene zu berechnen:

closest_point(geom_from_wkt(geomdistance('snap_lines','$geometry',10)) , $geometry)

Anstatt die Geometrie direkt zu aktualisieren, können Sie stattdessen ein Feld mit der gefangenen Geometrie berechnen. Ich speichere mehrere Geometrien zum Einrasten von Durchlasspunkten an verschiedenen Stream-Ebenen und kann die Punktgeometrie im Feldrechner problemlos aktualisieren, je nachdem, welche Stream-Linien ich verwenden muss.

Dies hat einige Einschränkungen: Beide Ebenen müssen dasselbe CRS haben. Die Geomdistance-Funktion gibt einen Fehler aus, wenn Sie mehr als 100.000 Punkte haben. Sie können diese Grenze jedoch ändern, wenn Sie die Plugin-Datei refFunctions bearbeiten.

Amcaninch
quelle