Cómo reducir el tamaño de un shapefile para graficar un mapa en R

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.

 

Reducir tamaño shapefile con 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”.

 

LOS PASOS A SEGUIR

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 ARCHIVO EN CUESTIÓN

El shapefile utilizado es el Mapa Geológico Colombiano, descargado del sitio [datos.gov.co]

 

LIBRERÍAS A UTILIZAR

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

 

LEEMOS EL SHAPEFILE

map <- st_read(“/Users/tu_usuario/Documents/30DayMapChallenge/D2 Lines/mapa cronoestratigrafia”)
head(map)

 

CALCULAMOS EL TAMAÑO Y NÚMERO TOTAL DE PUNTOS DEL SHAPEFILE ORIGINAL

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:

Miniatura 1

 

SIMPLIFICANDO EL SHAPEFILE

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.

 

CALCULAMOS EL TAMAÑO Y NÚMERO TOTAL DE PUNTOS DEL SHAPEFILE REDUCIDO

#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:

Miniatura 2

 

COMPARAMOS LAS DIFERENCIAS

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.

 

GRAFICAMOS AMBOS MAPAS PARA IDENTIFICAR DIFERENCIAS

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”)

Mapa shapefile vector reducido con R

 

Como vemos a simple vista no notamos una diferencia significativa entre ambos vectores.

Hagamos zoom a ver si lo notamos.

Mapa vector reducido con R zoom 1

 

Mapa vector reducido con R zoom 2

 

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

 

Foto autor

Edwin Mendivil Barceló

@vizualdatos

Artículos recientes

Ciudad de la Creatividad

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.

  • vizualdatos@gmail.com
  • Celular/Whatsapp: 312 664 38 35
  • Santa Marta, Colombia