Blogi — — Risto

Parempi reittiopas

Pänniikö jatkuvasti myöhässä olevat junat? Ihmeisiin avoimella datalla ei pysty, mutta tieto myöhässä olevista junista tuo helpotusta matkoihin.

Lähiaikoina uutisiinkin noussut Joonas Rouhiaisen www.junat.net–palvelu sai paljon huomiota medialta ja helpotti varmasti monen suomalaisen elämää. Palvelu hakee Digitrafficin avoimesta rajapinnasta tietoa junien aikataululuista ja myöhästymisistä. Palvelun tarkoitus on tuoda jokaisen kotiin oma aikataulunäyttö lähimmältä juna-asemalta. Mutta entä jos junaan siirtyy vasta bussimatkan jälkeen?

Käytin junat.net aikatauluja viikon verran tyytyväisenä, mutta koska työaikani on liukuva, enkä käytä päivittäin samoja vuoroja, tarkistan reittiopas.fi:stä, mikä reitti on minulle paras siihen aikaan kun haluan lähteä. Kahden palvelun käyttö ei ole kovin monimutkaista, mutta eikö asian voisi tehdä helpomminkin?

”Sain tehtyä Chrome-selaimeen liitännäisen, joka lisää junien reaaliaikaiset aikataulut suoraan reittiopas.fi:n tarjoamiin reittiehdotuksiin”

Muutaman tunnin dokumentaation lukemisen jälkeen, jesarirullan ja purkkapallon avustuksella sain vihdoin tehtyä Chrome-selaimeen liitännäisen, joka lisää junien reaaliaikaiset aikataulut suoraan reittiopas.fi:n tarjoamiin reittiehdotuksiin. Näin syntyi Reittiopas Enhanced. Ilman tappelua kyseinen liitännäinen ei syntynyt, vaan koodarin piti tälläkin kertaa taipua siihen mitä Digitrafficin rajapinta tarjosi. Mutta miten tämä kokonaisuus sitten toimii?

Junien etsiminen reittiehdotuksesta

Kun reittiopas.fi reittiehdotuslistaa katsoo, junat ja bussit erottuvat toisistaan ainoastaan kuvan ja nimen perusteella. Näistä valitsin hakukriteeriksi kuvan, koska sen osoite pysyy samana vaikka junan nimi vaihtuu. Eli käytännössä homma toimii näin: kun sivu latautuu, liitännäinen etsii kaikki reittiehdotustaulukon sisällä olevat kuva-elementit, jossa osoitteena on ”images/resultSummary/pict_juna.gif”.

Purkkaratkaisu? Kyllä, mutta se toimii.

juna.gif

Kulkuneuvon erottava elementti Reittioppaassa, pict_juna.gif

Pysäkkitietojen hakeminen Digitrafficin rajapinnasta

Jotta Digitrafficin rajapinnasta saisi tiedot junien aikatauluista, pitää aseman nimi ensin muuttaa ns. shortcodeksi, eli 3-kirjaimiseksi, uniikiksi nimeksi. Lista asemien nimistä ja niitä vastaavista shortcodeista löytyy Digitrafficin palvelusta.

Suoraan näitä nimiä ei kuitenkaan voinut käyttää reittioppaan listasta, vaan esimerkiksi Pasilan aseman nimi reittioppaassa on ”Pasilan asema, L.” ja Rajapinnassa ”Pasila asema”. Tähän kohtaan piti lisätä myös vähän purkkaa. Ratkaisuna tein listan poikkeavista asemien nimistä ja niitä vastaavista, rajapinnasta löytyvistä nimistä. Tällä hetkellä listalla on muutama eri nimi, mutta todennäköisesti tulen muuttamaan toiminnan niin, että asema haetaan sen koordinaattien, eikä nimen perusteella. Silloin tällaista erillistä listaa ei tarvita.

Junien aikataulutietojen haku rajapinnasta

Tähän asti tietojen hakeminen ja etsiminen onnistui melko helposti, mutta aikataulujen haku osoittautui suhteellisen haastavaksi. Digitraffic tarjoaa asemalta lähtevien junien hakuun 2 vaihtoehtoa: Asemalle saapuvien ja asemalta lähtevien junien haku joko aikavälirajoituksella tai lukumäärärajoituksella. Se, mitä halusin, oli asemalta haluttuun kellonaikaan lähtevät junat, mutta tätä ei ollut tarjolla.

Päädyin käyttämään lukumäärärajoituksella toimivaa hakua, koska sen käyttäminen vaati vähemmän parametreja. Pienen tutkimisen ja testailun jälkeen totesin, että sadan seuraavan asemalta lähtevän junan hakeminen palautti tarpeeksi junia, että sain niistä haettua juuri ne, mitä Reittiopas ehdotti.

Seuraava haaste oli oikean junan löytäminen näistä sadasta eri junasta. Rajapinnasta palautetusta objektista löytyy hyvä kuvaus Digitrafficin dokumentaatiosta.

Perutut junat Digitrafficin rajapinnassa

Perutut junat Digitrafficin rajapinnassa

Näistä tiedoista minua kiinnosti lähinnä commuterLineID (Junan kirjain, esimerkiksi P, S, I), cancelled (onko juna peruttu) ja timeTableRows-listan sisältä type (onko kyseessä lähtö vai saapuminen), scheduledTime (aikataulun mukainen saapuminen, jonka perusteella yhdistän kyseisen junan reittioppaasta löytyvään junaan) ja differenceInMinutes (kuinka paljon juna on myöhässä tai etuajassa).

”Liitännäistä kokeilleet ihmiset ovat ottaneet sen kiitollisena vastaan. Koko projektin tarkoitus oli helpottaa omaa ja muiden elämää”

Koska en saanut Reittioppaasta tietooni junan id:tä tai muuta tunnistetta, ainoa vaihtoehto oli käydä kaikki Reittioppaasta löytyvien junien kirjaimen omaavat junat läpi. Näistä junista piti myös selvittää mikä on juuri se juna, mitä Reittiopas ehdotti ja ainoa tapa minkä keksin, oli Reittioppaan ehdottaman junan lähtöaika asemalta.

Vaikka jouduin käymään läpi jokaisen junan, jokaisen pysähdyksen asemat ja lähtöajat, tämä ratkaisu osoittautui yllättävän nopeaksi ja vaivattomaksi. Kun oikealta asemalta lähti oikeaan aikaan oikea juna, lisäsin kyseisen junan päivitetyn lähtöajan takaisin Reittioppaan reittiehdotuslistaan.

Vaikka ratkaisu oli juuri ja juuri toimiva purkka speksit täyttävä, liitännäistä kokeilleet ihmiset ovat ottaneet sen kiitollisena vastaan. Koko projektin tarkoitus oli helpottaa omaa ja muiden elämää.

Parempi Reittiopas

Reittiopas Enhanced

Haluan pitää projektin avoimena, joten julkaisin sen myös Githubissa MIT-lisenssillä varustettuna.

Jatkokehitysideat

Kuten jokainen ohjelmoija tietää, ohjelma ei ole ikinä valmis, vaan siitä löytyy aina jotain kehitettävää ja parannettavaa. Niin on tälläkin kertaa.

Tieto myös bussien ja raitiovaunujen myöhästymisistä

HSL tarjoaa tiedon myös bussien ja ratikoiden pysäkkikohtaisista aikatauluistaan oman rajapintansa kautta. Tässä on kuitenkin se ongelma, että kyseinen rajapinta vaatii kirjautumisen, eikä sitä sen vuoksi voi suoraan liitännäisen kautta käyttää. Ratkaisu tähän on kierrättää liikenne oman palvelimeni kautta. Tämä on todennäköinen kehityskohde, jonka luultavasti toteutan jos liitännäinen saa tarpeeksi käyttäjiä että lisäpanostuksesta tulee edes jollakin tasolla kannattavaa.

Myöhästymistietojen lisääminen myös tarkempaan reittikuvaukseen

Tällä hetkellä myöhästymistiedot lisätään ainoastaan listaan, jossa näytetään reittiehdotukset, eikä tarkempaan kuvaukseen reitistä. Olin laiska, korjaan joskus.

Parempi junahaku

Junahaku on niin monimutkaisesti tehty, että siitä löytyy paljon parannettavaa. Luultavasti teen tämän kokonaan uudestaan pidemmän suunnittelun jälkeen.

Lisäosa myös muihin selaimiin

En näe mahdottomana tehdä liitännäistä myös muihin selaimiin, kuten Mozilla Firefoxiin, ellei siitä koidu suunnattomasti vaivaa.

Erillinen reittiopas

Eräs ikuisuusprojektini on Parempireittiopas.fi (työnimi), jossa olisi myöhästymiset huomioon ottava reittihaku, joka käyttäisi hyväkseen HSL, Google Maps ja Digitraffic Rata rajapintoja.

Mobiilisovellus

Nykyään kaikki pitää tehdä puhelimilla ja tableteilla, miksei myös tämä? Android-sovelluksen tekoa olen harkinnut silloin tällöin, mutta iOS-tukea en todennäköisesti pysty tekemään, ellei ihmeitä tapahdu.

Risto Viitanen Ohjelmistosuunnittelija