Crear mapas estaticos con R

Crear mapas estaticos con R

¿qué son los mapas estáticos?

Los mapas fijos o estáticos son los de siempre, que se contraponen a los nuevos o dinámicos en los que se permite interactuar. Estos mapas fijos son solo imágenes de unarepresentación geográfica.

Estos mapas tienen cada vez menos uso, pero siguen siendo útiles para insertar en documentos y libros. Estamos tan acostumbrados a interactuar con los mapas,a hacer zoom o localizar poblaciones de forma dinámica que es hasta raro querer un simple mapa como imagen.

Existen muchísimas librerías para hacer mapas en R, este es un mundo en expansión y cada día sale algo nuevo, o se cambia lo que funcionaba bien. Es el caso de los grandes problemas que hemos tenido los usuarios de librerías como ggmap que usaban la API de Google, que -de repente- cortó el flujo de datos y dejó a sus miles de usuarios en calzoncillos.

Por eso voy a usar solo librerías que se basan en soluciones libres, existen también muchas y muy buenas como OpenStreetMap, pero me voy a centrar en un autor Dewey Dunnington que ha realizado algunas de los paquetes de mapas más interesantes que conozco.

Lo que me interesa de los mapas estáticos es aprovechar los fondos cartográficos de bases como la de OpenStreetMap o OpenLayers, y superponer sobre estas bases capas personalizadas.

Vamos a exponer algunas soluciones.

Lo más simple

Las funciones de trazado más habituales como plot(), ggplot() o autoplot() , pintan datos geográficos y puede servirnos para hacer mapas de contornos de capas y representación de puntos, pero adolecen de falta de fondos.

  library(prettymapr)
  # cargamos maptools para datos de ejemplo
  # library(maptools)
# hacemos esto para cargar sin mensajes
  suppressMessages(library(maptools, warn.conflicts = F))

  # cargamos los contornos mundiales
  data("wrld_simpl")
  # pintamos la zona de España y mediterráneo
  plot(wrld_simpl, xlim=c(-4,2), ylim=c(30, 47),col=rainbow(12))
  
  # Usando prettymapr odemos añadir mas cosa al plot

  addscalebar()
  addnortharrow(pos = "topleft")

ggspatial

La librería ggspatial es una versión de ggplot para mapas muy interesante si queremos añadir fondos a los mapas.

Lo que hace este paquete es ampliar las opciones de la función ggplot() de la librería ggplot2 y añadir geometrías y anotaciones adicionales como norte, escalas, fondos base.

Por ejemplo, pintamos unos puntos sobre Torrevieja (ciudad de Alicante , España) con un fondo:

  library(ggplot2)
  library(ggspatial)
  library(sp)
  
  torrevieja <- data.frame(lon = c(-0.69,-0.67,-0.685,-0.681),
                           lat = c(37.98,37.97,37.978,37.975))
  
  # Convertimos la tabla de puntos en capa espacial con sp
  capa_puntos<-SpatialPoints(torrevieja)
  # asignamos un sistema de coordenaas
  sp::proj4string(capa_puntos) <- CRS("+init=epsg:4326") 
  
  # pintamos el mapa con ggplot y ggspatial
  ggplot()+
        ggtitle("Plano Torrevieja con puntos de interés")+
        annotation_map_tile(type = "osm",zoom=15)+ 
        layer_spatial(capa_puntos,size = 8, col="red",alpha = 0.5)+
        annotation_scale(location = "br")+ # pinta leyenda 
        annotation_north_arrow(location = "tr", which_north = "true",
                           style = north_arrow_fancy_orienteering, 
                           height = unit(1.5, "cm"),
                           width = unit(1.5, "cm"))

Cualquier capa espacial (cualquier objeto de los paquetes sf, sp, o raster) se puede agregar a un gráfico ggplot() usando una de las siguientes funciones de ggspatial:

  • layer_spatial() la peculiaridad es que esta capa fija la escala del gráfico, lo que significa que serán visibles siempre por defecto.
  • annotation_spatial() esta capa nunca fija la escala, por lo que pueden usarse como fondo para otras capas.

Estilos de mapas de fondo

Respecto a los estilos de mapa de fondo que están disponibles son los siguientes:

  # Estilos de fondos
  rosm::osm.types()
##  [1] "osm"                    "opencycle"             
##  [3] "hotstyle"               "loviniahike"           
##  [5] "loviniacycle"           "hikebike"              
##  [7] "hillshade"              "osmgrayscale"          
##  [9] "stamenbw"               "stamenwatercolor"      
## [11] "osmtransport"           "thunderforestlandscape"
## [13] "thunderforestoutdoors"  "cartodark"             
## [15] "cartolight"

preattymap

Preattymap es una librería para pintar mapas “bonitos”, como su nombre indica. Es también una creación de nuestro amigo Dewey, junto con rosm y otras muchas librerías realmente útiles.

Además de pintar buenos mapas tiene funciones de busqueda geográfica para obtener coordenadas de direcciones y lugares a partir del nombre con la función searchbbox(), así como muchas opciones de hacer cajas de coordenadas (makebbox) a partir de puntos, direcciones, etc.. y zoom (zoombbox) y uniones (mergebbox ) de dichas cajas lo que es muy útil.

  #install.packages("prettymapr")
  library(prettymapr)
  library(rosm)
  # source="dsk" es para entrar como Data Science Toolkit que evita tener que darse de alta en las APIs
  prettymap(osm.plot(searchbbox("Murcia")))
Murcia

Murcia

También podemos añadir otras capas a un mapa de prettymapr añadiendo una expresion de mapa o algo que dé como resultado una capa dentro de llaves como primer argumento de la función. despues de este argumento se le añaden las decoraciones al mapa, esto es las flecha de norte, escala etc..

require(prettymapr)
require(rosm)
## Loading required package: rosm
  # plano con puntos a mano
  lon = c(-1.5058806338,-1.4055545377,-1.1244527259)
  lat = c(38.5723968325393,39.1989447389502,38.8332362700093)
  nom = c("Albatana","Alcalá del Jucar","Almansa")
  
  datos<-data.frame(lon,lat,nom)
  #usamos funciones de la library(sp)
  capa_pueblos<-sp::SpatialPointsDataFrame(cbind(lon,lat),datos)
 # asignamos un sistema de coordenaas
  sp::proj4string(capa_pueblos) <- sp::CRS("+init=epsg:4326") 

  prettymap({
    # Añadimos fondo
    osm.plot(capa_pueblos,type="opencycle")
    # Añadimos puntos
    osm.points(capa_pueblos$lon, capa_pueblos$lat,pch=15,col="blue", cex=3)
    # Añadimos texto de etiquetas
    osm.text(capa_pueblos$lon, capa_pueblos$lat,labels=capa_pueblos$nom,adj=c(-0.3, 0.5), cex=1.2,col="blue")
  },drawbox = TRUE,box.lwd=4,
   scale.pos = "bottomright", # posicion de las escala
   arrow.pos="topright", # posicion de la flecha
   drawarrow=T,arrow.scale=1)
## Zoom: 10
## Consider donating to the Open Street Map project at http://donate.openstreetmap.org/
## Audotdetect projection: assuming Google Mercator (epsg 3857)

   #source="dsk")

En el ejemplo anterior he usado el mapa de fondo de opencycle que requiere una API KEY para quitar las molestas sombras, pero hay muchos otros que no necesitan ninguna de los que vimos arriba El manual de uso puedes verlo aquí para los detalles de los parámetos así por ejemplo la posicion de la escala puede definirse con scale.pos que puede ser: “bottomleft”, “bottomright”, “topleft”, o “topright”.

OpenStreetMap

Otra librería de mapas fijos es OpenStreetMap. Los estilos disponibles y uso son parecidos, pero con esta podemos usar directamente plot().

Para usar OpenStreetMap debemos tener instalado rJava y naturalmente Java en nuestro Ordenador.

    #Mapa de España
    library(OpenStreetMap)
    nm <- c("osm", "maptoolkit-topo", "bing", "stamen-toner", 
            "stamen-watercolor", "esri", "esri-topo", 
            "nps", "apple-iphoto", "skobbler")
    map <- openmap(c(35,-10),
                c(44,2),
            minNumTiles=5,type=nm[5])
    plot(map)

    # otra forma con autoplot
   # ggplot2::autoplot(map)