Przede wszystkim trochę tła.
Pracuję dla regionalnej agencji tranzytowej. Dokonujemy „diagnostyki” na temat naszej usługi autobusu dowożącego. Chcielibyśmy wiedzieć, jaki odsetek naszych użytkowników może pojechać autobusem na dworzec kolejowy zamiast zabrać samochód. Zostało to zrobione kilka razy w przełęczy, ale teraz używamy gtfs jako naszego głównego źródła danych, więc musimy przemyśleć naszą metodologię.
Aby zostać uznane za „karmienie” pociągu, trasa autobusowa musi się zatrzymać w pewnej odległości od dworca kolejowego (czerwone bufory). Również synchroniczność z obsługą pociągu jest bardzo ważna, ponieważ jeśli twój autobus przyjeżdża na dworzec pół godziny przed pociągiem, czas oczekiwania jest zbyt długi i będziesz chciał spać jeszcze 20 minut rano i wziąć samochód.
Powiedzmy, że jedziesz linią A (niebieską) na przystanku 12. Wysiadasz z autobusu na przystanku 13. Autobus przyjeżdża na przystanku 13, czyli przystanku, który jedzie na dworzec kolejowy nr 1 na 5 minut przed pociągiem. To jest bardzo dobre. Oznaczałoby to, że każdy, kto weźmie tę trasę autobusu na przystanku od 1 do 13 włącznie, przyjedzie 5 minut przed tym pociągiem.
Następnie pociąg jadący przez bardzo gęsto zaludniony obszar z mnóstwem szkół i przejazdów zmuszony jest znacznie zmniejszyć prędkość. W międzyczasie autobus odbiera pasażerów na przystanku 14–17 i przyjeżdża na dworzec kolejowy nr 2 10 minut przed tym pociągiem. Tak więc pasażer jadący autobusem na przystankach od 14 do 17 miałby czas oczekiwania 10 minut, gdy dotrze na dworzec kolejowy. Tak więc wzdłuż tej linii autobusowej pasażer jadący autobusem na przystankach od 1 do 13 ma czas oczekiwania 5 minut, a pasażerowie autobusu na przystankach od 14 do 17 mają czas oczekiwania 10 minut.
Linia B, po drugiej stronie toru, mijamy w pobliżu stacji kolejowej nr 1, ale jej przystanki są zbyt daleko, aby rozważać „karmienie” stacji kolejowej nr 1. Przyjeżdża na dworzec kolejowy nr 2 7 minut przed pociągiem (zrób to dla każdego pociągu w porannej godzinie szczytu; jest bardzo dobrze zsynchronizowany). Tak więc pasażerowie wzdłuż linii B, podróżujący autobusem wszędzie od przystanku 1 do 59, mieliby czas oczekiwania 7 minut.
Teraz moje pytanie. Po ustaleniu, że przystanki Linia A.13 i Linia A.17 karmią mój pociąg (zrobiono to przestrzennie, w PostGIS) i że czas oczekiwania na autobus na przystanku przed # 13 wynosi 5 minut, ale te po czas oczekiwania 10 minut, jak mogę przypisać czas oczekiwania do wszystkich przystanków przed nimi?
Chciałbym to zrobić w Postgres / PostGIS (pl / pgsql lub pl / python), ale mogę również używać czystego Pythona (OS lub arcpy).
Myślę, że mógłbym zapętlić się do tyłu. Kiedy więc znajdę przystanek, który pasuje (tutaj Linia A.17), przypisz ten sam czas oczekiwania na przystanek 16, a następnie 15 ... dopóki nie znajdę innego przystanku, który spełnia moje kryteria (Linia A.13), a następnie przypisz resztę przystanków, ten sam czas oczekiwania co 13.
Nie mam jednak pojęcia, jak stworzyć taką pętlę. Nie sądzę, że mogę to zrobić w SQL, więc musiałbym użyć języka proceduralnego w PostgreSQL.
Wpadłem na pomysł, aby użyć pgRouting do znalezienia trasy między przystankami każdego podajnika, aby w ten sposób linia A została podzielona na dwie części (przystanki od 1 do 13, a następnie od 13 do 17). Czy byłoby łatwiej?
Następnym krokiem będzie użycie pgRouting do obliczenia czasu jazdy ze wszystkich przystanków, które mają czas oczekiwania (przepraszam do linii A.18 i więcej!) I porównania tego z rozkładem jazdy autobusu, aby obliczyć konkurencję (czy to zajmuje 5 minut więcej w autobusie niż w samochodzie?)
Jakieś pomysły? Zwykle publikuję długi skrypt w toku, aby pokazać wysiłek, jaki do tej pory poczyniłem, ale utknąłem!
Odpowiedzi:
W rzeczywistości tworzenie żądanej pętli jest bardzo łatwe dzięki SQL:
Fiddle .
Łatwo byłoby też, powiedzmy, zsumować czasy transferu od stop do stop.
I możesz użyć zwykłego pgRouting, jeśli tylko zdołasz przekształcić trasy w wykres czasowy (z węzłami reprezentującymi czasy odjazdu i czas dla kosztów trasy).
źródło
ORDER BY
klauzulę. Dwie pierwsze kolumny muszą pozostać, ponieważ są wDISTINCT ON
klauzuli, ale poza tym wszystko jest dozwolone: sqlfiddle.com/#!1/24fab/2W zeszłorocznym programie Google Summer of Code uczeń zaimplementował funkcję pgRouting do routingu multimodalnego. Nie pojawiło się w nowej wersji 2.0, więc prawdopodobnie nie działa teraz, ale możesz rzucić okiem na dostępne zasoby, aby sprawdzić, czy jest to pomocne, czy nie:
Byłoby miło wprowadzić tę funkcję do następnej wersji, dlatego skontaktuj się z listą dyskusyjną programisty, aby koordynować niezbędne prace w razie zainteresowania: http://pgrouting.org/support.html
źródło