class: center, middle, inverse, title-slide .title[ # mapSpain ] .subtitle[ ## Mapas de España en R ] .author[ ### Diego Hernangómez ] --- class: inverse center middle # Bienvenidos a mapSpain ### [Introducción](#intro) ### [Diccionarios](#diccionario) ### [Límites políticos](#politico) ### [Imágenes](#images) ### [Otros recursos](#other) --- name: intro ## Motivación <img src="https://ropenspain.github.io/mapSpain/logo.png" alt="mapSpain-logo" align="right" width="170" style="margin-top: 25vh;margin-right: 2rem;"> **mapSpain** facilita la creación de mapas de los diferentes niveles administrativos de España. Además, proporciona también la posibilidad de usar imágenes de servicios WMS/WMTS de manera estática (como imagen georeferenciada) o dinámica (en mapas leaflet). Adicionalmente, **mapSpain** dispone de funciones que permiten normalizar nombres de las CCAA y provincias, lo que facilita el proceso de manipulación y transformación de datos (no necesariamente espaciales). Las **fuentes de información** empleadas en **mapSpain** son: - [GISCO](https://ec.europa.eu/eurostat/web/gisco) (Eurostat) via el paquete [**giscoR**](https://ropengov.github.io/giscoR/). - [Instituto Geografico Nacional](https://www.ign.es/) (IGN) - Distintos organismos públicos de España que proporcionan servicios de teselas WMTS/WMS (<https://www.idee.es/web/idee/segun-tipo-de-servicio>). Los objetos resultantes se proporcionan en formato `sf` o `SpatRaster`(`terra`). Página web: <https://ropenspain.github.io/mapSpain/> --- ## Instalación ### CRAN ```r install.packages("mapSpain", dependencies = TRUE) ``` ### Dev version Usando el [r-universe](https://ropenspain.r-universe.dev/ui#builds): ```r # Enable this universe options(repos = c( ropenspain = "https://ropenspain.r-universe.dev", CRAN = "https://cloud.r-project.org" )) install.packages("mapSpain", dependencies = TRUE) ``` ### Remotes ```r remotes::install_github("rOpenSpain/mapSpain", dependencies = TRUE) ``` --- layout: true ## Un ejemplo rápido --- .pull-left[ ```r library(mapSpain) library(tidyverse) galicia <- esp_get_munic_siane(region = "Galicia") %>% # Homogeinizo labels mutate( Provincia = esp_dict_translate(ine.prov.name, "es") ) ggplot(galicia) + geom_sf(aes(fill = Provincia), color = "grey70" ) + labs(title = "Provincias de Galicia") + scale_fill_discrete( type = hcl.colors(4, "Blues") ) + theme_bw() ``` ] .pull-right[ <img src="index_files/figure-html/unnamed-chunk-1-1.png" width="90%" /> ] --- Si exploramos el dataset: ```r library(reactable) reactable(galicia, searchable = TRUE, striped = TRUE, filterable = TRUE, height = 350 ) ```
--- layout: true ## Comparando mapSpain con otras alternativas --- Comparamos ahora **mapSpain** con otros dos paquetes que proporcionan objetos `sf` de distintos paises: ```r # rnaturalearth library(rnaturalearth) esp_rnat <- ne_countries("large", country = "Spain", returnclass = "sf") # gadm library(GADMTools) esp_gdam <- gadm_sf_loadCountries("ESP") # MapSpain esp_mapSpain <- esp_get_country(epsg = 4326) # Prepara el plot esp_all <- bind_rows( esp_rnat, esp_gdam$sf, esp_mapSpain ) esp_all$source <- c("rnaturalearth", "gdam", "mapSpain") ``` --- .left-column[ ## rnaturalearth No capta bien el contorno. ## GADM Proporciona datos muy detallados. ## mapSpain Resultados satisfactorios. ] .pull-right[ <img src="index_files/figure-html/unnamed-chunk-2-1.png" width="100%" /> ] --- layout: false ## Almacenamiento **mapSpain** es un paquete API que usa recursos web. El comportamiento por defecto consiste en descargar archivos al directorio temporal `tempdir()` para su uso posterior durante la sesión. La función `esp_set_cache_dir()` permite modificar este comportamiento, estableciendo un directorio de descarga específico para el usuario. Para hacer esta configuración persistente se puede emplear el parámetro `install = TRUE` ```r esp_set_cache_dir("~/R/mapslib/mapSpain", install = TRUE, verbose = TRUE) #> mapSpain cache dir is: C:/Users/xxxxx/Documents/R/mapslib/mapSpain munic <- esp_get_munic_siane(verbose = TRUE) #> Cache dir is C:/Users/xxxxx/Documents/R/mapslib/mapSpain #> Downloading file from https://github.com/rOpenSpain/mapSpain/raw/sianedata/dist/se89_3_admin_muni_a_x.gpkg #> See https://github.com/rOpenSpain/mapSpain/tree/sianedata/ for more info #> trying URL 'https://github.com/rOpenSpain/mapSpain/raw/sianedata/dist/se89_3_admin_muni_a_x.gpkg' #> Content type 'application/octet-stream' length 5570560 bytes (5.3 MB) #> downloaded 5.3 MB #> Download succesful #> Reading from local file #> C:/Users/xxxxx/Documents/R/mapslib/mapSpain/se89_3_admin_muni_a_x.gpkg #> 5.3 Mb ``` --- layout: false class: inverse center middle # Diccionario --- layout: true ## Funciones para trabajar con strings --- name: diccionario **mapSpain** proporciona dos funciones relacionadas para trabajar con textos y códigos: - `esp_dict_region_code()` convierte textos en códigos de CCAA y provincias. Esquemas de codificación soportados: - ISO2 - NUTS - INE (codauto y cpro) - `esp_dict_translate()` traduce textos a diferentes idiomas: - Castellano - Inglés - Catalán - Gallego - Vasco Estas funciones pueden ser de utilidad en ámbitos más amplios que necesiten homogeneizar códigos de CCAA y Provincias (Datos COVID ISCII, etc). --- ### `esp_dict_region_code()` ```r vals <- c("Errioxa", "Coruna", "Gerona", "Madrid") esp_dict_region_code(vals, destination = "nuts") ``` ``` #> [1] "ES23" "ES111" "ES512" "ES30" ``` ```r esp_dict_region_code(vals, destination = "cpro") ``` ``` #> [1] "26" "15" "17" "28" ``` ```r esp_dict_region_code(vals, destination = "iso2") ``` ``` #> [1] "ES-RI" "ES-C" "ES-GI" "ES-MD" ``` --- ### `esp_dict_region_code()` ```r iso2vals <- c("ES-GA", "ES-CT", "ES-PV") esp_dict_region_code(iso2vals, origin = "iso2", destination = "nuts") ``` ``` #> [1] "ES11" "ES51" "ES21" ``` ```r # Soporta diferentes niveles valsmix <- c("Centro", "Andalucia", "Seville", "Menorca") esp_dict_region_code(valsmix, destination = "nuts") ``` ``` #> [1] "ES4" "ES61" "ES618" "ES533" ``` ```r esp_dict_region_code(c("Murcia", "Las Palmas", "Aragón"),destination = "iso2") ``` ``` #> [1] "ES-MC" "ES-GC" "ES-AR" ``` --- ### `esp_dict_translate()` ```r vals <- c("La Rioja", "Sevilla", "Madrid","Jaen", "Orense", "Baleares") esp_dict_translate(vals, lang = "en") ``` ``` #> [1] "La Rioja" "Seville" "Madrid" "Jaén" #> [5] "Ourense" "Balearic Islands" ``` ```r esp_dict_translate(vals, lang = "es") ``` ``` #> [1] "La Rioja" "Sevilla" "Madrid" "Jaén" "Orense" "Baleares" ``` ```r esp_dict_translate(vals, lang = "ca") ``` ``` #> [1] "La Rioja" "Sevilla" "Madrid" "Jaén" #> [5] "Ourense" "Illes Balears" ``` --- ### `esp_dict_translate()` ```r vals <- c("La Rioja", "Sevilla", "Madrid","Jaen", "Orense", "Baleares") esp_dict_translate(vals, lang = "eu") ``` ``` #> [1] "Errioxa" "Sevilla" "Madril" "Jaén" #> [5] "Ourense" "Balear Uharteak" ``` ```r esp_dict_translate(vals, lang = "ga") ``` ``` #> [1] "A Rioxa" "Sevilla" "Madrid" "Xaén" #> [5] "Ourense" "Illas Baleares" ``` --- layout: false class: inverse center middle # Límites políticos --- layout: true ## Límites políticos --- name: politico **mapSpain** contiene un set de funciones que permiten obtener límites políticos a diferentes niveles: - Todo el país - [NUTS](https://ec.europa.eu/eurostat/web/nuts/background) (Eurostat): Clasificación estadística de Eurostat. Niveles 0 (país), 1, 2 (CCAA) y 3. - CCAA - Provincias - Municipios Para CCAA, Provinicas y Municipios hay dos versiones: `esp_get_xxxx()` (fuente: GISCO) y `esp_get_xxxx_siane()` (fuente: IGN). La información se proporciona en diferentes proyecciones y niveles de resolución. .pull-left[ ```r esp <- esp_get_country(moveCAN = FALSE) ggplot(esp) + geom_sf(fill = "#f9cd94") + theme_light() ``` ] .pull-right[ <img src="index_files/figure-html/unnamed-chunk-7-1.png" width="90%" /> ] --- ### El caso Canarias Por defecto, **mapSpain** "desplaza" Canarias para una mejor visualización en la mayoría de sus funciones. Este comportamiento se puede desactivar usando `moveCAN = FALSE`(ver anterior ejemplo). Proporcionamos funciones adicionales que permiten representar lineas alrededor de la inserción del mapa ([ejemplos](https://ropenspain.github.io/mapSpain/reference/esp_get_can_box.html#examples)). .pull-left[ ```r esp_can <- esp_get_country() can_prov <- esp_get_can_provinces() can_box <- esp_get_can_box() ggplot(esp_can) + geom_sf() + geom_sf(data = can_prov) + geom_sf(data = can_box) + theme_linedraw() ``` ] .pull-right[ <img src="index_files/figure-html/unnamed-chunk-8-1.png" width="70%" /> ] **Cuando se trabaja con imágenes, mapas interactivos o se desean realizar analisis espaciales, se debe usar `moveCAN = FALSE`** --- ### NUTS .pull-left[ ```r nuts1 <- esp_get_nuts(resolution = 20, epsg = 3035, nuts_level = 1) ggplot(nuts1) + geom_sf() + theme_linedraw() + labs(title = "NUTS1: Baja Resolución") ``` <img src="index_files/figure-html/nuts-1.png" width="100%" /> ] .pull-right[ ```r # Baleares NUTS3 nuts3_baleares <- c("ES531", "ES532", "ES533") paste(esp_dict_region_code(nuts3_baleares, "nuts"), collapse = ", ") ``` ``` #> [1] "Eivissa y Formentera, Mallorca, Menorca" ``` ```r nuts3_sf <- esp_get_nuts(region = nuts3_baleares) ggplot(nuts3_sf) + geom_sf(aes(fill = NAME_LATN)) + labs(fill = "Baleares: NUTS3") + scale_fill_viridis_d() + theme_minimal() ``` <img src="index_files/figure-html/unnamed-chunk-9-1.png" width="100%" /> ] --- ## CCAA .pull-left[ ```r ccaa <- esp_get_ccaa(ccaa = c( "Catalunya", "Comunidad Valenciana", "Aragón", "Baleares" )) ccaa <- ccaa %>% mutate( ccaa_cat = esp_dict_translate(ccaa$ine.ccaa.name, "ca") ) ggplot(ccaa) + geom_sf(aes(fill = ccaa_cat)) + labs(fill = "Comunitats autònomes") + theme_minimal() + scale_fill_discrete(type = hcl.colors(4, "Plasma")) ``` ] .pull-right[ <img src="index_files/figure-html/unnamed-chunk-10-1.png" width="100%" /> ] --- ## Provincias (usando versión `*_siane`) Si pasamos una entidad de orden superior (e.g. Andalucia) obtenemos todas las provincias de esa entidad. .pull-left[ ```r provs <- esp_get_prov_siane(c( "Andalucía", "Ciudad Real", "Murcia", "Ceuta", "Melilla" )) ggplot(provs) + geom_sf(aes(fill = prov.shortname.es), alpha = 0.9 ) + scale_fill_discrete(type = hcl.colors(12, "Cividis")) + theme_minimal() + labs(fill = "Provincias") ``` ] .pull-right[ <img src="index_files/figure-html/unnamed-chunk-11-1.png" width="100%" /> ] --- ## Municipios .pull-left[ <img src="index_files/figure-html/unnamed-chunk-12-1.png" width="100%" /> ] .pull-right[ ```r munic <- esp_get_munic(region = "Segovia") %>% # Datos de ejemplo: Población INE left_join(mapSpain::pobmun19, by = c("cpro", "cmun")) ggplot(munic) + geom_sf(aes(fill = pob19), alpha = 0.9, color = NA) + scale_fill_gradientn( colors = hcl.colors(100, "Inferno"), n.breaks = 10, labels = scales::label_comma(), guide = guide_legend() ) + labs( fill = "Habitantes", title = "Población en Segovia", subtitle = "Datos INE (2019)" ) + theme_void() + theme( plot.background = element_rect("grey80"), text = element_text(face = "bold"), plot.title = element_text(hjust = .5), plot.subtitle = element_text(hjust = .5) ) ``` ] --- ## Hexbin maps Disponibles como cuadrados y hexágonos, para provincias y CCAA. .pull-left[ ```r cuad <- esp_get_hex_ccaa() hex <- esp_get_grid_prov() ggplot(cuad) + geom_sf() + geom_sf_text(aes(label = iso2.ccaa.code)) + theme_void() ggplot(hex) + geom_sf() + geom_sf_text(aes(label = iso2.prov.code)) + theme_void() ``` ] .pull-right[ <img src="index_files/figure-html/unnamed-chunk-13-1.png" width="50%" /><img src="index_files/figure-html/unnamed-chunk-13-2.png" width="50%" /> ] --- layout: false class: inverse center middle # Imágenes --- layout: true ## Imágenes --- name: images **mapSpain** permite usar también imágenes de mapas (satélite, mapas base, carreteras, etc.) proporcionados por diferentes organísmos públicos (<https://www.idee.es/web/idee/segun-tipo-de-servicio>). Las imágenes se pueden emplear para la creación de mapas estáticos (imágenes obtenidas como capas ráster de 3 o 4 bandas) o como fondo de mapas dinámicos, a través del paquete `leaflet`. Los proveedores se han extraido del plugin para leaflet [leaflet-providerESP](https://dieghernan.github.io/leaflet-providersESP/visor/). <img src="leaflet_screenshot.png" width="100%" /> --- ### Creación de mapas estáticos Tenemos varias opciones que podemos emplear para componer mapas base: ```r madrid_munis <- esp_get_munic_siane(region = "Madrid") base_pnoa <- esp_getTiles(madrid_munis, "PNOA", bbox_expand = 0.1, zoommin = 1) library(tidyterra) ggplot() + geom_spatraster_rgb(data = base_pnoa) + geom_sf( data = madrid_munis, color = "blue", fill = "blue", alpha = 0.25, lwd = 0.5 ) + theme_minimal() + labs(title = "Municipios en Madrid") # Usando la opción mask madrid <- esp_get_munic_siane(munic = "^Madrid$") madrid_mask <- esp_getTiles(madrid, mask = TRUE, crop = TRUE, zoommin = 2) ggplot() + geom_spatraster_rgb(data = madrid_mask) + theme_void() + labs(title = "Mapa Base de la Comunidad de Madrid", caption = "CC BY 4.0 www.iderioja.org" ) ``` --- ### Creación de mapas estáticos <img src="index_files/figure-html/unnamed-chunk-15-1.png" width="50%" /><img src="index_files/figure-html/unnamed-chunk-15-2.png" width="50%" /> --- ### Mapas dinámicos usando mapSpain Estas capas se pueden usar también como fondo en mapas estáticos ```r stations <- esp_get_railway(spatialtype = "point", epsg = 4326) library(leaflet) leaflet(stations) %>% addProviderEspTiles("IGNBase.Gris", group = "Base") %>% addProviderEspTiles("MTN", group = "MTN") %>% addProviderEspTiles("RedTransporte.Ferroviario", group = "Lineas Ferroviarias") %>% addMarkers(group = "Estaciones", popup = sprintf( "<strong>%s</strong>", stations$rotulo) %>% lapply(htmltools::HTML) ) %>% addLayersControl( baseGroups = c("Base", "MTN"), overlayGroups = c("Lineas Ferroviarias", "Estaciones"), options = layersControlOptions(collapsed = FALSE) ) ``` --- ### Mapas dinámicos usando mapSpain
--- layout: false class: inverse center middle # Otros recursos --- layout: true ## Otros recursos --- name: other mapSpain incluye otras [funciones adicionales](https://ropenspain.github.io/mapSpain/reference/index.html#section-natural) que permiten extraer información sobre altitud, rios y cuencas hidrográficas de España. <img src="https://ropenspain.github.io/mapSpain/reference/esp_get_hypsobath-2.png" style="display:block;margin-left:auto;margin-right: auto;width: 50%;"> <p> <img src="https://ropenspain.github.io/mapSpain/reference/esp_get_hydrobasin-1.png" width=450 style="position:relative;transform:rotate(-20deg);top:-15rem;"> <img src="https://ropenspain.github.io/mapSpain/reference/esp_get_rivers-1.png" width=400 style="position:relative;transform: rotate(20deg);top: -15rem;left: 11rem;"> </p> --- Con mapSpain podemos obtener líneas y puntos de [infraestructuras](https://ropenspain.github.io/mapSpain/reference/index.html#section-infrastructures) de España, como carreteras y líneas ferroviarias. <p style="display: flex"> <img src="https://ropenspain.github.io/mapSpain/reference/esp_get_railway-1.png" style="width: 50%;"> <img src="https://ropenspain.github.io/mapSpain/reference/esp_get_roads-1.png" style="width: 50%;"> </p> --- **MUY RECOMENDABLE:** visitar la página de la documentación <https://ropenspain.github.io/mapSpain/>. Presenta gran cantidad de ejemplos con códigos reproducibles: <img src="docs-screenshot.png" width="100%" /> --- layout: false class: center, middle, end-slide # Gracias Presentación creada con [**xaringan**](https://github.com/yihui/xaringan) GitHub repo: https://github.com/rOpenSpain/mapSpain Docs: https://ropenspain.github.io/mapSpain/