Narzędzia użytkownika

Narzędzia witryny


r_mapy

To jest stara wersja strony!


Generowanie map w R

Instalacja pakietów

Będziemy potrzebować pakietu rgdal oraz ZPD:

install.packages(c('rgdal', 'rgeos'))
devtools::install_fgithub('zozlak/ZPD')

Pod linuksem do skompilowania pakietu potrzebne będą w systemie biblioteki libgdal-dev oraz libproj-dev.

Wczytywanie podkładów z bazy danych

Wczytywanie podkładów jest nieco złożone, wymaga bowiem:

  • wczytania z bazy danych kontekstowych i opisu obszaru w formacie GeoJSON dla każdego JST
  • ręcznego złączenia tego w jeden obiekt GeoJSON typu FeatureCollection
  • skonwertowanie na obiekt R klasy SpatialPolygonsDataFrame
  • skonwertowanie na ramkę danych, którą będzie potrafił zwizualizować ggplot

Przykład dla gmin województwa opolskiego w latach 2008 i 2013.

library(ZPD)
library(rgdal)
library(ggplot2)
 
# pobranie z bazy
src = polacz()
zapytanie = "
  SELECT 
    id_wojewodztwa * 10000 + id_powiatu * 100 + id_gminy AS teryt,
    rodzaj_gminy, rok,
    ST_AsGeoJSON(geom) AS geojson
  FROM teryt_gminy
  WHERE id_wojewodztwa = 16 AND rok IN (2008, 2013)
"
podklady = tbl(src, sql(zapytanie)) %>%
  collect()
 
# konwersja na FeatureCollection
podklady = podklady %>%
  group_by(rok) %>%
  summarize(
    geojson = paste0(collapse = ',',
      '{"type": "Feature", ',
      '"properties": { "teryt": ', podklady$teryt, ', "rodzaj_gminy": "', podklady$rodzaj_gminy, '"},',
      '"geometry": ', podklady$geojson, 
      '}'
    )
  ) %>% 
  mutate(geojson = paste0('{"type": "FeatureCollection", "features": [', geojson, ']}'))
 
# konwersja na SpatialPolygonsDataFrame wraz z dorzuceniem centroidów
mapy.backup = lapply(podklady$geojson, function(x){
  x = readOGR(x, layer = "OGRGeoJSON", stringsAsFactors = F)
  x@data = cbind(x@data, setNames(as.data.frame(coordinates(x)), c('x', 'y')))
  return(x)
})
 
# konwersja na ramkę danych rysowalną dla ggplot-a
mapy = lapply(mapy.backup, function(mapa){
  ramkaDanych = fortify(mapa)
  ramkaDanych$id = as.numeric(ramkaDanych$id)
  return(left_join(ramkaDanych, mapa@data))
})
mapy = bind_rows(mapy)
 
# weryfikacja
ggplot(mapy %>% filter(rok == 2013), aes(x = long, y = lat, fill = rodzaj_gminy, group = id)) +
  geom_polygon(colour = '#000000')
r_mapy.1424448486.txt.gz · ostatnio zmienione: 2015/02/20 17:08 przez zozlak