Jaki jest skuteczny sposób wykrywania skrzyżowań na mapie?

14

Mogę otrzymywać mapy z dowolnego źródła dla mojego projektu, a dla algorytmu C ++, który tworzę, algorytm musi wiedzieć, gdzie znajdują się skrzyżowania (węzły, w których spotykają się więcej niż dwa odcinki drogi). Poza tym na wielu mapach, które otrzymuję, są przekroczenia i niedostosowania dróg (tj. Drogi nie są właściwie połączone). Jednym ze sposobów rozwiązania tego problemu jest „czyszczenie” sieci dróg za pomocą Autocad. Mam pytania:

  1. Czy istnieje skuteczny sposób (jakiekolwiek oprogramowanie, które to potrafi?), Aby uzyskać mapę w formacie GML, który zawiera informacje o skrzyżowaniach na mapie? (może mieć tag GML, który mówi, że dany węzeł jest skrzyżowaniem)
  2. Czy jest jakiś inny sposób na „oczyszczenie” sieci dróg?

Koledzy zasugerowali FME, ale wiąże się to z pisaniem skryptów i nie jesteśmy pewni, czy skrypt byłby wystarczająco elastyczny, aby pomieścić wszystkie mapy. Jedynym innym sposobem wykrywania skrzyżowań jest użycie siły brutalnej i znalezienie, które odcinki drogi mają wspólne węzły. Czy ArcGIS pomógłby? (nie użyłem go, ale słyszałem o tym) Jestem pewien, że powinien istnieć lepszy sposób ...

Nav
źródło
2
Czy trzeba znaleźć drogi przecinające się? Jak powinien obsługiwać zdegenerowane geometrie (polilinie, w których wszystkie wierzchołki pokrywają się, a więc mają zerową długość). Jak powinien obsługiwać pokrywające się linie, w których przecięcie jest segmentem liniowym, a nie tylko punktem?
Kirk Kuykendall,
@Kirk: Jestem trochę zszokowany sytuacjami, o których wspominałeś. Jestem nowy w GIS i nawet nie wiedziałem, że takie możliwości istnieją. 1. Samo przecięcie wymaga wielu segmentów. O ile nie jest to wiadukt, uważam te skrzyżowania za skrzyżowania. 2. Nie jestem nawet w stanie wyobrazić sobie, czym jest zdegenerowana geometria, więc nie wiem, co odpowiedzieć. 3. Linie zbieżne należy traktować jako dwie odrębne drogi, ponieważ tak zakładam, że byłyby one również w prawdziwym życiu.
Nav

Odpowiedzi:

9

Jeśli masz drogi w formie przestrzennej, na przykład Shapefile, możesz załadować je do PostGIS i automatycznie wyszukiwać je za pomocą zapytania SQL. Zrobiłem to już wcześniej - instrukcja SQL została zaprojektowana, aby dla każdej drogi znaleźć te, które przecinają się geograficznie i stworzyć punkt węzłowy dla każdego skrzyżowania.

Spróbuję to później wyczyścić, ale oto podstawowy przepływ, który możesz wziąć ...

for line in road_layer_lines:
    ilines = get_intersecting_objects(line)
    for iline in ilines:
        road_junctions.extend(get_intersection(line, iline))

Funkcje ST_ * sprawiają, że działa to w PostGIS

  • ST_Envelope : Pobiera obwiednię danej geometrii - służy do przyspieszenia algorytmu. Można zawęzić wyszukiwanie geograficzne za pomocą obwiedni w szybkim, ale mniej dokładnym przebiegu, a następnie zeskanować wyniki za pomocą rzeczywistych geometrii.
  • ST_Intersects : Określa, czy przecinają się dwie geometrie
  • ST_Intersection : Zwraca przecięcie dwóch geometrii

Oto tylko fragmenty, ponieważ nie mam czasu na ukończenie, być może ktoś może je edytować, zanim wrócę tutaj ...

SELECT id, the_geom FROM road_lines
SELECT roads.id FROM road_lines roads WHERE ST_Intersects(roads.the_geom, my_geom)
SELECT ST_Intersection(roads.the_geom, my_geom) FROM road_lines roads WHERE roads.id = my_id
dmsnell
źródło
Udostępnianie: inna baza danych, z którą się zetknąłem to < oracle.com/technetwork/database/berkeleydb/overview/index.html >. Najwyraźniej zapytania są bardzo szybkie, ponieważ zapytania są dostępne jako biblioteki, które można osadzić w aplikacji.
Nav
1
@ dmsnell- Może możesz podać przykład typu zapytania SQL użytego do wykonania tego zadania?
RyanKDalton
11

Możesz analizować polilinie w niesamowity sposób, używając buforów. Jest to zwykle nieefektywne - bufory tworzą wiele dodatkowych wierzchołków - ale (a) jest to technika dostępna w wielu GIS (opartych na wektorze lub rastrze) i (b) czasami może wytwarzać informacje, które w innym przypadku byłyby trudne do uzyskania.

W takim przypadku buforowanie drogi niewielką ilością, a następnie buforowanie ujemną tej samej ilości pozostawia małe „wyspy” wokół wszystkich zakrętów i wokół wszystkich skrzyżowań. Łatwo to udowodnić geometrycznie.

Oto przykład 10 m bufora polilinii (szary) i jego bufora -10 m (jasnoczerwony) na mapie o szerokości 650 m:

Rycina 1

Teraz przecinają oryginalną warstwę polilinii z tymi wielokątami wyspowymi, łączą segmenty według identyfikatora wyspy i liczą elementy:

Rysunek 2

Jasnożółte segmenty oznaczają części o wysokiej liczbie, a ciemnoniebieskie segmenty oznaczają te o niskiej liczbie. W ten sposób (a) znaleźliśmy wszystkie zakręty i skrzyżowania (w tym skrzyżowania własne) i bliskie skrzyżowania (patrz skrajna lewa strona, gdzie dwa segmenty nie do końca się spotykają)) oraz (b) odróżniły zakręty od skrzyżowań. Możemy znaleźć prawie skrzyżowania, wybierając wyspy zawierające dwa lub więcej połączonych segmentów: zagięcia zawierają tylko połączone segmenty.

Ze względu na symetrię buforowania centroidy wysp skrzyżowania są punktami przecięcia.

Jednym pięknym aspektem tego stylu analizy jest to, że nie ma znaczenia, w jaki sposób reprezentowana jest polilinia: może to być pojedyncza cecha, może to być jedna cecha dla każdego segmentu linii lub cokolwiek pomiędzy.

Whuber
źródło
6

Tak, na pewno możesz to zrobić za pomocą FME. Istnieje wiele „transformatorów”, które zajmują się czyszczeniem, skrzyżowaniami i topologią; W takim przypadku wypróbowałbym transformator TopologyBuilder .

Wszelkie skrypty są wykonywane w środowisku graficznym, więc jest to bardzo proste.

Zawsze możesz uzyskać wersję próbną ze strony www.safe.com

(Ujawnienie: Mark Ireland, znany również jako FME Evangelist, Safe Software Inc.)

Mark Ireland
źródło
Popieram to. FME doskonale nadaje się do tego konkretnego problemu, zarówno transformacji z AutoCAD do GML, jak i czyszczenia topologicznego. Może być zadziwiająco uniwersalny w zastosowaniu.
blord-castillo
-1

Analityk sieci Arcgis, który możesz uzyskać dzięki bezpłatnej wersji próbnej, robi to w mniej niż 10 sekund i za pomocą zaledwie kilku kliknięć.

Thad
źródło
-1

Proces ten można wykonać w ArcGIS z analitykiem sieci.

W ArcGIS jest też inna droga: możesz przejść przez następujące kroki: „Arctoolbox” → „Narzędzia do zarządzania danymi” → „funkcje” → „wierzchołki punktów do punktów” i tam możesz zrobić to, czego potrzebujesz.

Łóżko
źródło