Mam zestaw linii reprezentujących linie autobusowe. Niektóre linie nachodzą na siebie i biegną tymi samymi drogami.
Jestem w stanie wyodrębnić węzły.
Jednak interesuje mnie wyodrębnianie tylko takich przejść:
W jaki sposób mogę to zrobić? Szukam sposobów na QGIS lub Python.
Próbowałem metody przecięcia z GDAL Python, ale to w zasadzie zwraca mi tylko wierzchołki.
Metoda przecięcia linii z QGIS zwraca mi skrzyżowania, jeśli przecinają się dwie linie. Jednak w przypadku, gdy dwie linie autobusowe idą daleko na części swojej trasy na tej samej drodze, nie daje mi to punktu, w którym się łączą.
Odpowiedzi:
Węzły:
Potrzebujesz dwóch rzeczy, punktów końcowych polilinii (bez węzłów pośrednich) i punktów przecięcia. Istnieje dodatkowy problem, niektóre punkty końcowe polilinii są również punktami przecięcia:
Rozwiązaniem jest użycie Pythona i modułów Shapely i Fiona
1) Przeczytaj plik kształtu:
2) Znajdź punkty końcowe linii ( jak uzyskać punkty końcowe polilinii? ):
3) Oblicz przecięcia (iteracja przez pary geometrii w warstwie z modułem itertools ). Wynikiem niektórych skrzyżowań są MultiPoints i chcemy listę punktów:
4) Wyeliminuj duplikaty między punktami końcowymi i punktami przecięcia (jak widać na rysunkach)
5) Zapisz wynikowy plik kształtu
Ostateczny wynik:
Segmenty linii
Jeśli chcesz także segmentów między węzłami, musisz „planować” ( wykres planarny , żadne krawędzie nie krzyżują się) swój plik kształtu. Można tego dokonać za pomocą funkcji unary_union programu Shapely
źródło
result = endpts.extend([pt for pt in inters if pt not in endpts])
ponieważ wydaje się, że.extend
metoda ulega modyfikacjiendpt
. W moim przypadkuresult = None
po tej operacji. To wendpts
końcu zawiera wynik