Při práci s geografickými daty v kontextu České republiky jsem narazil na to, že Rkový svět je hodně stavěný na realitu anglicky hovořících zemí, zejména Ameriky. Je mnoho a mnoho zdrojů pro kreslení územních celků a celečků USA, ale naše obce a okresy aby člověk hledal s Jiráskovo lucernou.
K dispozici sice je Arc500, se kterým se z Rka dá přes rgdal jakž takž pracovat - ale není to ani úplně uživatelsky vstřícné, ani triviální.
Tak jsem si shapefily upravil a přetvořil do datové package RCzechia, kterou tímto nabízím k použití. Souřadnicový systém je převedený z Křováka na WGS84, které se více kamarádí s google aplikacemi a Rkovými knihovnami.
Z technických příčin (CRAN přijímá balíčky pouze do velikosti 5 MB) nebylo možné objekty uložit v rámci package, a musím je volat externě (jsou uložena na Amazon S3). Práce s packagí tudíž vyžaduje fungující intenetové spojení, a některé objekty - největší potížisté jsou polygony obcí s 36 MB - se mohou stahovat déle. Za zařazení package na CRAN mi to přišlo jako přijatelná cena.
Package obsahuje tyto objekty
- republika: hranice České republiky.
- kraje: 14 krajů České republiky, včetně Hlavního města Prahy.
Klíč pro připojení dat je KOD_CZNUTS3 (kód kraje). - okresy: 76 okresů České republiky + Praha (která technicky není okres).
Klíč pro připojení dat je KOD_LAU1 (kód okresu). - orp_polygony 206 obcí s rozšířenou působností (trojkové obce).
Klíč připojení dat je KOD_ORP. - obce_polygony: 6.258 obcí a vojenských újezdů České republiky.
Klíč pro připojení dat je KOD_OBEC, v datech jsou navíc informace o příslušné obci s pověřeným obecním úřadem (tzv. dvojkové obce - KOD_POU, respektive NAZ_POU) a příslušné obci s rozšířenou působností (tzv. trojkové obce - KOD_ORP, respektive NAZ_ORP). - obce_body stejné jako obce polygony, ale pouze středy.
- casti: primárně 57 městských částí Hlavního města Prahy, ale části jsou i pro Brno a další města.
Klíč pro připojení dat je KOD. - reky: 6.198 řek a potoků České republiky; přidáním do mapy pomohou základní orientaci (Praha bez Vltavy vypadá divně).
- plochy: 480 vodních ploch České republiky; přidáním do mapy pomohou základní orientaci.
- silnice: 18.979 silnic a silniček s rozlišením typu (dálnice, okresky)
- zeleznice: 3.525 železničních tratí s rozlišením typu
- chr_uzemi: 36 velkoplošných chráněných území
- lesy: zalesněná území (s rozlohou nad 30 hektarů)
- KFME_grid: faunistické čtverce podle metodiky Kartierung der Flora Mitteleuropas (KFME)
Všechny objekty jsou technicky realizovány jako funkce vracející data frame, a volají se proto se se závorkami.
Všechny klíče - jak ty, co na první pohled vypadají jako text, tak ty co na první pohled vypadají jako číslo - jsou textové hodnoty. Při práci s nimi se mohou hodit funkce as.numeric()
a as.character()
.
Instalace package
install.packages("RCzechia")
Package je na CRANu, není tedy třeba instalovat přes GitHub; na něm byla a zůstává vývojová verze - https://github.com/jlacko/RCzechia.
Příklady použití
Počet obyvatel po okresech
Počet obyvatel ze sčítání lidu v roce 2011, v původním (pro elektronické zpracování značně nevstřícném, ale výzvy jsou od toho aby se překonávaly) formátu.
Párování dat ze Statistického úřadu s názvy okresů pomocí inner_join()
proběhne překvapivě snadno - zvláštní péči vyžaduje pouze Praha, která se chová jako nestandardní okres a mívá problémy se jménem (je či není Hlavní město?). Funkce inner_join()
elegantně vyřeší nadbytečné řádky z Excelu ze staťáku (z obou zdrojů vybere pouze shodné řádky, ostatní zahodí).
Pro vizualizaci používám verzi objektů okresy
a republika
s nižším rozlišením; jsou sice méně přesné, ale za to více elegantní.
library(RCzechia)
library(tidyverse)
library(readxl)
library(httr)
library(sf)
GET("https://raw.githubusercontent.com/jlacko/RCzechia/master/data-raw/zvcr034.xls",
write_disk(tf <- tempfile(fileext = ".xls")))
#> Response [https://raw.githubusercontent.com/jlacko/RCzechia/master/data-raw/zvcr034.xls]
#> Date: 2019-09-25 07:10
#> Status: 200
#> Content-Type: application/octet-stream
#> Size: 44.5 kB
#> <ON DISK> /tmp/RtmpxtgvIi/file4edb2573ce8e.xls
src <- read_excel(tf, range = "Data!B5:C97") # s původními fujky fuj hlavičkami sloupců
colnames(src) <- c('NAZ_LAU1', 'obyvatel') # hezčí hlavičky
src <- src %>%
mutate(NAZ_LAU1 = ifelse(NAZ_LAU1 == "Hlavní město Praha", "Praha", NAZ_LAU1))
# věčný problém s Prahou - je či není hlaví město?
okresni_data <- okresy("low") %>% # nízké rozlišení je elegantnější...
inner_join(src, by = "NAZ_LAU1")
# filtrovací join = odstraní nadbytečné řádky ze zdroje
ggplot(data = okresni_data) +
geom_sf(aes(fill = obyvatel), colour = NA) +
geom_sf(data = republika(), color = "grey30", fill = NA) +
scale_fill_viridis_c(trans = "log", labels = scales::comma) +
labs(title = "Obyvatelstvo Česka po okresech",
fill = "pop - log scale") +
theme_bw() +
theme(legend.text.align = 1,
legend.title.align = 0.5)
Dohledání bodů a zakreslení souřadnic na mapě
Tři více či méně náhodné body; se zakreslenými hlavními řekami po snazší orientaci (trochu to připomíná slepou mapu z časů základní školy).
Pro dopočtení souřadnic používám funkci geocode()
z balíčku RCzechia
. Zprostředkovává z erka přístup na API Státní správy zeměměřictví a katastru, takže funguje pouze pro české souřadnice.
library(RCzechia)
library(tidyverse)
library(tmap)
library(sf)
borders <- RCzechia::republika("low")
rivers <- subset(RCzechia::reky(), Major == T)
mista <- data.frame(misto = c("Kramářova vila",
"Arcibiskupské zahrady v Kromeříži",
"Hrad Bečov nad Teplou"),
adresa = c("Gogolova 1, Praha 1",
"Sněmovní náměstí 1, Kroměříž",
"nám. 5. května 1, Bečov nad Teplou"))
# obohatit adresy o souřadnice
POI <- RCzechia::geocode(mista$adresa)
ggplot() +
geom_sf(data = POI, color = "red", shape = 20, size = 2) +
geom_sf(data = rivers, color = "steelblue", alpha = 0.5) +
geom_sf(data = borders, color = "grey30", fill = NA) +
labs(title = "Body zvláštní důležitosti") +
theme_bw()
Vzdálenost z Prahy do Brna
Sf package podporuje (přes GDAL
) výpočet několika typů vzdáleností: bod od bodu, bod od polygonu a polygon od polygonu.
Toto jde prakticky využít například ke spočtení vzdálenosti vzdušnou čarou z Prahy do Brna.
library(tidyverse)
library(RCzechia)
library(sf)
library(units)
obce <- obce_polygony()
praha <- subset(obce, obce$NAZ_OBEC == "Praha")
brno <- subset(obce, obce$NAZ_OBEC == "Brno")
vzdalenost <- st_distance(praha, brno) %>%
set_units("kilometers") # šlo by i v metrech, mílích nebo parsekách, ale proč?
print(vzdalenost)
#> Units: [kilometers]
#> [,1]
#> [1,] 152.8073
Střed města Brna
Metafyzický střed města Brna je dobře znám, ale kde má Brno střed zeměpisný?
Pro nalezení středu použiju st_centroid()
z balíčku sf
, který vyžaduje plošnou projekci (proto systém inž. Křováka). Pro dohledání adresy k souřadnicím (reverzní geokódování) použiju revgeo()
z balíčku RCzechia
.
library(dplyr)
library(RCzechia)
library(ggplot2)
library(sf)
brno <- subset(RCzechia::obce_polygony(), NAZ_OBEC == "Brno")
pupek_brna <- brno %>%
st_transform(5514) %>% # planar CRS (eastings & northings)
sf::st_centroid(brno) # calculate central point of a polygon
#> Warning in st_centroid.sf(., brno): st_centroid assumes attributes are
#> constant over geometries of x
# the revgeo() function takes a sf points data frame and returns it back
# with address data in "revgeocoded"" column
adresa_pupku <- RCzechia::revgeo(pupek_brna)$revgeocoded
print(adresa_pupku)
#> [1] "Žižkova 513/22, Veveří, 61600 Brno"
ggplot() +
geom_sf(data = pupek_brna, col = "red", shape = 4, size = 2) +
geom_sf(data = brno, color = "grey30", fill = NA) +
labs(title = "Střed města Brna") +
theme_bw()
Interaktivní mapa
Interaktivní mapy jsou sexy a uživatele baví. A jenom vy můžete vědět, jak snadné je s erkem a balíčky RCzechia
a Leaflet
takovou interaktivní mapu vytvořit :)
Doplním, že interaktivní mapy v vysokém detailu dovedou být hodně velké - obcí je přes šest tisíc, každá z nich představuje polygon spočítaný s přesností přibližně jeden metr. Má to vliv na velikost souboru, a tedy průchodnost sítí internetu.
V případě práce s obecními daty doporučuji zjednodušit, například obrysy pomocí sf::st_simplify(x, dTolerance = y)
. Od okresů výše to takový problém není.
library(dplyr)
library(RCzechia)
library(leaflet)
library(sf)
src <- read.csv(url("https://raw.githubusercontent.com/jlacko/RCzechia/master/data-raw/unempl.csv"), stringsAsFactors = F)
# open data on unemployment from Czech Statistical Office - https://www.czso.cz/csu/czso/otevrena_data
# lightly edited for size (rows filtered)
src <- src %>%
mutate(KOD_OBEC = as.character(uzemi_kod)) # keys in RCzechia are of type character
podklad <- RCzechia::obce_polygony() %>% # obce_polygony = municipalities in RCzechia package
inner_join(src, by = "KOD_OBEC") %>% # linking by key
filter(KOD_CZNUTS3 == "CZ071") # Olomoucký kraj
pal <- colorNumeric(palette = "viridis", domain = podklad$hodnota)
leaflet() %>%
addProviderTiles("Stamen.Toner") %>%
addPolygons(data = podklad,
popup = ~ paste0("<b>", NAZ_OBEC, "</b><br>nezaměstnanost: ", hodnota, "%<br>"),
fillColor = ~pal(hodnota),
fillOpacity = 0.75,
color = "ivory",
opacity = 1/3,
weight = 1)