Dne 1. března 2020 jsem měl na InstallFestu přednášku s názvem Kde aktuálně je už ten autobus, která se věnovala aktuálním zpožděním autobusů PID. V lednu 2019 začal ROPID poskytovat strojově zpracovatelná data ve formátu GTFS. O rok později, konkrétně 13. ledna 2020, se přidává DPP a na stránkách ROPIDu ukazuje zpoždění svých autobusů. Tuto věc jistě obyvatelé Brna považují za dávno samozřejmou, ovšem v Praze byly poněkud jiné podmínky.
Co se dozvíte v článku
Historie
Pro historii řídicích systémů dopravy se musíme vydat do minulosti, konkrétně do roku 1982, kdy DPP začal testovat KŘS na lince 144, která jezdila mezi zastávkami Staroměstská a Sídliště Bohnice Jih (dnešní Poliklinika Mazurská). První návrhy dokonce vznikly už v šedesátých letech, ale zůstaly jen na papíře. V roce 1988 se začal zkoušet bratislavský systém DRAHUŠA upravený pro pražské podmínky. Dne 14. ledna 1992 vyjel vůz T3SUCS ev. č. 7176 s namontovaným systémem ISYDR. Následně v roce 1994 probíhalo výběrové řízení na nový OIS, v jehož rámci došlo k převedení analogového systému ISYDR na digitální technologie a přejmenování na DORIS.
K plnému spuštění došlo 1. června 1995. (Jen malá odbočka, krátce předtím 13. května vyšla první verze systému Red Hat Linux, zároveň samotné jádro bylo toho roku portováno na procesory SPARC.) Přesuňme se do roku 2000, kdy dochází ke spuštění systému AUDIS pro autobusy, tehdy jím byla vybavena linka 177 a poté 187. Oba tyto systémy pro dopravní podnik spravuje firma Xanthus, které i patří data o zpoždění. Proto nemohl dopravní podnik tato data zveřejňovat. V roce 2018 došlo k výběrovému řízení na nové systémy pro tramvaje a autobusy, díky tomu nyní máme data o zpoždění. Tramvaje by měly podle ROPIDu a DPP přijít na řadu v průběhu letošního roku.
Zatím je zpoždění jen na stránce http://kdymitojede.cz, která je přesměrována na stránku ROPIDu https://pid.cz/zastavkova-tabla. V průběhu února se nakrátko objevila data i na platformě MPVnet, která graficky znázorňuje polohu autobusů PIDu, ale byla zase stažena. Od 7. března jsou opět zpět a jako bonus i v aplikaci PID Lítačka. Časem by se měla objevit i v ostatních aplikacích a na datové platformě Golemio.
Z aplikací zpoždění ukazuje jen PID Lítačka (vlevo). Jízdní řády (uprostřed) ani IDOS (vpravo) tuto funkci zatím nemají.
GTFS
Pro začátek budeme potřebovat data na zpracování. Ještě, než se na ně vrhneme, se opět vydáme do minulosti. V roce 2005 zaměstnanec společnosti Google Chris Harrelson měl jako vedlejší projekt pokus dostat data o veřejné dopravě do Google Maps. Naopak manželé McHughovi z Portlandského organizátora dopravy v Oregonu zase byli frustrováni hledáním spojení v neznámých městech.
Po domluvě s Googlem začali dodávat data ve formátu CSV. Vznikl tak formát General Transit Feed Specifiaction (až do září roku 2009 znamenalo G na začátku Google), který se stal standardem pro výměnu dat jízdních řádů.
Jedná se o zip soubor s 15 textovými soubory, které mají danou strukturu. Pro PID se dají stáhnout ze stránek ROPIDu, konkrétně na adrese https://pid.cz/o-systemu/opendata, kde je i stručný popis těchto dat. Pro naše potřeby budou stačit jen soubory stop.txt
, který obsahuje ID zastávek a trips.txt
, kde je naopak uvedeno ID daného spoje, což se bude hodit pro určení směru, kterým daný spoj jede.
GOLEMIO
Datová platforma Golemio je portál hlavního města Prahy pro otevřená data. Golemio využívá API od původně české firmy Apiary (v roce 2017 ji koupil Oracle), který provozuje Operátor ICT. Na webové adrese https://golemioapi.docs.apiary.io/# běží potřebné API. Pro přístup je potřeba klíč, jehož vygenerování se provádí registrací na https://api.golemio.cz/api-keys.
V současnosti jsou v provozu dvě verze API a to verze v1 a v2. Například u dopravy se liší jiným pořadím informací, přidáním informace o názvu konečné zastávky (odpadá nutnost hledat přes trip_ID) a v neposlední řadě i druhem vozidla (v současnosti autobus, regionální autobus a loď).
Pro stáhnutí požadovaných informací slouží adresa https://api.golemio.cz/v2/vehiclepositions, případně https://api.golemio.cz/v1/vehiclepositions pro starší verzi. Pokud za vehicleposition
přidáme /trip_id
dostaneme výpis pouze pro konkrétní spoj. Ve verzi v2 pak přibyly informace pro další filtrování, podrobně popsané a Golemio API. Výsledně stažený soubor je pak JSON. Pro další zpracování doporučuji v Linuxu program jq
pro práci s JSON souborem, případně jiné programy. V podstatě důležité údaje jsou číslo linky, trip_ID, ID příští zastávky, a zpoždění.
Mne osobně navíc zajímá ještě dopravce, dlouhé číslo linky, číslo pořadí, GPS poloha, ev. č. vozidla, nízkopodlažnost, rychlost, čas poslání dat a jestli je daný spoj zrušen. Pro stahování dat lze opět na API vybrat vhodný nástroj, mně se líbí příkaz curl
, pomocí něhož lze předat klíč od API. Bez tohoto klíče výsledná data vrátí chybu 401 Unauthorized
. Pokud daný spoj nejede a je zadáno jeho trip_ID, vrátí se výsledek jako 404 Not Found
.
Ukázka dat
Nyní si podrobně popíšeme jednotlivá data. Napřed začneme soubory GTFS od ROPIDu. Zde budu popisovat pouze potřebné soubory stop.txt
a trips.txt
, pokud vás zajímají i ostatní doporučuji buď stránku projektu u Google https://developers.google.com/transit/gtfs nebo přednášku na InstallFestu.
Soubor stop.txt
obsahuje všechny zastávky v síti PID. Dokonce kromě jednotlivých zastávek i konkrétní zastávkové sloupky, případně číslo koleje u metra a výstupy z metra. Pro ilustraci si popíšeme vše z okolí Karlova náměstí, kde se konal InstallFest.
stopid,stopname,stoplat,stoplon,zoneid,stopurl,locationtype,parentstation,wheelchairboarding,levelid,platformcode U237S1,"Karlovo náměstí ",50.07459,14.41698,"P",,1,,2,,
První řádek obsahuje hlavičku, která nám říká ID zastávky, její jméno, zeměpisnou šířku, zeměpisnou délku, tarifní pásmo, adresu na webu, druh zastávky, nadřízenou zastávku, dostupnost pro vozíčkáře, výškovou úroveň (patro) a označení stanoviště.
V tomto případě je nadřazený záznam pro zastávku Karlovo náměstí. Prázdné informace jsou vynechány.
Další ukázkou jsou jednotlivé označníky (zastávkové sloupky)
U237Z1P,"Karlovo náměstí",50.07530,14.41911,"P",,0,,1,,A U237Z2P,"Karlovo náměstí",50.07648,14.41926,"P",,0,,1,,B U237Z3P,"Karlovo náměstí",50.07590,14.41961,"P",,0,,1,,C U237Z4P,"Moráň",50.07402,14.41873,"P",,0,,1,,D U237Z5P,"Palackého náměstí",50.07323,14.41525,"P",,0,,1,,E U237Z6P,"Palackého náměstí",50.07328,14.41432,"P",,0,,1,,F U237Z7P,"Palackého náměstí (nábřeží)",50.07251,14.41411,"P",,0,,1,,G U237Z8P,"Palackého náměstí (nábřeží)",50.07195,14.41410,"P",,0,,1,,H U237Z9P,"Karlovo náměstí",50.07543,14.41889,"P",,0,,0,,I U237Z10P,"Karlovo náměstí",50.07506,14.41886,"P",,0,,0,,J U237Z11P,"Karlovo náměstí",50.07520,14.41890,"P",,0,,0,,K U237Z13P,"Novoměstská radnice",50.07746,14.41952,"P",,0,,1,,M U237Z101P,"Karlovo náměstí",50.07460,14.41696,"P"," ",0,U237S1,0,U237L3,1 U237Z102P,"Karlovo náměstí",50.07458,14.41699,"P"," ",0,U237S1,0,U237L3,2
Poslední dva záznamy pochází ze stanice metra, proto je zde uvedena i nadřízená zastávka, úroveň (L3) a číslo koleje. U ostatních je informace o názvu stanoviště A – M.
Poslední informací jsou výstupy z metra, obsahují je logicky pouze zastávky u metra.
U237S1E1,"Karlovo nám., BUS Strahov",50.07525,14.41877," "," ",2,U237S1,0,U237L0, U237S1E2,"Karlovo nám., TRAM I. P. Pavlova",50.07547,14.41921," "," ",2,U237S1,0,U237L0, U237S1E3,"Karlovo nám., TRAM Národní divadlo",50.07603,14.41953," "," ",2,U237S1,0,U237L0, U237S1E4,"Karlovo nám., ČVUT",50.07604,14.41895," "," ",2,U237S1,0,U237L0, U237S1E5,"Karlovo nám., ul. Resslova",50.07571,14.41841," "," ",2,U237S1,0,U237L0, U237S1E6,"Palackého nám., Jiráskovo nám.",50.07375,14.41520," "," ",2,U237S1,0,U237L0, U237S1E7,"Palackého nám., TRAM Anděl",50.07333,14.41456," "," ",2,U237S1,0,U237L0, U237S1E8,"Palackého nám., TRAM Václavské nám.",50.07317,14.41456," "," ",2,U237S1,0,U237L0, U237S1E9,"Palackého nám., Zítkovy sady",50.07269,14.41514," "," ",2,U237S1,0,U237L0,
Logicky je u nich vyplněno ID nadřízené zastávky (Karlovo náměstí) a úroveň (L0).
Další na řadě je trips.txt
. Opět obsahuje hlavičku, ve které jsou tyto informace.
route_id,service_id,trip_id,trip_headsign,trip_short_name,direction_id,block_id,shape_id,wheelchair_accessible,bikes_allowed,exceptional,trip_operation_typ L991,1111100-1,991_1151_200106,"Nemocnice Motol",,0,,L991V1,1,1,0,1 L991,1111100-1,991_4_200106,"Depo Hostivař",,1,,L991V2,1,1,0,1 L991,1111100-1,991_1152_200106,"Nemocnice Motol",,0,,L991V3,1,1,0,1 L991,1111100-1,991_6_200106,"Depo Hostivař",,1,,L991V4,1,1,0,1 L991,1111100-1,991_1153_200106,"Nemocnice Motol",,0,,L991V5,1,1,0,1 L991,1111100-1,991_8_180709,"Depo Hostivař",,1,,L991V2,1,1,0,1 L991,1111100-1,991_1154_180709,"Nemocnice Motol",,0,,L991V3,1,1,0,1 L991,1111100-1,991_10_180709,"Skalka",,1,,L991V6,1,1,0,1 L13,1111100-1,13_21_200106,"Černokostelecká",,0,13_21_200106,L4V9,2,0,0,7 L174,1111100-1,174_145_191223,"Vypich",,1,301_117_191223,L174V5,1,2,0,1
První je číslo linky, následuje service_id
z calendar.txt
, tj. v které dny daný spoj jede, identifikaci daného spoje, název konečné, případný kratší název, směr tam / zpět, případný přejezd na jinou linku, ID případné trasy z shapes.txt
, přístupnost pro vozíčkáře, vyloučení přepravy kol, výjimky z běžného provozu (např. posílení provozu), druh spoje (pouze pro tramvaje) viz dále.
Druhy spojů mohou být následující (platí pouze pro tramvaje, ostatní zatahující / vyjíždějící prostředky cestující nepřepravují):
- 1 = regulérní spoj na trase
- 7 = výjezd mimo pravidelnou trasu
- 8 = zátah mimo pravidelnou trasu
- 9 = přejezd na lince mimo pravidelnou trasu
- 10 = přejezd na jinou linku
Poslední řádek pak obsahuje přejezd linky 174 ( 174_145_191223
) na linku 301 ( 301_117_191223
).
V1 API dává tyto informace:
{"features":[{"geometry":{"coordinates":[15.21277,50.02425],"type":"Point"},"properties":{"trip":{"cis_agency_name":"OAD~KO~Kolín","cis_id":"230421","cis_number":1018,"cis_order":19,"cis_parent_route_name":"421","cis_real_agency_name":"OAD~KO~Kolín","cis_short_name":null,"cis_vehicle_registration_number":8665," gtfs_route_id":"L421","gtfs_route_short_name":"421","gtfs_trip_id":"421_227_191114","id":"2020-02-27T11:14:00Z_230421_421_1018","start_cis_stop_id":31004," start_cis_stop_platform_code":"5","start_time":"12:14:00","start_timestamp":"2020-02-27T11:14:00.000Z","vehicle_type":4,"wheelchair_accessible":true},"last_position":{"bearing":211,"cis_last_stop_id":66313,"cis_last_stop_sequence":37," delay":118,"delay_stop_arrival":102,"delay_stop_departure":null,"gtfs_last_stop_id":"U4998Z1","gtfs_last_stop_sequence":36," gtfs_next_stop_id":"U2816Z12","gtfs_next_stop_sequence":37,"gtfs_shape_dist_traveled":"61.3","is_canceled":false,"lat":"50.02425","lng":"15.21277","origin_time":"14:05:51"," origin_timestamp":"2020-02-27T13:05:51.000Z","speed":34,"tracking":2,"trips_id":" 2020-02-27T11:14:00Z_230421_421_1018"},"all_positions":{"features":[],"type":"FeatureCollection"}}
V2 API pak tyto:
{”features”:[{”geometry”:{”coordinates”:[13.99978,49.67628],”type”:”Point”},”properties”:{”lastposition”:{”bearing”:83,”delay”:{”actual”:140,”laststoparrival”:61,”laststopdeparture”:null},”iscanceled”:false,”laststop”:{”arrivaltime”:”2020-02-28T19:15:00.000Z”,”departuretime”:”2020-02-28T19:15:00.000Z”,”id”:”U9734Z1”,”sequence”:43},”nextstop”:{”arrivaltime”:”2020-02-28T19:17:00.000Z”,”departuretime”:”2020-02-28T19:17:00.000Z”,”id”:”U9751Z1”,”sequence”:44},”origintimestamp”:”2020-02-28T19:19:32.000Z”,”shapedisttraveled”:”63.9”,”speed”:0},”trip”:{”agencyname”:{”real”:”Martin Uher”,”scheduled”:”Martin Uher”},”cis”:{”lineid”:”100317”,”tripnumber”:1051},”gtfs”:{”routeid”:”L317”,”routeshortname”:”317”,”tripheadsign”:”Příbram,sídl.Archiv”,”tripid”:”317145191125”},”originroutename”:”317”,”sequenceid”:3,”starttimestamp”:”2020-02-28T17:30:00.000Z”,”vehicleregistrationnumber”:1177,”vehicletype”:{”descriptioncs”:”regionalní autobus”,”descriptionen”:”regional bus”,”id”:4},”wheelchairaccessible”:true},”allpositions”:{”features”:[],”type”:”FeatureCollection”}},”type”:”Feature”}
Rozdíl je v jiném pořadí dat a přidání atributů tripheadsign a vehicletype, kde 3 = autobus, 4 = regionální autobus (tj. jedoucí za Prahu či mimo Prahu), 12 = loď. Pokračování příště