R-ohjelmointi.org

Tilastotieteellistä ohjelmointia R-kielellä

Matka.fi – API vai ruudunkaavinta?

Matka.fi on Liikenneviraston tarjoama, yhteistyönä ylläpidetty palvelu, joka sisältää koko maan kattavia aikataulutietoja. Sinällään se on verrattavissa ehkä tunnetumpaan reittiopas.fi -palveluun, ja esimerkiksi API:n käyttäjäksi rekisteröityminen toimii samalla tavoin.

Valitettavasti API ei vain toimi. Rekisteröityminen kyllä tuntuisi onnistuvan, mutta siihen homma sitten tyssääkin. Vaikka kuinka yrittäisi autentikoitua ohjeiden mukaisesti ja käyttää API:a tietojen hakemiseen, ei ota onnistuakseen. Se on harmi, koska olisi ollut mukavampi käyttää valmista API:a kuin laatia oma funktio tietojen kokoon raapimiseen. Palvelun hyväksi mainittakoon, että API toimi ihan hyvin arviolta noin vuosi taaksepäin, joten ehkä tämä on tilapäistä yskähtelyä. Alkuperäiseen kysymykseen tuli kuitenkin heti vastaus: ruudunkaavintaahan se tulee taas tämäkin olemaan.

Onneksi R tarjoaa nykyisin mukavasti toiminnallisuutta tällaiseen harrastustoimintaan. Aiemmin olen käyttänyt RCurl-pakettia vastaavanlaisten sovellusten tekemiseen, mutta ainakin tässä tapauksessa riittä pelkän XML-paketin toiminnallisuus. Laadin kokoon seuraavan funktion:

matka<-function(mistä_katu, mistä_numero, mistä_kaupunki, mihin_katu, mihin_numero, mihin_kaupunki, vuosi, kuukausi, päivä, tunti, minuutti, perillä=TRUE, bussi=TRUE, juna=TRUE, lentokone=TRUE) {
   require(XML)
   keya<-paste0(mistä_katu, "+", mistä_numero, "%2C+", mistä_kaupunki)
   keyb<-paste0(mihin_katu, "+", mihin_numero, "%2C+", mihin_kaupunki)
   hour<-tunti
   min<-minuutti
   vm<-perillä+1
   day<-päivä
   month<-kuukausi
   year<-vuosi
   prefer<-paste(ifelse(bussi, "&prefer_bus=on", ""), ifelse(juna, "&prefer_train=on", ""), ifelse(lentokone, "&prefer_airplane=on", ""), sep="", collapse="")
   html<-paste0("http://www.matka.fi/fi/?",
                "keya=",   keya,
                "&keyb=",  keyb,
                "&hour=",  hour,
                "&min=",   min,
                "&vm=",    vm,
                "&day=",   day,
                "&month=", month,
                "&year=",  year,
                prefer,
                "&adv="
               )
   html<-readLines(html)
   doc<-htmlParse(html)
   tableNodes <<- getNodeSet(doc, "//table")
   tb1 <- readHTMLTable(tableNodes[[27]], header=TRUE, skip=1)
   tulos<-list(tb1)[[1]]
   #tulos[,5]<-as.character(tulos[,5])
   #tulos[,6]<-as.character(tulos[,6])
   #colnames(tulos)<-c("Matkaan", "Pysäkiltä", "Perillä", "Matka-aika", "Kävelyä yht.", "Liikennevälineessä", "Kartta")
   #tulos<-tulos[,-ncol(tulos)]
   #tulos[is.na(tulos)]<-""
   return(tulos)
}

Funktion vaatima syöte on melko yksityiskohtainen, mutta se helpottaa haun toteuttamista. Nyt toteutetulla funktiolla on mahdollista esimerkiksi tutkia, miten pääsisimme Helsingin sisäisessä liikenteessä paikasta toiseen, tai vaihtoehtoisesti miten kaupunkien välinen liikenne toimii. Funktion vaatimia perustietoja ovat mistä, mihin ja milloin. Keskeisiä, ei ehkä itsestään selviä argumentteja ovat perillä, joka määrittelee, onko määritelty ajankohta se, jolloin lähdetään liikkelle, vai jolloin pitäisi olla jo perillä. Viimeiset kolme argumenttia määrittelevät, mitkä kulkuneuvotyypit reitin etsinnässä huomioidaan (bussi, juna ja lentokone).

matka("Laivurinkatu", "4", "Helsinki", "Jollaksentie", "11", "Helsinki", "2014", "09", "01", "16", "00", perillä=FALSE, bussi=TRUE, juna=FALSE, lentokone=FALSE)
 
   Matkaan  Pysäkiltä  Perillä  Matka-aika  Kävelyä yht.  Liikennevälineet         KarttaÂ
1      16:05          16:08       16:53        46 min            0.5 km         -3-Metro-85-  Näytä reitti
2                                                                                                            
3          -              3           -         Metro                 -                   85                -
4      16:10          16:13       17:01        50 min            0.6 km        -1A-Metro-85-  Näytä reitti
5                                                                                                            
6          -             1A           -         Metro                 -                   85                -
7      16:17          16:19       17:09        50 min            0.5 km        -18-Metro-85-  Näytä reitti
8                                                                                                            
9          -             18           -         Metro                 -                   85                -
 
 
matka("Salpatie", "1", "Hollola", "Kajanuksenkatu", "1", "Helsinki", "2014", "09", "01", "08", "00", perillä=TRUE, bussi=TRUE, juna=TRUE, lentokone=FALSE)
 
   Matkaan  Pysäkiltä  Perillä  Matka-aika  Kävelyä yht.  Liikennevälineet         KarttaÂ
1      04:03          04:28       07:20    3 h 16 min            2.5 km       -Bussi-266-69-  Näytä reitti
2                                                                                                            
3          -          Bussi           -           266                 -                   69                -
4      03:12          05:37       07:01    3 h 47 min           10.9 km               -Z-43-  Näytä reitti
5                                                                                       <NA>             <NA>
6          -              Z           -            43                 -                 <NA>             <NA>
7      02:03          04:20       06:11     4 h 7 min           10.5 km              -Bussi-  Näytä reitti
8                                                <NA>              <NA>                 <NA>             <NA>
9          -          Bussi           -          <NA>              <NA>                 <NA>             <NA>

Funktio vaatisi vielä vähän viimeistelytöitä, koska tuloksen ulkonäkö on melko ”maanläheinen” (lue: karu), mutta ainakin se palauttaa oikeanmuotoisen tuloksen.


Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *