Na Slovensku existuje niekoľko málo možností, ktoré umožňujú vyhľadávanie dopravných spojení.
Všetky však majú od dokonalosti veľmi ďaleko, takže som si chcel vyskúšať, aké zložité by bolo spraviť s pomocou opensource nástrojov taký testovací vyhľadávač s minimom programátorských znalostí.

Pokiaľ Vás nezaujímajú technické podrobnosti, na konci nájdete obrázky.

Čo potrebujeme:

  • Funkčný operačný systém s Javou
  • Extrakt z OpenStreetMap na vybranú lokalitu
  • GTFS dopravné dáta
  • Fungujúci OpenTripPlannerServer

Funkčný operačný systém

Celý návod je postavený okolo Debian Jessie, ale v princípe by mal fungovať na akomkoľvek inom Linuxe a s menšími úpravami aj na Windowse.

S Javou je to trocha komplikovanejšie, treba stiahnuť a nainštalovať niektorú zo sedmičkových verzií od Oracle a prepnúť sa na ňu.

Pre stiahnutie starších verzii Javy sa treba registrovať, potom je to už len o pár klikoch, než sa dostanete k downloadu. Následne treba zo stiahnutého súboru urobiť inštalačný deb balík pomocou príkazu (nie ako root):

make-jpkg jdk-*-linux-x64.tar.gz

a potom nainštalovať (ako root):

dpkg -i oracle-java*-jdk_*_amd64.deb

a následne zmeniť predvolenú verziu javy na jdk:

update-alternatives --config java

Okrem toho treba doinštalovať maven a git, štandardne cez Synaptic alebo aptitude alebo niečo iné.

Extrakt z OpenStreetMap na vybranú lokalitu

OpenStreetmap je v podstate wikipédia medzi mapami. Projekt, do ktorého môže každý zakresliť svet tak, ako vyzerá, sťahovať mapové údaje a robiť si s nimi, čo len chce.

Dáta pre celý svet majú v skomprimovanej podobe niekoľko desiatok GB, takže na hranie je to veľmi nepraktické. Dajú sa však získať extrakty pre vybrané lokality. OSM wiki popisuje niekoľko spôsobov, ako si taký extrakt vytvoriť, prípadne kde stiahnuť prednastavené extrakty.

Keďže však mnou vybraná lokalita, Trenčín, v prednastavených extraktoch nie je, pomocou bbbike.org som si vytvoril a stiahol oblasť mesta Trenčín (a samozrejme som nezabudlo poslať tvorcom dobrovoľnú páreurovú podporu na paypal). Je jedno, akú službu si vyberiete pre svoju potrebu, ale výstup musí byť vo formáte pbf.

GTFS dopravné dáta

GTFS, alebo General Transit Feed Specification, je dátový formát, ktorý obsahuje dopravné informácie. Taký strojovo čitateľný dopravný trafikon. GTFS je skomprimovaný zip súbor, poskytovaný pomocou rss web zdroja, ktorý obsahuje niekoľko súborov s príponou txt, ktoré obsahujú dáta vo formáte csv (ľudovo, čiarkou oddelené údaje).

Pre hranie nepotrebujeme robiť rss feed, takže si vystačíme s pár súbormi, ktoré stačí skomprimovať do zip-u.

Podrobné vysvetlenie GTFS nájdete v angličtine na webe Googlu. Skratke však skúsim opísať potrebné veci aj tu.

Okrem nižšie uvedených súborov, ktoré sú minimálnou požiadavkou, je možné doplniť aj informácie o výške cestovného, vykreslení trasy (v tejto podobe len na mape vyznačí spojnicu zastávok, ale nie reálnu trasu, ktorú spoj urobí), či informácie o možnostiach prestupov. A v rožšírení gtfs-realtime je možné prezentovať aktuálne dáta, čiže napríklad meškania, upozornenia alebo zmeny trasy.

agency.txt

Súbor obsahuje informácie o prevádzkovateľoch (dopravných spoločnostiach). Obsah je jednoduchý, určite ho netreba bližšie vysvetlovať.

agency_id,agency_name,agency_url,agency_timezone
MHDTN,Mestská hromadná doprava Trenčín,http://www.sadtn.sk,Europe/Bratislava
PALTN,Prímestská doprava Trenčín,http://www.sadtn.sk,Europe/Bratislava
VLAK,Vlaková doprava,www.slovakrail.sk,Europe/Bratislava

calendar.txt

Súbor definuje, v ktoré dni sú jazdy. Na ukážke nižšie definujem službu ALL, ktorá jazdí počas pracovných dní od decembra 2014 do decembra 2015

service_id,monday,tuesday,wednesday,thursday,friday,saturday,sunday,start_date,end_date
ALL,1,1,1,1,1,0,0,20141214,20151214

stops.txt

Definuje zastávky a ich polohu. Čiže vlakovú zastávku Zlatovce som označil ako VL_ZLAT, pričom sa nachádza na príslušnej zemepisnej šírke a dĺžke.

stop_id,stop_name,stop_desc,stop_lat,stop_lon,zone_id,stop_url
VL_ZLAT,Stanica Zlatovce,,48.9006603,18.0225213,
GS_OTO1,gen. Svobodu otoč,,48.8748194,18.0488983,,
GS_RAZ1,gen. Svobodu rázcestie,,48.8729309,18.042518,,

routes.txt

Definuje jednotlivé linky. Čiže označenie linky, prevádzkovateľa, krátky názov (na Slovensku najmä v MHD obvykle číslom), dlhý názov a typ prepravy (3 pre autobus, 2 pre vlak).

route_id,agency_id,route_short_name,route_long_name,route_desc,route_type,route_url,route_color,route_text_color
MHD22,MHDTN,22,gen. Svobodu otoč - Autobusová stanica,,3,,,
V5402,VLAK,5402,Chynorany - Trenčín - Trenčianska Teplá,,2,,,

trips.txt

Tento súbor je trocha obsiahlejší, keďže obsahuje informácie o konkrétnych spojoch. Čiže linku, konkrétny spoj tejto linky a označenie na informačnej tabuli. V prvom riadku mám linku 22, z nej konkrétne spoj č. 31 (viz grafikon SAD TN) a autobus má na tabuli konečnú zastávku Autobusová stanica. Alebo nižšie vlak č. 5402, ktorý smeruje z Chynorian do Trenčianskej Teplej (mimo tému: tento vlak nás už asi dlho trápiť nebude, pretože to vyzerá, že osobná preprava na tejto trase je na odstrel).

MHD22,ALL,MHD22_31,Autobusová stanica,0,,
MHD01,ALL,MHD01_59,Kubrá,0,,
V5402,ALL,VLAK5402,Trenčianska Teplá,0,,

stop_times.txt

A tu začína najväčšia zábava. Keďže nemám k dispozícii pôvodné údaje, musel som ich prepísať z grafikonu do tohto súboru. Je jasné, že urobiť to ručne je na samovraždu a kto by si chcel na tomto postaviť nejaký startup, musel by použiť pôvodné údaje od dopravcu a spracovať ich počítačom do tejto podoby.

Ale na druhej strane to až tak hrozné nebolo, pretože som prepísal len niekoľko liniek, len v pracovné dni a len po 18:00. Na vytvorenie ukážkového servera to však viac než stačí. Navyše, keďže sú údaje uložené vo formáte csv, dajú sa pohodlne otvoriť v Libre Office Calc (alebo aj Exceli), pričom sa jednotlivé údaje zoradia pekne do chlievikov. Čiže v princípe stačí ručne napísať prvý čas a pre každú nasledujúcu zastávku definovať časový odstup pomocou funkcie =PREDCHADZAJUCI_CHLIEVIK+TIME(hodina,minúta,sekunda)

V ukážke nižšie je linka č. 22 a jej spoj č. 31, ktorý prichádza a odchádza zo zastávky GS_OTO1 o 17:00 a je to v poradí 1. zastávka. Na 2. zastávku prichádza 17:02. A takto treba vypísať jednotlivé zastávky aj s konkrétnymi časmi. V mojom testovacom súbory som skončil s viac než 300 riadkami, ale napríklad aj menšie regionálne dopravné spoločnosti by skončili s desiatkami tisíc riadkov. To však nie je problém, keďže tento dátový formát pôvodne vznikol pre potreby Portlandskej metropolitnej oblasti v USA.

trip_id,arrival_time,departure_time,stop_id,stop_sequence,stop_headsign,pickup_type,drop_off_time,shape_dist_traveled
MHD22_31,17:00:00,17:00:00,GS_OTO1,1,,,,
MHD22_31,17:02:00,17:02:00,GS_RAZ1,2,,,,
MHD22_31,17:03:00,17:03:00,GS_POD1,3,,,,

Fungujúci OpenTripPlanner server

OpenTripPlanner je program, ktorý dokáže dostupné mapové a dopravné dáta prezentovať vo forme ako poznáme z bežného vyhľadávača dopravných spojení. V mape si označíte východzí a cieľový bod (alebo použijete funkciu hľadania) a necháte program zrátať, aby našiel čo najvhodnejšiu kombináciu autobusu, vlaku, chôdze alebo iných spôsobov prepravy.

Ako ste postrehli v úvode, keďže sme inštalovali Javu, program je napísaný v Jave.

Na stránke programu je možnosť stiahnuť aj skompilovanú verziu, ale ja som siahol po vlastnej kompilácii. Upozornenie, na túto srandu som musel nastaviť Virtualbox až na 4GB RAM, inak kompilácia zlyhala.

Najprv treba stiahnuť zdroj:

git clone git://github.com/opentripplanner/OpenTripPlanner.git

Následne sa treba premiestniť do stiahnutého zdroja a v ňom spustiť kompiláciu:

mvn clean package

Pokiaľ bude výsledkom hláška BUILD FAILED, tak je niekde problém, ktorý treba odstrániť a spustiť príkaz ešte raz. Tento proces bude trvať niekoľko minút.

Po úspešnej kompilácií sa stačí premiestniť do priečinku target, ktorý obsahuje spustiteľný program.

Ako prvý krok treba spustiť program s odkazom na priečinok, kde sa nachádza súbor s pbf extraktom a zazipované GTFS dáta:

java -Xmx2G -jar otp-1.0.0-SNAPSHOT.jar --build /home/lubos/gtfs/kombo

Výsledkom bude súbor Graph.obj, ktorý tieto dáta skombinuje do formy vhodnej pre OpenTripPlanner. Tie však treba premiestniť do priečinku, ktorý má OTP predvolený, čiže najprv vytvoríme a potom ho tam presunieme (ako root):

mkdir /var/otp/
mkdir /var/otp/graphs
mv /home/lubos/gtfs/kombo/Graph.obj /var/otp/graphs

A už len stačí spustiť program a počkať na hlášku Grizzly server running:

java -Xmx2G -jar otp-1.0.0-SNAPSHOT.jar --server

Spustený program je dostupný cez internetový prehliadač na adrese http://localhost:8080/

Pri tvorbe grafu a potom pri spúšťaní serveru dávajte pozor na chybové hlášky v konzole, ak bude niekde problém, ktorý nedovolí spustiť program, nájdete tam upozornenie, na čom to zlyhalo

Záver

Výsledkom je funkčný vyhľadávač spojení, ktorý dokáže navigovať od dverí k dverám a dokáže kombinovať rôzne druhy dopravy (fakt nechápem cp.sk, ktorý má k dispozícii dáta pre prímestskú a vlakovú aj prímestskú dopravu, ale vyhľadávať môžete len buď v jednom alebo len v druhom). Najmä kombinovanie dopravných prostriedkov môže byť dôležité, pretože môže ponúknuť alternatívy, ktoré normálneho človeka ani nenapadnú, pretože nenosí v hlave grafikony.

A aj v mestách s fungujúcou MHD môže informácia o prímestských spojoch doplniť možnosti cestovania mimo špičky. Taktiež je dostupná aplikácia pre mobilné telefóny, ktorá sa môže napojiť na OpenTripPlanner server.

Screenshoty

OpenTripPlanner úvodná obrazovka

OpenTripPlanner – internetový prehliadač sa otvorí v lokalite, ktorú pozná z OSM dát a hneď sa môžete pustiť do hľadania najvhodnejšieho spojenia.

Vyhľadané spojenie po 18:00 z Halalovky do Kubrej

Vyhľadané spojenie po 18:00 z ul. Halalovka do Kubrej.

Itinerár v podobe vhodnej pre tlačiareň

Itinerár v podobe vhodnej pre tlačiareň.

Takto sa OpeTripPlanner vysporiadal s tým, že v dátach neexistuje linka č. 21, ktorá spája sídlisko Juh s Opatovou. Môžete cestovať linkou č. 1 alebo 8 a pekne si zašliapať alebo...

Takto sa OpeTripPlanner vysporiadal s tým, že v dátach neexistuje linka č. 21, ktorá spája sídlisko Juh s Opatovou. Môžete cestovať linkou č. 1 alebo 8 a pekne si zašliapať alebo…

... alebo môžete na autobusovej stanici prestúpiť na vlak

… alebo môžete na autobusovej stanici prestúpiť na vlak.

Viete, aké máte dopravné možnosti zo stanice Trenčín Predmestie do Opatovej?

Viete, aké máte dopravné možnosti zo stanice Trenčín Predmestie do Opatovej?

Viete, že pri cestovaní zo sídliska Juh sa nemusíte spoliehať len na priame spoje na autobusovú stanicu, ale môžete skúsiť skombinovať linku č. 8 s linkami č. 24 a 6?

Viete, že pri cestovaní zo sídliska Juh sa nemusíte spoliehať len na priame spoje na autobusovú stanicu, ale môžete skúsiť skombinovať linku č. 8 s linkami č. 24 a 6?

Nevyhovuje pri ceste do Kubrej odchod MHD? Možno ide prímestský spoj.

Nevyhovuje pri ceste do Kubrej odchod MHD? Možno pôjde prímestský spoj.