Kitkaton data, Suomen rakennukset ja R

R
open data
spatial
paikkatieto
R
suomeksi
Tekijä
Julkaistu

2. syyskuuta 2020

Digi- ja väestövirasto (DVV) on julkaissut uuden version Suomalaisten rakennusten osoitteet, postinumerot ja WGS84-koordinaatit ja tällä kertaa ns. kitkattomana datana (frictionless data).

Frictionless data -projektissa pyritään luomaan (taas kerran) tekstipohjainen paketointiformaatti, joka on yhteensopiva eri alustojen ja ohjelmistojen kesken. Syyskuussa 2020 työkalut löytyvät jo seuraaviin ohjelmointikieliin:

Ideana siis on että paketti sisältää json-muotoiset metadatat pakettiin kuuluvien datojen sisällöstä, sijainnista, lisensseistä sekä teknisistä spesifikaatioista. Eri kielille hehitetyillä työkaluilla nämä tiedot on helppo lukea kullekin kielelle ominaisella tavalla.


Seuraavaksi katsotaan DVV:n uutta dataa tarkemmin R-kielen avulla.

Aluksi ladataan zipattu paketti levylle, puretaan se kansioon sekä listataan paketista löytyvät data.

[/kode]
library(dplyr) # CRAN
library(sp) # CRAN
library(sf) # CRAN
library(fs) # CRAN
library(glue) # CRAN
library(archive) # remotes::install_github("jimhester/archive")
library(jsonlite) # CRAN
library(tableschema.r) # CRAN
library(datapackage.r) # CRAN

datadir <- glue('{Sys.getenv("blogin_datapolku")}dvv_kitkaton/')
[/kode]
dir_create(datadir)
datazip <- glue('{datadir}/datazuo.7z')
# Ladataan paketti
download.file("https://www.avoindata.fi/data/dataset/941b70c8-3bd4-4b4e-a8fb-0ae29d2647a1/resource/3c277957-9b25-403d-b160-b61fdb47002f/download/finland_addresses_2022-08-12-json.7z",
              destfile = datazip)
# Puretaan paketti
archive::archive_extract(datazip,
                         dir = datadir)
# Poistetaan paketti
file_delete(datazip)
[/kode]
# Listataan paketin tiedostot
dir_info(datadir, recurse = TRUE) %>% 
  select(path,size,modification_time) %>% 
  arrange(size) -> flies
print(flies %>% 
          mutate(path = sub("^.+dvv_", "dvv_", path)), 
      n = 50)

Paketissa siis on 46 tiedostoa ja yksi kansio ./data. Paketissa on .json-tiedostoa ja katsotaan ensin niiden sisältö.

[/kode]
# Printataan .JSON tiedostojen sisältö
flies %>% 
  filter(grepl("json", path)) %>% 
  pull(path) -> jsons
jsons %>% sub("^.+dvv_", "dvv_", .)

csv_dialect.json -tiedostossa kerrotaan datatiedostojen csv:n murre seuraavasti.

[/kode]
plyr::ldply(fromJSON(jsons[1]), data.frame) %>% as_tibble()

json_table_schema.json -tiedostossa taas kerrotaan datatiedostojen sarakkeiden nimet, datatyypit ja kuvaukset.

[/kode]
plyr::ldply(fromJSON(jsons[2]), data.frame) %>% as_tibble()

datapackage.json -tiedostossa puolestaan on yleistä metatietoa datasta ja julkaisijasta kuten datan lisenssi.

[/kode]
jsonlite::prettify(readLines(jsons[3]))

Katsotaan sitten tarkemmin datapackage.json:n resources-kohtaa

[/kode]
fromJSON(jsons[3]) %>% 
  .$resources -> resources
str(resources)

Sieltä käy ilmi mm. datatiedostojen sijainti (./data) sekä schema-kohdan alta vielä toistamiseen datojen kenttien tiedot.

[/kode]
resources$schema$fields[[1]] %>% as_tibble()

Nyt kun on tiedossa datojen sijainnit, voimme ladata datat R:ään. Sivun alussa olevasta tiedostolistauksesta saattoi huomata että datat ovat sekä maakunnittaisina tiedostoina maakuntakoodilla merkittynä sekä koko maan tiedostona. Maakuntatatoista suurin on Uudenmaan data ja tehdään sen pohjalta pieni kartta.

Koska sarake-erottimena on pilkku, R:ssä meille riittää kun luetaan data normaalilla read.csv-funktiolla. Koska datat ovat melko suuria, käytän readr-paketin funktioita tässä esimerkissä

[/kode]
library(readr)
d <- read_csv(flies[nrow(flies),]$path)
head(d)

Datat näyttää oikein fiksulta, rakennuksia on yhteensä . Piiretään datan rakennuksista vielä loppuun kartta niin että siinä ovat kaikki Helsingin Mannerheimintiellä olevat rakennukset.

[/kode]
manskun_rakennukset <- d %>% 
  filter(municipality == "091",
         street == "Mannerheimintie") 
manskun_rakennukset

Datan sarakkeiden kuvauksessa kerrotaan building_use-sarakkeesta seuraavaa: . Eli luetaan se mukaan osoitteesta: http://www.stat.fi/meta/luokitukset/rakennus/001-2018-07-12/tekstitiedosto.txt

Mannerheimintiellä rakennuksia on 179 ja kartalla ne sijoittuvat näin käyttötarkoituksen mukaan:

[/kode]
rak_sf <- st_as_sf(manskun_rakennukset,
                            coords = c("longitude_wgs84", 
                                       "latitude_wgs84"),
                            crs = "+proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs")

tmpflie <- tempfile()
download.file("https://www.stat.fi/fi/luokitukset/rakennus/rakennus_1_20180712/export/", 
              destfile = tmpflie) 

kayttotark <- read.csv(tmpflie, sep = ";", skip = 3, header = TRUE) %>% 
  mutate(koodi = as.integer(gsub("'", "", code))) %>% 
  rename(nimike = classificationItemName)
rak_sf2 <- left_join(rak_sf,kayttotark, 
                     by = c("building_use" = "koodi"))

library(leaflet)
labels <- sprintf(
  "%s<br/>Käyttötarkoitus: %s",
  paste(rak_sf2$street, rak_sf2$house_number), rak_sf2$nimike
) %>% lapply(htmltools::HTML)
paletti <- colorFactor(
  palette = "Set1",
  domain = rak_sf2$nimike)
leaflet(rak_sf2) %>%
  addTiles(options = tileOptions(opacity = .7)) %>% 
  addCircleMarkers(color = ~paletti(rak_sf2$nimike),label = labels) %>% 
  addLegend("bottomleft", pal = paletti, 
            values = ~nimike,
    opacity = 1
  )

Aivan lopuksi piirretään vielä kartta kaikista datan Helsingin rakennuksista 500m x 500m kuusikulmio-ruuduissa. Tolpan pituus tarkoittaa kussakin ruudussa sijaitsevien rakennusten lukumäärää.

[/kode]
library(mapdeck)
set_token(Sys.getenv("MAPDECK_TOKEN"))

mapdeck( style = mapdeck_style("dark"), pitch = 45) %>%
  add_hexagon(
    data = d %>% filter(municipality == "091", 
                        !is.na(longitude_wgs84))
    , lat = "latitude_wgs84"
    , lon = "longitude_wgs84"
    , layer_id = "hex_layer"
    , elevation_scale = 30
    , radius = 500
    , colour_range = colourvalues::colour_values(1:6, palette = colourvalues::get_palette("viridis")[70:256,])
  )

Uudelleenkäyttö

Viittaus

BibTeX-viittaus:
@online{kainu2020,
  author = {Kainu, Markus},
  title = {Kitkaton data, Suomen rakennukset ja R},
  date = {2020-09-02},
  url = {https://markuskainu.fi/posts/2020-08-02-dvv-kitkatondata-r},
  langid = {fi}
}
Viitatkaa tähän teokseen seuraavasti:
Kainu, Markus. 2020. “Kitkaton data, Suomen rakennukset ja R.” September 2, 2020. https://markuskainu.fi/posts/2020-08-02-dvv-kitkatondata-r.