Znajdowanie przecięć obiektów w jednej warstwie liniowej za pomocą QGIS

Nov 25 2020

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

8 KadirŞahbaz Nov 25 2020 at 10:26

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.

6 Taras Nov 25 2020 at 06:22

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”.

1 hexamon Nov 26 2020 at 08:05

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.

  1. Uruchom Wyodrębnij określone wierzchołki z 0 i -1 (aby uzyskać punkty za wszystkie węzły początkowe i końcowe)
  2. Użyj bufora na wyniku z powiedzmy 0,2 metra lub czymś podobnym, może mniej w zależności od danych.
  3. 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ł.
  4. W warstwie wyjściowej z Połącz odfiltruj wszystkie obiekty, których liczba jest mniejsza niż 2. Pozostałe powinny być Twoimi przecięciami.
  5. 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).