Suchen von Schnittpunkten von Features in einer Linienebene mithilfe von QGIS
Ich möchte Schnittpunkte in derselben Ebene wie im Bild unten finden. Alle Linien sind separate Features in derselben Ebene.
Wie finde ich diese Schnittpunkte in QGIS?

Antworten
Mit dem folgenden Skript erhalten Sie das erwartete Ergebnis. Verwenden Sie jedoch zunächst das "Vector geometry > Multipart to singleparts"
Werkzeug, wenn die Linienpaare derselben Farbe dieselben Merkmale aufweisen. Weil das Skript den nächsten Punkt zwischen den Geometrien verwendet.
Layernamen festlegen. Sie müssen auch den eps
Wert für epsilon ( ) festlegen , um anzunehmen, dass sich zwei Linien schneiden oder berühren. Weil kleine Änderungen der Dezimalzahl der Koordinaten das Ergebnis beeinflussen. Daher enthalten einige Werkzeuge und Funktionen, die sich auf eine Geometrie beziehen, einen Schwellenwert.
Ich gehe davon aus, dass sich die Daten im projizierten Koordinatensystem befinden. Wenn es geografisch ist, verringern Sie eps
.
# specify minimum distance to assume that lines intersect/touch
eps = 0.01 # 0.01 meter = 1 cm
line_lyr = QgsProject.instance().mapLayersByName('LINE_LAYER_NAME')[0]
crs = line_lyr.crs().authid()
# make new point layer
point_lyr = QgsVectorLayer("Point?crs=" + crs, "points", "memory")
point_lyr.startEditing()
for line1 in line_lyr.getFeatures():
geom1 = line1.geometry()
for line2 in line_lyr.getFeatures():
geom2 = line2.geometry()
if (geom1.distance(geom2) < eps
and line1.id() < line2.id()): # to avoid duplicate points
point = geom1.nearestPoint(geom2)
feature = QgsFeature()
feature.setGeometry(point)
point_lyr.addFeature(feature)
point_lyr.commitChanges()
QgsProject.instance().addMapLayer(point_lyr)

Hinweis: Das Skript gibt auch den im Bild hervorgehobenen Schnittpunkt an.
Versuchen Sie es mit dem Geoalgorithmus "Linienschnittpunkte" , der Punkte erstellt, an denen sich Linien schneiden.

Beachten Sie, dass für 'Input layer'
und 'Intersect layer'
dieselbe Linienebene ausgewählt wurde.
Wenn Linien getrennt werden (siehe Abbildung unten), ist eine zusätzliche Anpassung der Geometrie erforderlich, z. B. ein Einrasten.

Wenden Sie zum Einrasten von Geometrien in einer Ebene an den Geometrien innerhalb derselben Ebene "Geometrien an Ebene ausrichten" an .

Und nach dem Anwenden des Geoalgorithmus "Linienkreuzungen".
Ich gehe davon aus, dass jede Zeile ein Merkmal ist und nicht jedes Segment ein Merkmal. Sie können dann versuchen, gepufferte Start- und Endknoten mit der Linienebene zu überlagern.
- Führen Sie Extract Specific Vertices mit 0 und -1 aus (um Punkte für alle Start- und Endknoten zu erhalten).
- Verwenden Sie Puffer für das Ergebnis mit beispielsweise 0,2 Metern oder etwas anderem, möglicherweise weniger, abhängig von Ihren Daten.
- Führen Sie Verknüpfungsattribute nach Position (Zusammenfassung) mit den gepufferten Start- und Endknoten als Eingabe und der Linienebene als Verknüpfungsebene aus. Achten Sie darauf , das Kontrollkästchen Count in Zusammenfassungen zu berechnen . Auf diese Weise können Sie zählen, wie viele Zeilen dieser gepufferte Knoten überlappt.
- Filtern Sie in der Ausgabeebene des Joins alle Features heraus, deren Anzahl weniger als 2 beträgt. Die verbleibenden sollten Ihre Schnittpunkte sein.
- Führen Sie entweder Centroids für das Ergebnis aus, um die Knoten als Punkte zurückzugewinnen, oder wählen Sie die ursprünglich extrahierten Knoten, die die Ergebnisse überlappen, über Nach Standort auswählen über .
Die Idee ist, dass alle gepufferten Knoten 1 Überlappung von ihrer eigenen ursprünglichen Linie haben sollten, es sei denn, sie schneiden sich mit einer anderen Linie, dann beträgt die Anzahl 2 (oder mehr für mehrzeilige Schnittpunkte).