Muszę podłączyć przystanki autobusowe (punkty) do warstwy sieci (dane OSM). Te przystanki autobusowe nie leżą bezpośrednio na liniach (patrz zrzut ekranu), a ich lokalizacja nie powinna być zmieniana. Używam PostGIS, pgrouting i QGIS, a sieć jest już routowalna z kolumnami źródłowymi i docelowymi itp.
Głównie chcę później zrobić dwie rzeczy:
- Ustalanie odległości między przystankami autobusowymi za pomocą analizy najkrótszej ścieżki.
- Tworzenie izochron z odległościami pieszymi od przystanku autobusowego za pomocą sieci OSM.
Aby uzyskać dokładne wartości, konieczne jest, aby trasy „zaczynały się” i „zatrzymywały” jak najbliżej przystanków autobusowych. W wielu przypadkach najbliższy istniejący węzeł będzie zbyt daleko, aby uzyskać dokładne wartości. Ale nie powinno być trasy do faktycznej lokalizacji przystanku autobusowego. W moim przykładzie na zdjęciu widać, jak powinna wyglądać trasa między przystankami.
Czy istnieje możliwość automatycznego wstawiania nowych węzłów do sieci (LINESTRING), które znajdują się najbliżej przystanków autobusowych, czy też możliwe jest rozpoczęcie routingu w rodzaju „fikcyjnego punktu”, który jest ustawiony tylko dla zapytania (podobnie do drogi wtyczka graficzna w QGIS robi)?
To jest moje pełne rozwiązanie. Wymaga to pewnego rodzaju włamania, aby wykonać podział: zdobywam punkty na liniach (sposoby, używając terminologii OSM) za pomocą
ST_ClosestPoint
, a następnie buforuję je na bardzo małą odległość, aby podział rzeczywiście zaczął działać. W przeciwnym razie błędy niedokładności / zaokrąglania zapobiegały podziałowi.Ma to problem polegający na tym, że generuje dwa podziały w każdej linii na punkt (z powodu buforowania). Na mój użytek było to w porządku, ponieważ później poprowadziłem trasę między punktami podziału najbliższymi oryginalnym punktom, które znajdowały się poza linią, i mógł to być jeden z dwóch punktów podziału linii przecięcia z buforem.
Zacząłem od pobrania danych OSM i impotowania ich do Postgres:
Podział sposobów za pomocą bufora:
Utwórz topologię potrzebną do routingu z pgroutingiem:
źródło
Ponieważ pracuję nad podobnym zadaniem, chciałem tylko opowiedzieć o podejściu, którego obecnie używam. Korzysta z GRASS GIS, ale jeśli chodzi o moje eksperymenty z PostGIS, dość skomplikowane jest dodawanie wielu nowych punktów do istniejących LineStrings poprzez podzielenie tych LineStrings w odpowiednich lokalizacjach - chociaż jestem pewien, że istnieje wygodne rozwiązanie.
Teraz skorzystałem z funkcji GRASS GIS,
v.net
korzystając z opcjiconnect
. Po prostu wybierzinput vector line layer
ipoints layer
. Istnieje możliwość przyciągnięcia punktów do najbliższego punktu na liniach lub utworzenia nowych połączeń między najbliższym punktem na liniach i nowym punktem.Oto zdjęcie przed i po. Po prawej stronie dla każdego punktu warstwy punktów dodano węzeł w sieci drogowej:
Następnie w PostGIS, po utworzeniu
..._vertices_pgr
tabeli poza siecią, po prostu przypisz swoje punkty do najbliższego wierzchołka, abyś mógł ich użyć w swoich żądaniach routingu. Do tego zadania możesz użyćST_ClosestPoint
funkcji wykonanej przez @Setraworks w jego odpowiedzi.Wady tego podejścia to:
Podejście to działa dobrze, jeśli masz określoną liczbę punktów do dodania do sieci (jak w przykładzie pytania z przystankami autobusowymi).
Jeśli ktoś może podać działający przykład za pomocą PostGIS, chciałbym o tym przeczytać!
źródło
Jest post, który omawia podobny problem, można go zobaczyć w następującej lokalizacji: http://osdir.com/ml/qgis-user-gis/2011-11/msg00220.html
źródło