Když jsem před časem ― ve verzi 1.4.2 z léta 2019 ― zaváděl do balíčku {RCzechia} objekt KFME síťových polí, cílil jsem především na pokročilé uživatele statistického programovacího jazyka R. Síťová pole jsem osobně potřeboval pro relativně sofistikovaný problém ekologického modelování, a podle sebe jsem soudil ostatní.

Až s odstupem času jsem zjistil, že tento způsob využití nejen že není jediný možný, ale dokonce ani není převažující. Dobrým příkladem jsou uživatelé z oblasti faunistiky a floristiky. Velmi často se jedná o uživatele, pro které statistika a GIS nástroje představují spíše nutné zlo; jejich skutečná práce je o něčem jiném. Síťové mapy ale potřebují.

Rád bych nabídl i cílové skupině neprofesionálních programátorů kód, který z tabulky souřadnic míst nálezů ― kterou lze snadno a rychle vytvořit někde bokem, třeba v Excelu ― vykreslí v erku publikačně použitelnou síťovou mapu.

A to způsobem, který je využitelný metodou copy / paste, pouze se vcelku snadno splnitelnou podmínkou nainstalovaného erka (které je FOSS) a funkčního přístupu k internetu. Kromě nich je třeba už jen soubor (csvčko se sloupci lon a lat) s nálezy v souřadnicích GPS a níže uvedený kus kódu.

Pro ilustraci jsem zvolil z nálezové databáze AOPK záznamy o nálezech rosnatky okrouhlolisté (Drosera rotundifolia). Rosnatka je známá a populární rostlina; v našich podmínkách nezaměnitelná. V nálezové databázi je evidováno přes šest tisíc nálezů, takže je dobře zdokumentovaná. Je tedy dobrým kandidátem pro ilustraci technik mapování.


Prvním příkladem je mapa v kontextu původní metodiky KFME: “hrubá” síťová pole o velikosti 10 × 6 úhlových minut (což v našich zeměpisných šířkách představuje lichoběžníky blízké čtvercům). Jednotlivým polím pak jsou přiřazeny čtyřciferné kódy.

Pro snazší orientaci je mapa doplněna o hranice České republiky a vybrané říční toky.

library(dplyr)    # obecná manipulace s daty
library(ggplot2)  # kreslení grafů
library(RCzechia) # prostorová data ČR

# načíst csv v definované struktuře - místo "mé" rosnatky použijte soubor vlastní! :)
# + transformovat z obyčejného na prostorový data frame
data <- read.csv("https://www.jla-data.net/sample/Drosera_rotundifolia.csv") %>% 
  st_as_sf(coords = c("lon", "lat"), crs = 4326)

# hranice Česka pro kontext
hranice <- republika(resolution = "low")

# pár hlavních řek pro kontext
reky <- reky(resolution = "low") %>% 
  filter(Major)

# mapová síť - hrubý podklad pro obrázek i značky
hruby_podklad <- KFME_grid(resolution = "low")

# středobody síťových polí - na nich budou značky
stredy_site <- st_centroid(hruby_podklad)

# čtverce s nálezem jako vektor - výčet
nalezy <- data %>% 
  st_join(hruby_podklad, left = F) %>%
  pull(ctverec) %>% 
  unique()

# vlastní kreslení obrázku
ggplot() +
  geom_sf(data = hranice, color = "gray25", fill = NA, lwd = 1) +
  geom_sf(data = reky, color = "navyblue") +
  geom_sf(data = hruby_podklad, color = "gray60", fill = NA, alpha = 1/4) +
  geom_sf(data = subset(stredy_site, ctverec %in% nalezy), 
          shape = 19,  
          color = "firebrick", 
          size = 3) +
  theme_minimal() +
  # popisky os jako čísla čtverců; kvůli čitelnosti skoky po dvou čtvercích 
  # ve vyšším rozlišení může stačit po jednom - pak třeba upravit labels i breaks
  scale_y_continuous(labels = as.character(seq(from = 74, to = 49, by = -2)),
                     breaks = seq(from = 48.5 + 1/20, 
                                  to = 48.5 + 1/20 + 25/10, 
                                  by = 2 * 1/10)) +
  scale_x_continuous(labels = as.character(seq(from = 38, to = 79, by = 2)),
                     breaks = seq(from = 12 + 1/12, 
                                  to = 12 + 1/12 + 41/6, 
                                  by = 2 * 1/6)) +
  # těsnější než defaultní nastavení okrajů mapy a popisků os 
  # může vyžadovat ladění v závislosti na rozlišení výstupu...
  theme(panel.grid.major = element_line(colour = "transparent"),
        axis.text.y = element_text(margin = margin(r = -18)),
        axis.text.x = element_text(margin = margin(t = -8)),
        plot.margin = margin(r = -20))

Druhým příkladem pak je mapa v kontextu modifikované metodiky KFME: “jemná” síťová pole, vzniklá rozdělením “hrubých” polí na 4 podčtverce označené písmenem.

Protože takto jemné členění by bylo příliš detailní pro použití na republiku jako celek, tak ponechávám na mapě původní “hrubou” síť, včetně názvů čtverců. Jemnější síť slouží jen pro označení místa nálezů.

library(dplyr)    # obecná manipulace s daty
library(ggplot2)  # kreslení grafů
library(RCzechia) # prostorová data ČR

# načíst csv v definované struktuře - místo "mé" rosnatky použijte soubor vlastní! :)
# + transformovat z obyčejného na prostorový data frame
data <- read.csv("https://www.jla-data.net/sample/Drosera_rotundifolia.csv") %>% 
  st_as_sf(coords = c("lon", "lat"), crs = 4326)

# hranice Česka pro kontext
hranice <- republika(resolution = "low")

# pár hlavních řek pro kontext
reky <- reky(resolution = "low") %>% 
  filter(Major)

# mapová síť - hrubý podklad pro obrázek, jemný pro značky na místech nálezů
hruby_podklad <- KFME_grid(resolution = "low")
jemny_podklad <- KFME_grid(resolution = "high")

# středobody síťových polí - na nich budou značky
stredy_site <- st_centroid(jemny_podklad)

# čtverce s nálezem jako vektor - výčet
nalezy <- data %>% 
  st_join(jemny_podklad, left = F) %>%
  pull(ctverec) %>% 
  unique()

# vlastní kreslení obrázku
ggplot() +
  geom_sf(data = hranice, color = "gray25", fill = NA, lwd = 1) +
  geom_sf(data = reky, color = "navyblue") +
  geom_sf(data = hruby_podklad, color = "gray60", fill = NA, alpha = 1/4) +
  geom_sf(data = subset(stredy_site, ctverec %in% nalezy), 
          shape = 19,  
          color = "firebrick", 
          size = 1.25) +
  theme_minimal() +
  # popisky os jako čísla čtverců; kvůli čitelnosti skoky po dvou čtvercích 
  # ve vyšším rozlišení může stačit po jednom - pak třeba upravit labels i breaks
  scale_y_continuous(labels = as.character(seq(from = 74, to = 49, by = -2)),
                     breaks = seq(from = 48.5 + 1/20, 
                                  to = 48.5 + 1/20 + 25/10, 
                                  by = 2 * 1/10)) +
  scale_x_continuous(labels = as.character(seq(from = 38, to = 79, by = 2)),
                     breaks = seq(from = 12 + 1/12, 
                                  to = 12 + 1/12 + 41/6, 
                                  by = 2 * 1/6)) +
  # těsnější než defaultní nastavení okrajů mapy a popisků os 
  # může vyžadovat ladění v závislosti na rozlišení výstupu...
  theme(panel.grid.major = element_line(colour = "transparent"),
        axis.text.y = element_text(margin = margin(r = -18)),
        axis.text.x = element_text(margin = margin(t = -8)),
        plot.margin = margin(r = -20))

Věřím, že vám tento příklad pomůže s vlastními mapami. A pokud shledáte můj kód užitečným pro vaši publikační činnost, zvažte v metodice citaci balíčku RCzechia, ideálně přes článek z JOSS https://joss.theoj.org/papers/10.21105/joss.05082.