7 julio, 2021 | by Edwin Mendivil Barceló
En este tutorial te muestro cómo reducir el nivel de detalle de un shapefile con el uso de la librería sf, para renderizar más rápido tu mapa en rstudio.
Si ya has trabajado con shapefiles (vectores) para graficar mapas en R, sabrás que los archivos con gran nivel de detalle llegan a pesar bastante y por tanto el renderizado puede tomar mucho tiempo en RStudio. Para ser más productivos lo ideal sería trabajar con archivos livianos, por tanto en este tutorial te explico cómo reducir su tamaño.
De manera general la reducción se logra con la función st_simplify( ) de la librería “sf”.
Básicamente haremos lo siguiente:
1) Calcularemos el tamaño del shapefile original y el número de puntos y vértices.
2) Luego lo simplificamos.
3) Calculamos el tamaño del nuevo archivo simplificado y el número de puntos.
4) Comparamos las diferencias.
5) Por último graficaremos ambos mapas para ver si notamos visualmente las diferencias entre uno y otro.
Entremos de lleno ahora sí, al código:
El shapefile utilizado es el Mapa Geológico Colombiano, descargado del sitio [datos.gov.co]
library(sf) #Para leer el shapefile y reducir el tamaño del archivo
library(pryr) #Calcular el tamaño del archivo
Library(tmap) #Dibujar el mapa
map <- st_read(“/Users/tu_usuario/Documents/30DayMapChallenge/D2 Lines/mapa cronoestratigrafia”)
head(map)
El tamaño lo calculamos con la función object_size() de la librería “pryr”. Y el total de puntos con st_cast de la librería “sf”, así:
#Tamaño del archivo
object_size(map)
#Total de puntos o vértices
pts <- st_cast(map$geometry, “MULTIPOINT”)
sum(sapply(pts, length))
Veamos los resultados en la consola:
Simplificamos la complejidad de los polígonos con la función st_simplify() de la librería “sf”, así:
map_light <- st_simplify(map, preserveTopology = TRUE, dTolerance = .02)
Ten en cuenta que entre más alta la tolerancia (dTolerance), menos detalle tendrá el nuevo polígono.
#Tamaño del archivo
object_size(map_light)
#Total de puntos o vértices
pts_light <- st_cast(map_light$geometry, “MULTIPOINT”)
sum(sapply(pts_light, length))
Veamos los resultados del nuevo objeto en la consola:
Logramos reducir el tamaño del archivo u objeto de 49MB a 4.88MB. Y simplificamos el No. de puntos o vértices de 5.704.032 a 146.698
Adicional el tiempo de renderizado del archivo original en RStudio me tomó aproximadamente 5 minutos (en un MacBook Pro 2017 con 8 GB de RAM). Con el archivo reducido, unos 10 segundos.
Lo cual es una reducción significativa en ambos aspectos.
Por último grafiquemos ambos objetos, el inicial y el simplificado, para ver si a simple vista notamos una gran diferencia entre uno y otro. Hacemos uso de la librería “tmap”.
#Mapa ORIGINAL
tm_shape(map) + tm_borders() + tmap_style(“bw”)#Mapa REDUCIDO
tm_shape(map_light) + tm_borders() + tmap_style(“bw”)
Como vemos a simple vista no notamos una diferencia significativa entre ambos vectores.
Hagamos zoom a ver si lo notamos.
Podemos ver que en el original los trazos son un poco más detallados. Sin embargo, nuestro nuevo y simplificado mapa es perfecto para nuestro análisis espacial!.
Como te comenté arriba, el valor que le des al dTolerence es clave para que el vector disminuya su tamaño pero también para que quede bastante parecido al original. Así que no abuses del valor que le des.
En conclusión, a menos de que sea un trabajo de cartografía que necesites hacer con todas las de la ley, la mayoría de visualizaciones de datos no necesitan vectores tan detallados, por tanto gracias a la librería sf podemos ser más productivos al poder transformar esos shapefiles pesadísimos a archivos más livianos y renderizar en un dos por tres ?
Lo anterior lo aprendí del curso de DataCamp: Spatial Analysis in R with sf and raster
Te dejo el código completo:
library(sf) #Para leer el shapefile y reducir el tamaño del archivo
library(pryr) #Calcular el tamaño del archivo
Library(tmap) #Dibujar el mapa#—->Leer shapefile
map <- st_read(“/Users/tuusuario/Documents/30DayMapChallenge/D2 Lines/mapa cronoestratigrafia”)
head(map)
st_crs(map)#—->Calcular tamaño de archivo INICIAL y número de puntos
#Tamaño del archivo
object_size(map)
#Total de puntos o vértices
pts <- st_cast(map$geometry, “MULTIPOINT”)
sum(sapply(pts, length))#—->Simplificar shapefile
map_light <- st_simplify(map, preserveTopology = TRUE, dTolerance = .02) #En curso DataCamp la tolerancia va de 100 en adelante
head(map_light)
glimpse(map_light)#—->Calcular tamaño de archivo REDUCIDO y número de puntos
#Tamaño del archivo
object_size(map_light)
#Total de puntos o vértices
pts_light <- st_cast(map_light$geometry, “MULTIPOINT”)
sum(sapply(pts_light, length))#Se reduce tamaño del archivo de 49MB a 4.88MB
#Se reduce No. de puntos o vértices de 5.704.032 a 146.698#—->Graficar ambos mapas
#Mapa ORIGINAL
tm_shape(map) + tm_borders() + tmap_style(“bw”)
#Mapa REDUCIDO
tm_shape(map_light) + tm_borders() + tmap_style(“bw”)
Espero que te haya sido de utilidad este post, algún comentario o sugerencia escríbeme al correo vizualdatos@gmail.com o envíame un mensaje directo a mi twitter @vizualdatos
Edwin Mendivil Barceló
@vizualdatos
Hablemos!, te puedo ayudar con ese gráfico o reporte que necesitas para tu organización. El servicio de visualización de datos se presta presencialmente en la ciudad de Santa Marta, Colombia. Si estas en Barranquilla, Bogotá u otra ciudad, trabajo contigo de manera remota.