Znajdowanie przecięć obiektów w jednej warstwie liniowej za pomocą QGIS
Chcę znaleźć skrzyżowania w tej samej warstwie, jak na poniższym obrazku. Wszystkie linie są oddzielnymi elementami na tej samej warstwie.
Jak mogę znaleźć te skrzyżowania w QGIS?

Odpowiedzi
Korzystając z poniższego skryptu, możesz uzyskać oczekiwany wynik. Ale najpierw użyj "Vector geometry > Multipart to singleparts"
narzędzia, jeśli pary linii tego samego koloru mają te same cechy. Ponieważ skrypt używa najbliższego punktu między geometriami.
Ustaw nazwę warstwy. Musisz także ustawić wartość epsilon ( eps
), aby założyć, że dwie linie przecinają się lub dotykają. Ponieważ niewielkie zmiany dziesiętnych współrzędnych mają wpływ na wynik. Dlatego niektóre narzędzia i funkcje związane z geometrią zawierają próg.
Zakładam, że dane są w rzutowanym układzie współrzędnych. Jeśli jest geograficzny, zmniejsz 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)

Uwaga: skrypt podaje również punkt przecięcia podświetlony na obrazku.
Spróbuj użyć algorytmu geograficznego „Przecięcia linii”, który tworzy punkty, w których przecinają się linie.

Zauważ, że dla 'Input layer'
i 'Intersect layer'
została wybrana ta sama warstwa linii.
Jeśli linie są rozłączone (patrz ilustracja poniżej), wymagana jest dodatkowa regulacja geometrii, np. Przyciąganie.

Aby przyciągnąć geometrie w warstwie do geometrii w tej samej warstwie, zastosuj opcję „Przyciągaj geometrie do warstwy” .

Następnie zastosuj geoalgorytm „Skrzyżowania linii”.
Zakładam, że każda linia jest jedną cechą, a nie każdy segment jest jedną cechą. Następnie możesz spróbować nałożyć buforowane węzły początkowe i końcowe warstwą linii.
- Uruchom Wyodrębnij określone wierzchołki z 0 i -1 (aby uzyskać punkty za wszystkie węzły początkowe i końcowe)
- Użyj bufora na wyniku z powiedzmy 0,2 metra lub czymś podobnym, może mniej w zależności od danych.
- Uruchom atrybuty łączenia według lokalizacji (podsumowanie) z buforowanymi węzłami początkowymi i końcowymi jako danymi wejściowymi, a warstwę liniową jako warstwą łączenia. Pamiętaj, aby zaznaczyć pole Zliczaj w podsumowaniach, aby obliczyć . To da ci zliczenie na ile linii nakłada się ten buforowany węzeł.
- W warstwie wyjściowej z Połącz odfiltruj wszystkie obiekty, których liczba jest mniejsza niż 2. Pozostałe powinny być Twoimi przecięciami.
- Albo uruchom centroidy na wyniku, aby odzyskać węzły jako punkty, lub wybierz oryginalne wyodrębnione węzły, które nakładają się na wyniki, za pomocą opcji Wybierz według lokalizacji .
Pomysł polega na tym, że wszystkie buforowane węzły powinny mieć 1 nakładanie się z własnej oryginalnej linii, chyba że przecinają się z inną linią, wtedy liczba będzie wynosić 2 (lub więcej w przypadku przecięć wielowierszowych).