Crear un mapa con R y Leaflet
Hace unos meses tuve que realizar un informe que incluía datos geográficos de muchas parcelas, se me ocurrió que en vez de realizar el clásico informe aburrido con listados y datos estáticos en papel o pdf, estaría bien cambiar y el chip y hacer algo más dinámico, interactivo y moderno.
Al final planteamos un informe en html, es decir en pagina web, pero hecho con código de R y markdown desde RSTUDIO y que incluía... aquí está lo que quería comentar hoy... un mapa interactivo con Leaflet. Creo que el resultado quedó estupendo, limpio y muy dinámico.
Ahora he pensado aplicar este script del mapa interactivo que creamos para el otro informe con un propósito más sencillo, solo para localización de unas obras y su entorno. El mapa formará parte de un informe más completo tipo web con multitud de información adicional, del estilo interactivo que me gustan.
Voy a poner los pasos de creación del mapa en entorno R para veáis que es bastante sencillo, y que los resultados son excelentes.
Crear un shp
Lo primero es seleccionar una capa con datos geográficos, esta capa puede ser del tipo que deseemos, raster, lineas, puntos polígonos. Según el tipo de capa, el comando o función de lectura cambia en Leaflet, pero son todos muy parecidos y sencillos.
Es muy importante que la capa que usemos debe estar en el sistema de georreferenciación EPSG: 4326, para que se pinte en su sitio sobre el plano del mundo que usa Leaflet. Si no es así, debemos transformarla a dicho sistema de referencia o bien en un entorno GIS como QGIS o ARCVIEW o directamente en R con la libraría sp por ejemplo.
Usaremos para nuestro caso ejemplo una capa .shp con lineas, que usa en LeafLet la función * addPolylines() para su lectura en el mapa, pero otra de poligonos usará addPolygons()etc.
Os dejo un resumen de comando de inserción de capas para diferentes tipos:
- addControl: Añade controles HTML al mapa
- addTiles: Añade un mosaico al mapa
- addWMSTiles: Añade a WMS al mapa
- addPopups: Añade pop_ ups al mapa
- addMarkers: Añade marcas de posición
- addLabelOnlyMarkers: Añade etiquetas
- addCircleMarkers: Añade marcas de círculos
- highlightOptions: opciones de resalto al pasar encima
- addCircles: Añade círculos
- addPolylines: Añade polilíneas
- addRectangles: Añade rectángulos
- addPolygons: Añade polígonos
- addGeoJSON: Añade GeoJSON
- addTopoJSON: Añade TopoJSON
Crear fichero R
Ahora vamos a crear el fichero *.Rmd de markdown con R para montar el mapa. Voy a poner a continuación exclusivamente el código de R para el mapa, pero antes de este o después se puede complementar el fichero markdown con texto, imágenes o cualquier cosa que deseemos.
library(leaflet)
library(leaflet.extras)
library(rgdal) # para leer shp
# Leemos las capas del mapa que se encuentran en el directorio de trabajo
rutamap<-paste0(getwd(),"/capas") # ruta de las capas en la carpeta capas
# leemos el fichero shp de la capa, sin poner la extension tuneltalave.shp
# verbose es para que no informe de lo que lee en el html final
parcelas<-readOGR(dsn = rutamap, layer = 'tuneltalave',verbose=FALSE)
# vemos las columnas de datos en la capa
knitr::kable(head(parcelas@data))
# Crea el mapa de leaflet
leaflet(height="80vh") %>%
# añade fondos al mapa ver posibles en names(providers)
addTiles(group = "Base") %>%
addProviderTiles(providers$Stamen.Terrain,group = "Terreno") %>%
# Añadimos un botón de fullsize de ventana de mapa
addFullscreenControl() %>%
# Añadimos ventana de medición
addMeasure(
position = "bottomleft",
primaryLengthUnit = "meters",
primaryAreaUnit = "sqmeters",
activeColor = "#3D535D",
completedColor = "#7D4479") %>%
# Añadimos la capa
addPolylines(data = parcelas,group = "Red",label = parcelas@data$Text,
labelOptions = labelOptions(noHide = T, textOnly = TRUE))
Complilar
Si ejecutamos el código anterior obtenemos un mapa web interactivo en el que sale representada la capa y sobre el que podemos navegar al gusto del consumidor.
Post votado por la comunidad @developspanish comunidad naciente que busca apoyar a los programadores de habla hispana