Usługa autobusu dowożącego

9

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

typowa usługa autobusu dowożącego

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!

fgcartographix
źródło
Z powodu innych dziwnych przypadków rozważam teraz odcięcie tras, z których pasażerowie mogą wysiąść z autobusu. Zatem „segmenty” każdej trasy będą niezależne. Nadal muszę wymyślić, jak mogę wycinać swoje kształty w PostGIS, gdy moje przystanki nie są topologicznie poprawne (kształty podążają ulicą, a przystanki są na słupie) ...;)
fgcartographix 10.10.13

Odpowiedzi:

3

W rzeczywistości tworzenie żądanej pętli jest bardzo łatwe dzięki SQL:

SELECT DISTINCT ON (b1.line, b1.number) b1.line,b1.number,b2.waiting
FROM busstops AS b1
  LEFT JOIN busstops AS b2
    ON b1.line = b2.line
      AND b1.number<=b2.number
      AND b2.waiting IS NOT NULL
ORDER BY b1.line,b1.number,b2.number;

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

Jakub Kania
źródło
Woot! Działa ... Wciąż są części, których nie rozumiem, ale wpadam na pomysł ... Czy mogę być wystarczająco odważny, aby poprosić cię o zastąpienie czasu oczekiwania, jeśli późniejszy przystanek ma mniejszy czas oczekiwania? Teoria jest taka, że ​​można pominąć pierwszą stację kolejową, jeśli trzeba czekać na peronie przez 20 minut i pozostać w autobusie do stacji kolejowej 2, jeśli czekanie to tylko 4 minuty ...;) Dzięki milion razy !!!
fgcartographix
1
Po prostu zmień ORDER BYklauzulę. Dwie pierwsze kolumny muszą pozostać, ponieważ są w DISTINCT ONklauzuli, ale poza tym wszystko jest dozwolone: sqlfiddle.com/#!1/24fab/2
Jakub Kania
Jesteś czarodziejem !! :) Dzięki! Zbyt długo się z tym męczyłem !!
fgcartographix
Tylko upewnij się, że 4 minuty nie są na pociąg, który godzinę później :)
Jakub Kania
Nie! Maksymalny dozwolony czas oczekiwania wynosi 30 minut, a mimo to duży czerwony symbol mówi, że to naprawdę nie jest dobre! ;) Dzięki jeszcze raz! Poza tym wygrałem z szefem, że nikt tak naprawdę nie zamierza zostać w autobusie, może 20 minut dłużej, aby pojechać na dworzec kolejowy dalej niż pierwszy, nawet jeśli czas oczekiwania jest naprawdę dłuższy. ;)
fgcartographix
5

W 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

dkastl
źródło