Huomasin analysoidessani Oulun postinumeroalueita, että R:llä useiden eri shapefilejen lataaminen WFS-rajapinnalta käy aivan leikiten. Kun äskettäin opin myös hyödyntämään yhä paremmin stringr-paketin työkaluja kuten str_split() (stringin paloittelu) ja str_subset (string-vektorin suodatus), hiirityöskentelyn määrä lähentelee nollaa.

Ladataan Tilastokeskuksen rajapinnalta kaikki postinumero-shapefilet. R-paketin gdalUtils käyttö edellyttää, että gdal on asennettuna, mutta riittää myös, että koneelle on asennettu ilmainen ja avoin QGIS.

gdalUtils::ogrinfo() antaa vektorina rajapinnan tiedot, jotka eivät sellaisenaan käy rajapintahauiksi, joten käsittelen niitä hieman. Saan tuloksena neljä karttatason nimeä.

library(tidyverse) # kaikki olennaiset paketit kerralla

rajapinta <- "WFS:http://geo.stat.fi/geoserver/postialue/wfs"

haku <- gdalUtils::ogrinfo(rajapinta)

wfs_haut <- haku %>% 
  str_subset("pno_tilasto_") %>% 
  str_split(" ") %>% 
  unlist() %>% 
  str_subset("pno")

wfs_haut
#> [1] "postialue:pno_tilasto_2015" "postialue:pno_tilasto_2016"
#> [3] "postialue:pno_tilasto_2017" "postialue:pno_tilasto_2018"

Seuraavassa kääräisen edellisen vektorin tibble:ksi enframe()-funktiolla ja muokkaan tauluun ensimmäiseen sarakkeeseen siistit nimet ladattaville tiedostoille.

wfs_haut_df <- wfs_haut %>% 
  enframe() %>% 
  mutate(name = str_sub(value, 11, nchar(value)))

wfs_haut_df
#> # A tibble: 4 x 2
#>   name             value                     
#>   <chr>            <chr>                     
#> 1 pno_tilasto_2015 postialue:pno_tilasto_2015
#> 2 pno_tilasto_2016 postialue:pno_tilasto_2016
#> 3 pno_tilasto_2017 postialue:pno_tilasto_2017
#> 4 pno_tilasto_2018 postialue:pno_tilasto_2018

Tietäen sarakkeiden sisällön ja järjestyksen, voin käyttää juuri tällaisiin tilanteisiin sopivaa purrr-paketin pwalk()-funktiota, joka ei muuta funktiolle annettavaa tietoa tai tietoja mitenkään, mutta hyödyntää sille annettavan funktion sivuvaikutuksen, joka tässä tapauksessa on tiedoston kirjoittaminen. Annan pwalk():lle funktion formula-muodossa niin, että ..1 ja ..2 osoittavat sarakkeiden sijainnit. ogr2ogr()-funktion ensimmäinen argumentti on rajapinnan osoite, joka on minulla tallennettu rajapinta-objektissa. Toinen argumentti on kohdetiedostopolku, jonka rakennan palasista. Kolmas argumentti on karttatason nimi, joka on tallennettu toiseen sarakkeeseen.

# dir.create("data/pno/", recursive = TRUE) # hakemiston luonti

wfs_haut_df %>% 
  pwalk(~ gdalUtils::ogr2ogr(rajapinta, paste0("data/pno/", ..1, ".shp"), ..2))

Nyt minulla on paikalliselle levylle tallennettuna neljä shapefileä.

list.files("data/pno") %>% str_subset("\\.shp$")
#> [1] "pno_tilasto_2015.shp" "pno_tilasto_2016.shp" "pno_tilasto_2017.shp" "pno_tilasto_2018.shp"