Crea un mapa de Chile desde datos geoespaciales oficiales en R
14/10/2025
255 visitasEn post anteriores mostré cómo hacer mapas comunales y regionales de Chile con R, y a hacer mapas de los territorios urbanos del país.
En este tutorial aprenderemos a crear mapas de Chile en R usando datos geográficos o shapes oficiales de Chile, obtenidos desde la Subsecretaría de Desarrollo Regional y Administrativo (Subdere) y la Biblioteca del Congreso Nacional de Chile (BCN).
El objetivo será aprender a visualizar mapas desde shapefiles obtenidos de internet, y a procesar datos geográficos más complejos con R, para generar mapas de Chile con polígonos y límites geográficamente correctos.
Obtener datos geográficos
El primer paso para visualizar mapas es obtener los datos geográficos. Con esto nos referimos a los polígonos (figuras geométricas que usualmente representan territorios), líneas (que pueden representar límites o redes viales) y puntos (que pueden representar ubicaciones como municipios o capitales).
Los datos geográficos suelen venir como shapes, que usualmente son carpetas que contienen archivos, principalmente shapefiles (.shp).
Los siguientes botones ofrecen descargas directas de los datos que usaremos desde sus fuentes originales, la mayoría de ellos obtenidos desde la IDE Subdere.
La división político-administrativa contiene los polígonos a nivel comunal, provincial y regional que consituyen el territorio de Chile, y provienen de la Subdere (2023):
Los límites comunales de la división político-administrativa contiene las líneas que limitan las unidades administrativas (comunas) del país, y provienen de la Subdere (2022):
Las ubicaciones de los municipios marcan con puntos la localización de estas instituciones, y provienen de la Subdere (2022):
La red vial es el conjunto de líneas que representan las carreteras y caminos de todo el país, y provienen de la Bibioteca del Congreso Nacional de Chile (BCN):
Alternativamente, puedes descargar los archivos desde R ejecutando este código:
dir.create("shapes") # crear carpeta
# descargar
download.file("https://ide.subdere.gov.cl/wp-content/uploads/74_limites_dpa_2022.zip",
"shapes/74_limites_dpa_2022.zip")
download.file("https://ide.subdere.gov.cl/descargas/SHP/Limite_DPA_03082023.rar",
"shapes/Limite_DPA_03082023.rar")
download.file("https://ide.subdere.gov.cl/descargas/SHP/Municipios_15112022.zip",
"shapes/Municipios_15112022.zip")
download.file("https://www.bcn.cl/obtienearchivo?id=repositorio/10221/10403/2/Red_Vial.zip",
"shapes/Red_Vial.zip")
Una vez que descargamos los archivos, debemos descomprimirlos para obtener las carpetas que contienen los shapes.
Cargar datos geográficos
Para trabajar con datos geográficos usamos el paquete {sf}, abreviación de simple features, que es un estándar para manejar datos geoespaciales. Si no tienes instalado el paquete, instálalo con install.packages("sf").
Para leer un archivo geoespacial usamos la función read_sf() apuntada a la carpeta que contiene los shapefiles:
library(sf)
library(janitor)
# polígonos de comunas
comunas <- read_sf("shapes/DPA_2023/COMUNAS") |> clean_names()
# límites comunales
limites <- read_sf("shapes/74_limites_dpa_2022") |> clean_names()
# ubicación de municipalidades
municipios <- read_sf("shapes/Municipios_15112022") |> clean_names()
# red vial
calles <- read_sf("shapes/Red_Vial") |> clean_names()
Algunos de estos mapas pueden ser muy detallados y/o complejos, por lo que pueden tardarse en cargar1.
Si verificamos la clase de uno de los objetos geográficos cargados, vemos que una de sus clases es sf, pero al mismo tiempo tbl y data.frame:
class(comunas)
[1] "sf" "tbl_df" "tbl" "data.frame"
Si lo imprimimos en la consola, confirmamos que los objetos cargados desde los shapefiles son tablas de datos que arriba dicen Simple feature collection; es decir, son tablas de datos que además tienen información geográfica.
comunas
Simple feature collection with 345 features and 7 fields
Geometry type: MULTIPOLYGON
Dimension: XY
Bounding box: xmin: -109.4549 ymin: -56.53777 xmax: -66.41559 ymax: -17.4984
Geodetic CRS: GCS_SIRGAS-Chile
# A tibble: 345 × 8
cut_reg cut_prov cut_com region provincia comuna superficie
<chr> <chr> <chr> <chr> <chr> <chr> <dbl>
1 11 113 11302 Aysén del General Carlo… Capitán … O'Hig… 7785.
2 05 055 05503 Valparaíso Quillota Hijue… 268.
3 08 083 08308 Biobío Biobío Quila… 1124.
4 09 092 09209 La Araucanía Malleco Renai… 265.
5 09 092 09202 La Araucanía Malleco Colli… 1306.
6 15 152 15201 Arica y Parinacota Parinaco… Putre 5890.
7 07 071 07110 Maule Talca San R… 263.
8 08 083 08311 Biobío Biobío Santa… 1251.
9 12 121 12102 Magallanes y de la Antá… Magallan… Lagun… 3568.
10 11 113 11303 Aysén del General Carlo… Capitán … Tortel 19991.
# ℹ 335 more rows
# ℹ 1 more variable: geometry <MULTIPOLYGON [°]>
Estas tablas de datos cuentan con una columna geometry, que contiene la información geográfica de los polígonos, puntos y/o líneas de cada observación. A su vez, encima de la tabla de datos vemos información especial, como el tipo de geometría, las dimensiones de la caja (bounding box), y el sistema de coordenadas de referencia (CRS), que indica el tipo de proyección usada.
Visualizar mapas
Una vez cargados los shapes, simplemente es cosa de aplicarlos por capas a un gráfico de {ggplot2}. Las capas de datos geográficos se agregan con geom_sf(), y en este caso, que tenemos varios shapes, en cada capa habría que definir el objeto correspondiente en el argumento data; es decir, cada capa se basa en datos distintos, pero que coinciden en términos de coordenadas.
Entonces, empezamos un gráfico con ggplot(), y luego vamos agregando capas de geom_sf(), recordando que el orden en que agreguemos las capas importa: las primeras (más arriba) serán los objetos en el fondo, y las siguientes capas (en sucesivas líneas) se visualizarán encima de las anteriores.
library(dplyr)
library(ggplot2)
ggplot() +
# capa de fondo: polígonos de comunas
geom_sf(data = comunas, aes(fill = region), linewidth = 0) +
# límites regionales encima de las comunas
geom_sf(data = limites, color = "peachpuff4", linewidth = 0.2, alpha = 0.8) +
# calles
geom_sf(data = calles |> filter(clase_ruta <= 3), color = "peachpuff4", linewidth = 0.1, alpha = 0.3) +
# puntos de municipios
geom_sf(data = municipios, color = "peachpuff4", size = 0.7, alpha = 0.6) + # borde oscuro
geom_sf(data = municipios, color = "cornsilk1", size = 0.1, alpha = 0.9) + # centro claro
# recortar Chile continental
coord_sf(expand = FALSE,
xlim = c(-76, -66),
ylim = c(-56.2, -17)) +
# paleta de colores
colorspace::scale_fill_discrete_qualitative(
palette = "Warm",
c1 = 40, # intensidad del color
l1 = 85) + # brillo del color
theme_minimal() +
theme(legend.position = "none")
A las capas de objetos geográficos le especificamos el sistema de coordenadas con coord_sf() para recortar el mapa al territorio continental del país, y
además le pusimos una escala de colores cálidos desde el paquete {colorspace}, que además tiene la cualidad de poder adaptar la intensidad y brillo de sus colores.
Listo! La gracia de {sf} es poder entregar herramientas para cargar cualquier tipo de datos geográficos y habilitar que {ggplot2} los pueda graficar sin problemas. A menos que ocurran problemas. Lo cual veremos
en otro post 😬
-
Al tratarse de mapas oficiales, estos datos geográficos contienen mucho nivel de detalle; usualmente mucho más del necesario para hacer mapas a nivel nacional, donde el nivel de detalle es visualmente imperceptible. Dado que una mayor calidad significa mapas más pesados y por ende procesos más lentos, podemos simplificar las geometrías con la función
ms_simplify()del paquete{rmapshaper}, como detallamos en este post. ↩︎