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:
- Clojure: https://github.com/frictionlessdata/datapackage-clj
- Go: https://github.com/frictionlessdata/datapackage-go
- Java:https://github.com/frictionlessdata/datapackage-java
- Javascript: https://github.com/frictionlessdata/datapackage-js
- Julia: https://github.com/frictionlessdata/DataPackage.jl
- MATLAB: https://github.com/KrisKusano/datapackage
- PHP: https://github.com/frictionlessdata/datapackage-php
- Python: https://github.com/frictionlessdata/datapackage-py
- R: https://github.com/frictionlessdata/datapackage-r
- Ruby: https://github.com/frictionlessdata/datapackage-rb
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.
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/')
dir_create(datadir)
datazip <- glue('{datadir}/datazuo.7z')
# Ladataan paketti
download.file("https://www.avoindata.fi/data/dataset/941b70c8-3bd4-4b4e-a8fb-0ae29d2647a1/resource/18e2b019-e986-4cf5-abfe-e6771f6e04d8/download/finland_addresses_2020-11-13_json.7z",
destfile = datazip)
# Puretaan paketti
archive::archive_extract(datazip,
dir = datadir)
# Poistetaan paketti
file_delete(datazip)
# 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 = 30)
## # A tibble: 24 x 3
## path size modification_time
## <fs::path> <fs::byte> <dttm>
## 1 dvv_kitkaton/csv_dialect.json 172 2020-11-13 11:07:54
## 2 dvv_kitkaton/json_table_schema.json 2.06K 2020-11-13 11:07:54
## 3 dvv_kitkaton/datapackage.json 3.89K 2020-11-13 11:07:54
## 4 dvv_kitkaton/data 4K 2020-11-13 11:08:31
## 5 dvv_kitkaton/data/19_addresses_2020-11-13.csv 1.96M 2020-11-13 11:07:55
## 6 dvv_kitkaton/data/15_addresses_2020-11-13.csv 3.42M 2020-11-13 11:08:02
## 7 dvv_kitkaton/data/17_addresses_2020-11-13.csv 4.59M 2020-11-13 11:07:58
## 8 dvv_kitkaton/data/08_addresses_2020-11-13.csv 7.41M 2020-11-13 11:08:17
## 9 dvv_kitkaton/data/07_addresses_2020-11-13.csv 8.31M 2020-11-13 11:08:19
## 10 dvv_kitkaton/data/04_addresses_2020-11-13.csv 8.39M 2020-11-13 11:08:25
## 11 dvv_kitkaton/data/06_addresses_2020-11-13.csv 8.63M 2020-11-13 11:08:20
## 12 dvv_kitkaton/data/13_addresses_2020-11-13.csv 9.95M 2020-11-13 11:08:06
## 13 dvv_kitkaton/data/14_addresses_2020-11-13.csv 10.01M 2020-11-13 11:08:04
## 14 dvv_kitkaton/data/11_addresses_2020-11-13.csv 10.5M 2020-11-13 11:08:10
## 15 dvv_kitkaton/data/18_addresses_2020-11-13.csv 11.59M 2020-11-13 11:07:57
## 16 dvv_kitkaton/data/03_addresses_2020-11-13.csv 11.7M 2020-11-13 11:08:28
## 17 dvv_kitkaton/data/09_addresses_2020-11-13.csv 12.77M 2020-11-13 11:08:15
## 18 dvv_kitkaton/data/10_addresses_2020-11-13.csv 13.36M 2020-11-13 11:08:13
## 19 dvv_kitkaton/data/12_addresses_2020-11-13.csv 13.9M 2020-11-13 11:08:08
## 20 dvv_kitkaton/data/16_addresses_2020-11-13.csv 17.73M 2020-11-13 11:08:01
## 21 dvv_kitkaton/data/05_addresses_2020-11-13.csv 18.8M 2020-11-13 11:08:24
## 22 dvv_kitkaton/data/02_addresses_2020-11-13.csv 20.7M 2020-11-13 11:08:33
## 23 dvv_kitkaton/data/01_addresses_2020-11-13.csv 30.7M 2020-11-13 11:08:37
## 24 dvv_kitkaton/data/Finland_addresses_2020-11-1… 224.5M 2020-11-13 11:08:31
Paketissa siis on 23 tiedostoa ja yksi kansio ./data
. Paketissa on kolme .json
-tiedostoa ja katsotaan ensin niiden sisältö.
# Printataan .JSON tiedostojen sisältö
flies %>%
filter(grepl("json", path)) %>%
pull(path) -> jsons
jsons %>% sub("^.+dvv_", "dvv_", .)
## dvv_kitkaton/csv_dialect.json dvv_kitkaton/json_table_schema.json
## dvv_kitkaton/datapackage.json
csv_dialect.json
-tiedostossa kerrotaan datatiedostojen csv:n murre seuraavasti.
## # A tibble: 7 x 2
## .id X..i..
## <chr> <chr>
## 1 csvddfVersion "1.2"
## 2 delimiter ","
## 3 doubleQuote "TRUE"
## 4 lineTerminator "\r\n"
## 5 quoteChar "\""
## 6 skipInitialSpace "TRUE"
## 7 header "TRUE"
json_table_schema.json
-tiedostossa taas kerrotaan datatiedostojen sarakkeiden nimet, datatyypit ja kuvaukset.
## # A tibble: 9 x 4
## .id name type description
## <chr> <chr> <chr> <chr>
## 1 fields building_id string Identifier for Finnish buildings
## 2 fields region string Identification number for Finnish regions. See: htt…
## 3 fields municipali… string Identification number for Finnish municipalities. S…
## 4 fields street string Street name: an identifying name given to a street
## 5 fields house_numb… string Unique number to each building in a street or area,…
## 6 fields postal_code string Series of digits included in a postal address for t…
## 7 fields latitude_w… number Coordinate latitude in the WGS 84 standard. The Wor…
## 8 fields longitude_… number Coordinate longitude in the WGS 84 standard. The Wo…
## 9 fields building_u… integ… Intended use of building. The identification codes …
datapackage.json
-tiedostossa puolestaan on yleistä metatietoa datasta ja julkaisijasta kuten datan lisenssi.
## {
## "name": "finnish-addresses-postalcodes-and-coordinates",
## "title": "Data of finnish addresses with postal codes and coordinates",
## "description": "The data is provided for separately for each region (e.g.: xx_addresses_yyyy-mm-dd.csv) and alternatively as a single csv file (e.g.: Finland_addresses_yyyy-mm-dd.csv). See this link for region codes: https://dvv.fi/tilastot-ja-luettelot, file Maakunnat.xlsx",
## "licenses": [
## {
## "url": "https://creativecommons.org/licenses/by/4.0/",
## "name": "Creative Commons Attribution 4.0 International",
## "version": "4.0"
## },
## {
## "url": "http://www.jhs-suositukset.fi/suomi/jhs189",
## "name": "Finnish public sector open data license"
## }
## ],
## "sources": [
## {
## "name": "DVV Population Information System",
## "web": "http://dvv.fi/en/population-information-system"
## }
## ],
## "maintainers": [
## {
## "name": "Mika Honkanen",
## "email": "mika.honkanen@dvv.fi",
## "web": "https://www.avoindata.fi/en"
## }
## ],
## "publishers": [
## {
## "name": "Mika Honkanen",
## "email": "mika.honkanen@dvv.fi",
## "web": "https://www.avoindata.fi/en"
## }
## ],
## "resources": [
## {
## "name": "addresses",
## "path": "./data/*.csv",
## "format": "csv",
## "mediatype": "text/csv",
## "schema": {
## "fields": [
## {
## "name": "building_id",
## "type": "string",
## "description": "Identifier for Finnish buildings"
## },
## {
## "name": "region",
## "type": "string",
## "description": "Identification number for Finnish regions. See: https://dvv.fi/tilastot-ja-luettelot, file Maakunnat.xlsx"
## },
## {
## "name": "municipality",
## "type": "string",
## "description": "Identification number for Finnish municipalities. See: http://tilastokeskus.fi/meta/luokitukset/kunta/001-2019/index.html"
## },
## {
## "name": "street",
## "type": "string",
## "description": "Street name: an identifying name given to a street"
## },
## {
## "name": "house_number",
## "type": "string",
## "description": "Unique number to each building in a street or area, with the intention of making it easier to locate a particular building"
## },
## {
## "name": "postal_code",
## "type": "string",
## "description": "Series of digits included in a postal address for the purpose of sorting mail."
## },
## {
## "name": "latitude_wgs84",
## "type": "number",
## "description": "Coordinate latitude in the WGS 84 standard. The World Geodetic System (WGS) is a standard for use in cartography, geodesy, and navigation including GPS."
## },
## {
## "name": "longitude_wgs84",
## "type": "number",
## "description": "Coordinate longitude in the WGS 84 standard. The World Geodetic System (WGS) is a standard for use in cartography, geodesy, and navigation including GPS."
## },
## {
## "name": "building_use",
## "type": "integer",
## "description": "Intended use of building. The identification codes with the corresponding letter codes from stat.fi are: 0 The intended use of building is lacking, 1 Residental building or business premises (A - H), and 2 Production building or other building (J - N). See: http://www.stat.fi/meta/luokitukset/rakennus/001-2018-07-12/index_en.html"
## }
## ]
## }
## }
## ]
## }
##
Katsotaan sitten tarkemmin datapackage.json
:n resources
-kohtaa
## 'data.frame': 1 obs. of 5 variables:
## $ name : chr "addresses"
## $ path : chr "./data/*.csv"
## $ format : chr "csv"
## $ mediatype: chr "text/csv"
## $ schema :'data.frame': 1 obs. of 1 variable:
## ..$ fields:List of 1
## .. ..$ :'data.frame': 9 obs. of 3 variables:
## .. .. ..$ name : chr "building_id" "region" "municipality" "street" ...
## .. .. ..$ type : chr "string" "string" "string" "string" ...
## .. .. ..$ description: chr "Identifier for Finnish buildings" "Identification number for Finnish regions. See: https://dvv.fi/tilastot-ja-luettelot, file Maakunnat.xlsx" "Identification number for Finnish municipalities. See: http://tilastokeskus.fi/meta/luokitukset/kunta/001-2019/index.html" "Street name: an identifying name given to a street" ...
Sieltä käy ilmi mm. datatiedostojen sijainti (./data
) sekä schema
-kohdan alta vielä toistamiseen datojen kenttien tiedot.
## # A tibble: 9 x 3
## name type description
## <chr> <chr> <chr>
## 1 building_id string Identifier for Finnish buildings
## 2 region string Identification number for Finnish regions. See: https://…
## 3 municipality string Identification number for Finnish municipalities. See: h…
## 4 street string Street name: an identifying name given to a street
## 5 house_number string Unique number to each building in a street or area, with…
## 6 postal_code string Series of digits included in a postal address for the pu…
## 7 latitude_wg… number Coordinate latitude in the WGS 84 standard. The World Ge…
## 8 longitude_w… number Coordinate longitude in the WGS 84 standard. The World G…
## 9 building_use integer Intended use of building. The identification codes with …
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 /home/aurelius/btsync/web/markuskainu19/local_data/dvv_kitkaton/data/Finland_addresses_2020-11-13.csv 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ä
## # A tibble: 6 x 9
## building_id region municipality street house_number postal_code latitude_wgs84
## <chr> <chr> <chr> <chr> <chr> <chr> <dbl>
## 1 100085724R <NA> <NA> <NA> <NA> 25830 60.1
## 2 100170063B <NA> <NA> <NA> <NA> 34550 62.1
## 3 100170070K <NA> <NA> <NA> <NA> 34550 62.1
## 4 100170071L <NA> <NA> <NA> <NA> 39700 62.0
## 5 100170072M <NA> <NA> <NA> <NA> 39700 61.9
## 6 100170073N <NA> <NA> <NA> <NA> 34550 62.0
## # … with 2 more variables: longitude_wgs84 <dbl>, building_use <dbl>
Datat näyttää oikein fiksulta, rakennuksia on yhteensä 3692631. Piiretään datan rakennuksista vielä loppuun kartta niin että siinä ovat kaikki Helsingin Mannerheimintiellä olevat rakennukset.
manskun_rakennukset <- d %>%
filter(municipality == "091",
street == "Mannerheimintie")
manskun_rakennukset
## # A tibble: 180 x 9
## building_id region municipality street house_number postal_code
## <chr> <chr> <chr> <chr> <chr> <chr>
## 1 100809206V 01 091 Manne… 15b 00260
## 2 100809208X 01 091 Manne… 15a 00260
## 3 1013132799 01 091 Manne… 113 00300
## 4 1017008098 01 091 Manne… 166 00300
## 5 101797595C 01 091 Manne… 113 00280
## 6 102320284A 01 091 Manne… 117 00280
## 7 102384058J 01 091 Manne… 81a 00270
## 8 102384059K 01 091 Manne… 81a 00270
## 9 102384063P 01 091 Manne… 81-83 00270
## 10 102394189B 01 091 Manne… <NA> 00280
## # … with 170 more rows, and 3 more variables: latitude_wgs84 <dbl>,
## # longitude_wgs84 <dbl>, building_use <dbl>
Datan sarakkeiden kuvauksessa kerrotaan building_use
-sarakkeesta seuraavaa: Intended use of building. The identification codes with the corresponding letter codes from stat.fi are: 0 The intended use of building is lacking, 1 Residental building or business premises (A - H), and 2 Production building or other building (J - N). See: http://www.stat.fi/meta/luokitukset/rakennus/001-2018-07-12/index_en.html. 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:
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ää.
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,])
)