3 min read

Un mapa de Montevideo con leaflet

Me encantan los mapas. R tiene un montón de opciones para dibujar mapas. En un proyecto reciente para el trabajo tuve que usarlos y estuve explorando.

Geografía

La ciencia atrás de todo esto es bastante compleja. Por suerte R nos permite hacer cosas sin entender mucho los fundamentos que hay atrás de una proyección cartográfica, los sistemas de coordenadas, etc.

Leaflet

Leaflet permite para hacer mapas interactivos. Trae los datos del mapa de una API (podemos elegir varias: StreetView, etc.) y genera un html widget. Después es fácil incluir el widget en una app de Shiny o en un blog generado por Hugo.

Sf

También están los viejos y queridos shapefiles. Un mapa shapefile viene en varios archivos (con formato shx, dbf, sbx, sbn) que contienen información de polígonos.

El INE publica shapefiles con la información cartográfica que dispone para Uruguay. Tuve que trabajar bastante para instalar los paquetes (en especial RGDAL que es a nivel de sistema operativo). Pero después hacer el mapa es simple.

Cargar librerías y datos del mapa:

library(maptools)
library(leaflet)
library(dplyr)
library(rgdal)
library(shiny)
library(leaflet)

crswgs84 <- CRS("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs")
# proyeccion ine
prj <- CRS("+proj=utm +zone=21 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs")

# leer shapefile (cuidado que incluyen los shpx, dbf, etc.)
states <- readOGR("../../static/shps/ine_barrios_mvd_nbi85.shp",
                  layer = "ine_barrios_mvd_nbi85", GDAL1_integer64_policy = TRUE)

states@data$barrio <- states@data$NOMBBARR %>% as.character
# asignar proy
proj4string(states) <- prj
# transformar la proyección
st <- spTransform(states, crswgs84)

Un mapa de Montevideo con Leaflet. Las capas pueden ser las de StreetView o la del Shapefile publicado por INE.

mvd <- c(-56.164532, -34.901112)
mvd1 <- mvd  + 0.0071
mvd2 <- mvd  - 0.0071


leaflet(st) %>%
  addPolygons(layerId=~NROBARRIO, color = "#444444", weight = 1, smoothFactor = 0.5,
              opacity = 1.0, fillOpacity = 0.5,
              fillColor = ~colorQuantile("YlOrRd", AREA_KM)(AREA_KM),
              highlightOptions = highlightOptions(color = "white", weight = 2,
                                                  bringToFront = TRUE), group="INE") %>%
  addTiles(group="Google") %>%
  addLayersControl(
    overlayGroups = c("INE", "Google"),
    options = layersControlOptions(collapsed = FALSE)
  )