Digiloikka ja korona-ajan GPS-kisat - gpx-reittiin vauhtia R-kielen avulla

R
data
spatial
paikkatieto
R
suomeksi
Tekijä
Julkaistu

19. toukokuuta 2020

Korona-aika on tuonut mukanaan uusia innovaatioita myös urheilukilpailujen järjestämiseen. Suunnistus on yksi lajeista, joissa on siirrytty omatoimikilpailuihin: HS: Mittari näyttää löytyikö rasti ja kuka oli nopein: korona-aika kasvatti gps-kisojen suosiota.

Helsingin suunnistajien keväisin ja syksyisin järjestämä firmaliiga on myös joutunut sopeuttamaan toimintaansa ja parhaillaan kevätkauden kilpailuja käydään gps-kisojen muodossa - reilun pelin hengessä, tottakai!

Korona-aikana on puhuttu myös paljon kotona, kouluissa ja työpaikoilla otetuista digiloikista. Jotta se ei jäisi pelkäksi videoneuvottelujen opettelemiseksi, yritän tällä esimerkillä (jälleen!) motivoida ihmisiä innostumaan ohjelmoinnista. Ja mikäpä olisikaan konkreettisempi digiloikka kuin oman suorituksen gps-jäljen manipuloiminen loppuajan parantamiseksi.

GPS-kisoissa suoritus ladataan jollekin alustalle useimmiten gpx-tiedostoformaatissa, joka on avoin xml-pohjainen tiedostomuoto piste- ja reittimuotoisten gps-jälkien siirtämiseen. gpx on tekstipohjainen tiedosto, jonka manipuloiminen ohjelmallisesti on melko yksinkertaista. Alla on ota_digiloikka()-nimisen funktion lähdekoodi avoimella R-kielellä. Funktiolle annetaan polku suorituksen .gpx-tiedostoon (infile), nimi manipuloidulle tiedostolle (outfile) sekä ns. huijausprosentti (cheat_pros) eli haluttu ajan parannus prosentteina.

ota_digiloikka <- function(infile, outfile, cheat_pros){
  
  require(dplyr)
  require(glue)
  lns <- readLines(infile)
  
  dat <- tibble(orig = grep("^<time>", lns, value = TRUE)) %>% 
    mutate(time = sub("Z", "", 
                      sub("T", " ", gsub("<time>|</time>", "", orig)))
    ) %>% 
    mutate(time = as.POSIXct(time),
           duration = as.numeric(time - time[1]),
           new_duration = round(duration * (1-cheat_pros/100)),
           dur_diff = duration - new_duration,
           new_time = time - lubridate::seconds(dur_diff),
           trimmed = as.character(glue("<time>{sub(' ', 'T', new_time)}Z</time>"))
    ) %>% 
    select(orig,trimmed)
  
  replace_with_new_time <- function(string, patterns, replacements) {
    for (i in seq_along(patterns))
      string <- gsub(patterns[i], replacements[i], string, perl=TRUE)
    string
  }
  
  lns2 <- replace_with_new_time(lns, dat$orig, dat$trimmed)
  writeLines(lns2, outfile)
}

Kävin perjantaina juoksemassa Firmaliigan ensimmäisen osakilpailun Nuuksiossa ja kokeilin miltä vaatimaton 45 prosentin ajan parannus saisi menon näyttämään. Eli kutsuin funktiota seuraavasti:

ota_digiloikka(infile = "2020-05-15_132316.gpx", 
            outfile = "newfile.gpx", 
            cheat_pros = 45)

ja lopputulos näkyy rastit.fi-palvelussa alla. Oma suoritukseni on Kalle Kuntosuunnistaja, johon digiloikan ottanut Elmo tekee surutta eroa.

Ja lopuksi vielä muistutus että tällaisia vippaskonsteja ei saa käyttää vaikkei niitä säännöissä suoraan kielletä. Se on sitä reilun pelin henkeä! Tässä linkki 1. osakilpailun reittipalveluun

Uudelleenkäyttö

Viittaus

BibTeX-viittaus:
@online{kainu2020,
  author = {Kainu, Markus},
  title = {Digiloikka ja korona-ajan GPS-kisat - gpx-reittiin vauhtia
    R-kielen avulla},
  date = {2020-05-19},
  url = {https://markuskainu.fi/posts/2020-05-19-ota-digiloikka},
  langid = {fi}
}
Viitatkaa tähän teokseen seuraavasti:
Kainu, Markus. 2020. “Digiloikka ja korona-ajan GPS-kisat - gpx-reittiin vauhtia R-kielen avulla.” May 19, 2020. https://markuskainu.fi/posts/2020-05-19-ota-digiloikka.