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ů)

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(tmap)
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-01-11 07:19
#>   Status: 200
#>   Content-Type: application/octet-stream
#>   Size: 44.5 kB
#> <ON DISK>  /tmp/RtmpqWOdse/file63375156169.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

vystup <- tm_shape(okresni_data) + tm_fill(col = "obyvatel", title = "Population", 
                                           palette = "Blues", style = "quantile", n = 5) +
  tm_shape(okresni_data) + tm_borders("grey40", lwd = 0.5) + # tenké hranice okresů
  tm_shape(republika("low")) + tm_borders("grey30", lwd = 1.5) + # tlusté hranice republiky
  tm_layout(frame = F) # bez okrajů mapy

print(vystup)

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 mi to připomíná slepou mapu z časů základní školy).

Pro dopočtení souřadnic je možné použít funkci geocode() z balíčku ggmap. Je praktická a funguje, ale předpokládá souhlas s podmínkami užití Google; po nedávných změnách v API navíc povinně vyžaduje registraci a použití s API klíčem. Nejsem připraven zde zveřejnit svůj, a tak z nouze používám koordináty natvrdo.

library(RCzechia)
library(tidyverse)
library(tmap)
library(sf)

rivers <- reky()

rivers <- rivers[rivers$Major == T, ]

mista <- data.frame(misto = c('kramarova vila', 'arcibiskupske zahrady v kromerizi', 'becov nad teplou'),
                    lon = c(14.41030, 17.39353, 12.83833),
                    lat = c(50.09380, 49.30048, 50.08346))

# mista <- ggmap::geocode(...)
# Ale! po změnách v Google API nejde spustit bez konkrétního API klíče :(

POI <- mista %>% # obohatit místa o souřadnice
  st_as_sf(coords = c("lon", "lat"), crs = 4326) 
  # přechod z "obyčejného" data frame na prostorový 

vystup <- tm_shape(republika()) + tm_borders("grey30", lwd = 1) +
  tm_shape(rivers) + tm_lines(col = 'steelblue', lwd = 1.5) +
  tm_shape(POI) + tm_symbols(col = "firebrick3", shape = 20, size = 0.5)

  

print(vystup) # zobrazit mapu

Nezaměstnanost po obcích České republiky

Obecně se má za to, že nezaměstnanost je v ČR nízká - ale ne plošně nízká. Kde jsou ohniska vysoké nezaměstnanosti?

library(tidyverse)
library(RColorBrewer)
library(RCzechia)
library(tmap)
library(sf)

src <- read.csv(url("https://raw.githubusercontent.com/jlacko/RCzechia/master/data-raw/unempl.csv"), stringsAsFactors = F) 
# otevřená data ze staťáku, odzipovaná a lehce profiltrovaná - https://www.czso.cz/csu/czso/otevrena_data

src <- src %>%
  mutate(KOD_OBEC = as.character(uzemi_kod))  
  # všechny klíče na RCzechia jsou v textovém formátu, s číslem se nepotkají

podklad <- obce_polygony() %>% 
  # obce_polygony = nejjemnější obce, ale bez městských částí (Praha v jednom kuse)
  inner_join(src, by = "KOD_OBEC") # připojit přes klíč


vystup <- tm_shape(republika()) + tm_borders(col = "grey40") +
  tm_shape(podklad) + tm_fill(col = "hodnota", title = "Nezaměstnanost", 
                              palette = rev(brewer.pal(6,"RdYlGn"))) +
  tm_legend(position = c("RIGHT", "top"),
            legend.format = list(fun = function(x) paste0(formatC(x, digits = 0, 
                                                                  format = "f"), " %")))

print(vystup)

Podobnost hotspotů nezaměstnanostmi s oblastmi nejvyšší podpory Miloše Zemana v prezidentské volbě je zajímavá otázka pro další studium.

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 <- obce[obce$NAZ_OBEC == "Praha", ]
brno <- 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

Interaktivní mapa

Interaktivní mapy jsou sexy a uživatele baví. A jenom vy můžete vědět, jak snadné je s tmap a RCzechia takovou interaktivní mapu vytvořit :)

Doplním, že interaktivní mapy 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 obrysy pomocí st_simplify(x, dTolerance = y).

Dále doplním, že zjednodušení se provádí s přihlédnutím k toleranci, která je v jednotkách daných projekcí; pro WGS84 to jsou desetinky stupňů. Pro práci v metrech je třeba projekci upravit, například na našeho oblíbeného inž. Křováka - st_transform(x, crs = 5513).

library(tidyverse)
library(RCzechia)
library(tmap)
library(sf)

src <- read.csv(url("https://raw.githubusercontent.com/jlacko/RCzechia/master/data-raw/unempl.csv"), stringsAsFactors = F) 
# otevřená data ze staťáku, odzipovaná a lehce profiltrovaná - https://www.czso.cz/csu/czso/otevrena_data

src <- src %>%
  mutate(KOD_OBEC = as.character(uzemi_kod))  
  # všechny klíče na RCzechia jsou v textovém formátu, s číslem se nepotkají

podklad <- obce_polygony() %>% # obce_polygony = nejjemnější členění
  inner_join(src, by = "KOD_OBEC") %>% # připojení přes klíč
  filter(KOD_CZNUTS3 == "CZ071") # Olomoucký kraj

kraj <- kraje() %>%
  filter(KOD_CZNUTS3 == "CZ071") # Olomoucký kraj

tmap_mode("view")

tm_shape(kraj) + tm_borders(col = "grey40", lwd = 1.5) +
  tm_shape(podklad) + tm_fill(col = "hodnota", title = "Nezaměstnanost", 
                              palette = "YlOrRd", id = "NAZ_OBEC") +
  tm_legend(legend.format = list(fun = function(x) paste0(formatC(x, digits = 0, 
                                                                  format = "f"), " %"))) +
  tm_view(basemaps = "Stamen.Toner")