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.

Z veřejně dostupných dat jsem si proto set “těch našich” geografických dat poskládal sám, a přetvořil do datové package RCzechia, kterou tímto nabízím k použití.

Zdrojem dat mi byl původně produkt ArcČR® 500 ve verzi 3.3 z roku 2016 od ARCDATA PRAHA, ale postupem času jsem pro většinu objektů přešel na otevřená data ČUZK. Menší část objektů vychází z dat ČSÚ.

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 volebních okrsků s 76 MB – se mohou stahovat déle. Za zařazení package na CRAN mi to přišlo jako přijatelná cena.


Obsah package

  • republika: hranice České republiky.
  • kraje: 14 krajů České republiky, včetně Hlavního města Prahy.
  • okresy: 76 okresů České republiky + Praha (která technicky není okres).
  • orp_polygony 206 obcí s rozšířenou působností (trojkové obce).
  • obce_polygony: 6.258 obcí a vojenských újezdů České republiky.
  • 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.
  • reky: 3.616 řek a potoků České republiky; přidáním do mapy pomohou základní orientaci (Praha bez Vltavy vypadá divně).
  • plochy: 1.769 vodních ploch České republiky; přidáním do mapy pomohou základní orientaci.
  • silnice: 59.594 silnic a silniček s rozlišením typu (dálnice, okresky)
  • zeleznice: 9.957 ž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)
  • senat_obvody: 81 volebních obvodů Senátu
  • volebni_okrsky: 14.761 volebních okrsků
  • zip_codes: 2.671 poštovních směrovacích čísel jako polygonů
  • geomorfo: 8 úrovní geomorfologického členění ČR - od 2 systémů přes 27 oblastí po 933 okrsků.

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().

Kromě datových objektů package také zpřístupňuje do erka dvě RESTové API ČUZK:

  • geocode geokódovací API (od adresy k souřadnicím)
  • revgeo reverzně geokódovací API (od souřadic k adrese)

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(ggplot2)
library(dplyr)
library(czso)

src <- czso::czso_get_table("SLDB-VYBER") %>% 
   select(uzkod, obyvatel = vse1111) %>% 
   mutate(obyvatel = as.numeric(obyvatel)) 
  
okresni_data <- okresy("low") %>% # nízké rozlišení je elegantnější...
  inner_join(src, by = c("KOD_OKRES" = "uzkod")) 
    # 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)

# hranice a řeky v nízkém rozlišení vypadají elegantněji
# schválně zkuste resolution = high!
borders <- RCzechia::republika(resolution = "low")

rivers <- RCzechia::reky(resolution = "low") %>% 
             subset(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[1])
#> 152.4636 [kilometers]

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 <- RCzechia::obce_polygony() %>% 
  filter(NAZ_OBEC == "Brno")

pupek_brna <- brno %>%
  st_transform(5514) %>% # systém inž. Křováka (aby fungovaly metry)
  sf::st_centroid(brno) # spočítat střed polygonu

# funkce revgeo() bere jako argument body, a vrací je zpět
# s adresou v novém sloupci "revgeocoded"
adresa_pupku <- RCzechia::revgeo(pupek_brna) %>% 
  pull(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í rmapshaper::ms_simplify(). Od okresů výše to takový problém není.

library(dplyr)
library(RCzechia)
library(leaflet)
library(czso)

# metrika pro mapování - uchazeči za říjen
metrika <- czso::czso_get_table("250169r20") %>% 
   filter(obdobi == "20201031" & vuk == "NEZ0004")

podklad <- RCzechia::obce_polygony() %>% # obce_polygony = všechny obce v ČR
  inner_join(metrika, by = c("KOD_OBEC" = "uzemi_kod")) %>% # spojení klíčem
  filter(KOD_CZNUTS3 == "CZ071") # Olomoucký kraj

pal <- colorNumeric(palette = "viridis",  domain = podklad$hodnota)

leaflet() %>% 
  addProviderTiles("CartoDB.Positron") %>% 
  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)

Výškopis České republiky

Pro porozumění některým přírodním úkazům – například směru toku řek – je dobré znát vlastnosti terénu. Vizualizace výškopisu je dobrým prvním krokem k jeho porozumění.

Package RCzechia podporuje dva módy vizualizace:

  • skutečnou nadmořskou výšku
  • stínovaný reliéf

Tento příklad ilustruje druhou z možností.

library(RCzechia)
library(ggplot2)
library(dplyr)
library(terra)
library(tidyterra)

# terén České republiky "oříznutý" na hranicích
relief <- vyskopis("rayshaded", cropped = TRUE)

# ggplot2 v základu moc nedává rastry; proto obejití přes tidyterra
ggplot() +
  tidyterra::geom_spatraster(data = relief) +
  geom_sf(data = subset(RCzechia::reky(), Major == T), # hlavní řeky
          color = "steelblue", alpha = 2/3) +
  scale_fill_gradientn(colors = hcl.colors(50, "Grays"), # 50 odstínů šedi... 
                       na.value = NA,
                       guide = "none") + # stínování nepotřebuje legendu...
  labs(title = "Řeky a pohoří") +
  theme_bw() +
  theme(axis.title = element_blank())

Senátní volby z podzima 2020

Zobrazení volebních výslekdů je jedno z typických use cases {RCzechia}.

Tento příklad staví na {rvest} pro stažení tabulky z www.volby.cz se zvolenými senátory z podzimních voleb 2020.

Protože se volila jen třetina senátu, tak se výsledky připojí pouze k pro 27 volebích obvodů. Zbytek bude mít - při použití dplyr::left_join() hodnotu NA, což je očekávaný stav.

library(RCzechia)
library(ggplot2)
library(dplyr)
library(rvest)
library(xml2)

# oficiální výsledky na stránkách staťáku
vysledky <- "https://www.volby.cz/pls/senat/se1111?xjazyk=CZ&xdatum=20201002&xv=7&xt=2" %>% 
  xml2::read_html() %>%  # protože rvest::html is deprecated
  rvest::html_nodes(xpath = "//*[@id=\"se1111_t1\"]") %>%  # tabulka podle xpath
  rvest::html_table(fill = T) %>% 
  .[[1]] %>% 
  dplyr::select(OBVOD = Obvod, strana = `Volebnístrana`) %>% 
  # OBVOD jako text, zarovnaný ně dvě místa nulou zleva (tj. 1 >> 01) pro sladění klíčů
  mutate(OBVOD = stringr::str_pad(OBVOD, 2, side = "left", pad = "0"))

podklad <- RCzechia::senat_obvody("low") %>% 
  # levý join = zachování geometrie obvodů bez volby v roce 2020
  left_join(vysledky, by = "OBVOD") 

ggplot() +
  geom_sf(data = RCzechia::republika("low"), size = 1.25) + # hranice republiky
  geom_sf(data = podklad, aes(fill = strana)) +
  labs(title = "Senátní volby - podzim 2020",
       fill = "Strana a uskupení") +
  theme_bw()

Geomorfologie Česka

Česko se setává ze 10 geomorfologických subprovincií (dřívější terminologií soustav). Která z nich je největší?

Prvním krokem je získání dat o subprovinciích pomocí RCzechia::geomorfo("subprovincie"), druhým krokem je výpočet plochy pomocí sf::st_area().

Výsledky jsou setříděny technikou {dplyr} a mapa nakrelena přes {ggplot2}.

library(RCzechia)
library(dplyr)
library(ggplot2)

subprovincie <- RCzechia::geomorfo("subprovincie")

# krok prvý: základní orientace na mapě

ggplot(data = subprovincie) +
  geom_sf(aes(fill = subprovincie)) +
  geom_sf_text(aes(label = kod)) +
  labs(title = "Geomorfologické členění Česka",
       fill = "Subprovincie čili soustavy") +
  theme_bw() +
  theme(axis.title = element_blank())

# krok druhý: výpočet plochy a podání zprávy
geomorfo_setridene <-subprovincie %>% 
  mutate(plocha = units::set_units(st_area(.), km2)) %>% # čitelnější než metry
  st_drop_geometry() %>% # geometrii už nepotřebujeme
  arrange(desc(plocha))

geomorfo_setridene
#> # A tibble: 10 × 3
#>    subprovincie           kod   plocha
#>    <chr>                  <chr>  [km2]
#>  1 Česko-moravská         II    21972.
#>  2 Krkonošsko-jesenická   IV    11340.
#>  3 Česká tabule           VI    11204.
#>  4 Poberounská            V      8071.
#>  5 Vnější Západní Karpaty IX     7164.
#>  6 Krušnohorská           III    6957.
#>  7 Šumavská               I      6680.
#>  8 Vněkarpatské sníženiny VIII   3921.
#>  9 Vídeňská pánev         X       955.
#> 10 Středopolské nížiny    VII     394.

Vidíme, že největší subprovincií (nebo soustavou, což může být kontroverzní) je s velkým odstupem Česko-moravská, s rozlohou 21 971 km².