Introducción

Este cuaderno presenta el uso de la librería sf en R para el manejo y análisis de datos espaciales bajo el estándar de Simple Features.

A lo largo del documento se desarrolla un flujo de trabajo paso a paso que incluye la carga de datos, exploración, transformación de sistemas de referencia y operaciones espaciales básicas.

El objetivo es comprender de forma sencilla cómo se representan y manipulan objetos espaciales en R, aplicando funciones fundamentales del paquete sf.

1. Configuración del entorno

Este cuaderno debe ubicarse en el directorio del proyecto de trabajo, preferiblemente en la misma carpeta donde se encuentran los datos espaciales.

En esta sección se cargan las librerías necesarias para el análisis de datos espaciales en R.

1.1 Librerías utilizadas

La librería sf (Simple Features) permite el manejo de datos espaciales vectoriales bajo un estándar moderno.

Se integra con bibliotecas como GDAL, GEOS y PROJ para la lectura, análisis geométrico y transformación de sistemas de coordenadas.

La librería dplyr facilita la manipulación de datos mediante funciones como:

  • mutate(): crea nuevas variables
  • select(): selecciona columnas
  • filter(): filtra registros
  • summarise(): resume información
  • arrange(): ordena datos

La librería ggplot2 permite la creación de gráficos bajo el principio de la “Gramática de los gráficos”, donde los datos se representan mediante capas.

La librería ggspatial amplía ggplot2 incorporando herramientas específicas para la visualización de datos espaciales en mapas.

1.2 Instalación y carga de librerías

Si las librerías no están instaladas, se pueden instalar con la función install.packages() desde la consola de R.

# install.packages("sf")
# install.packages("dplyr")
# install.packages("ggplot2")
# install.packages("ggspatial")

La función library() permite cargar los paquetes instalados al entorno de trabajo, activando todas sus funciones para su uso durante el análisis.

library(sf)
library(dplyr)
library(ggplot2)
library(ggspatial)

2. Lectura de datos espaciales

2.1 Lectura de datos con st_read()

La función st_read() del paquete sf permite leer datos espaciales vectoriales en diferentes formatos soportados por GDAL, como Shapefile, GeoJSON y GeoPackage.

Esta función convierte automáticamente los datos en un objeto de tipo sf, el cual contiene tanto la geometría como los atributos asociados.

list.files("D:/Geomatica Basica (Gr 2)/GB2/Proyecto2/datos")
##  [1] "Choco"                        "Chocó.gpkg"                  
##  [3] "choco_buffer.gpkg"            "choco_ciudades.gpkg"         
##  [5] "choco_curvas_nivel.cpg"       "choco_curvas_nivel.dbf"      
##  [7] "choco_curvas_nivel.prj"       "choco_curvas_nivel.shp"      
##  [9] "choco_curvas_nivel.shx"       "choco_elevacion.tif"         
## [11] "choco_elevacion.tif.aux.xml"  "choco_municipios.gpkg"       
## [13] "choco_municipios_MAGMA.gpkg"  "choco_municipios_UTM18N.gpkg"
## [15] "choco_rangos_elevacion.cpg"   "choco_rangos_elevacion.dbf"  
## [17] "choco_rangos_elevacion.prj"   "choco_rangos_elevacion.shp"  
## [19] "choco_rangos_elevacion.shx"   "choco_relieve.tif"           
## [21] "choco_relieve.tif.aux.xml"    "choco_relieve.txt"           
## [23] "choco_rios.gpkg"              "choco_vias.gpkg"             
## [25] "Ciudades de Colombia.gpkg"    "Ciudades de Santander.gpkg"  
## [27] "Ciudades del mundo"           "COL_adm"                     
## [29] "COL_adm2.cpg"                 "COL_adm2.csv"                
## [31] "COL_adm2.dbf"                 "COL_adm2.prj"                
## [33] "COL_adm2.shp"                 "COL_adm2.shx"                
## [35] "COL_alt_tif"                  "COL_msk_alt_tif"             
## [37] "COL_msk_cov_tif"              "COL_rds"                     
## [39] "COL_wat"                      "Colombia"                    
## [41] "Santander"                    "Tierra"

La función list.files() permite visualizar los archivos contenidos en una carpeta, facilitando la identificación de los componentes de un shapefile.

colombia <- st_read("D:/Geomatica Basica (Gr 2)/GB2/Proyecto2/datos/COL_adm2.shp")
## Reading layer `COL_adm2' from data source 
##   `D:\Geomatica Basica (Gr 2)\GB2\Proyecto2\datos\COL_adm2.shp' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 1065 features and 11 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -81.84153 ymin: -4.228429 xmax: -66.87033 ymax: 15.91247
## Geodetic CRS:  WGS 84

Al leer el archivo espacial con st_read(), R muestra automáticamente un resumen del dataset importado. En este caso, el archivo fue cargado usando el driver ESRI Shapefile, uno de los formatos más comunes para datos espaciales vectoriales.

El conjunto de datos contiene 1065 entidades espaciales (features) y 11 variables o atributos asociados a cada unidad geográfica.

La geometría es de tipo MULTIPOLYGON, lo que indica que cada entidad puede estar formada por uno o varios polígonos, como ocurre en divisiones administrativas. Además, el bounding box muestra la extensión espacial del dataset, confirmando que cubre todo el territorio de Colombia.

Finalmente, el sistema de referencia de coordenadas (CRS) es WGS 84, un sistema global basado en coordenadas de latitud y longitud.

head(colombia)
## Simple feature collection with 6 features and 11 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -74.38985 ymin: -4.228429 xmax: -69.36835 ymax: 0.1312
## Geodetic CRS:  WGS 84
##   ID_0 ISO   NAME_0 ID_1   NAME_1 ID_2        NAME_2                     TYPE_2
## 1   53 COL Colombia    1 Amazonas    1    El Encanto Corregimiento Departamento
## 2   53 COL Colombia    1 Amazonas    2   La Chorrera Corregimiento Departamento
## 3   53 COL Colombia    1 Amazonas    3    La Pedrera Corregimiento Departamento
## 4   53 COL Colombia    1 Amazonas    4       Leticia                  Municipio
## 5   53 COL Colombia    1 Amazonas    5 Mirití-Paraná Corregimiento Departamento
## 6   53 COL Colombia    1 Amazonas    6 Puerto Nariño                  Municipio
##                    ENGTYPE_2 NL_NAME_2     VARNAME_2
## 1 Corregimiento Departamento      <NA>          <NA>
## 2 Corregimiento Departamento      <NA>          <NA>
## 3 Corregimiento Departamento      <NA>          <NA>
## 4               Municipality      <NA>          <NA>
## 5 Corregimiento Departamento      <NA> Miriti Parana
## 6               Municipality      <NA>          <NA>
##                         geometry
## 1 MULTIPOLYGON (((-73.23018 -...
## 2 MULTIPOLYGON (((-71.9802 -1...
## 3 MULTIPOLYGON (((-72.61586 -...
## 4 MULTIPOLYGON (((-70.0579 -4...
## 5 MULTIPOLYGON (((-70.2188 -0...
## 6 MULTIPOLYGON (((-70.28952 -...

La función head() permite visualizar las primeras filas del objeto espacial, incluyendo atributos y geometría.

2.2 Escritura de datos espaciales con st_write()

La función st_write() del paquete sf permite exportar objetos espaciales a diferentes formatos, como GeoPackage (.gpkg), Shapefile o GeoJSON.

Al guardar un archivo, se puede especificar el formato mediante la extensión o utilizando el driver correspondiente de GDAL. Esto facilita la interoperabilidad entre distintos programas de análisis espacial.

El argumento append = FALSE se utiliza para sobrescribir un archivo existente con el mismo nombre en el directorio de trabajo, evitando conflictos con versiones anteriores.

En el siguiente ejemplo, se exporta el objeto espacial colombia en formato GeoPackage:

st_write(colombia, "municipios.gpkg", driver = "GPKG", append = FALSE)
## Deleting layer `municipios' using driver `GPKG'
## Writing layer `municipios' to data source `municipios.gpkg' using driver `GPKG'
## Writing 1065 features with 11 fields and geometry type Multi Polygon.

Después de la escritura, se puede verificar la creación del archivo en el directorio de trabajo:

list.files(pattern = "gpkg")
## [1] "choco_munic.gpkg" "municipios.gpkg"

Finalmente, el archivo puede ser leído nuevamente para comprobar que la exportación fue exitosa:

colombia2 <- st_read("municipios.gpkg")
## Reading layer `municipios' from data source 
##   `D:\Geomatica Basica (Gr 2)\GB2\Proyecto2\municipios.gpkg' 
##   using driver `GPKG'
## Simple feature collection with 1065 features and 11 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -81.84153 ymin: -4.228429 xmax: -66.87033 ymax: 15.91247
## Geodetic CRS:  WGS 84

El objeto colombia2 conserva la misma estructura del dataset original, incluyendo 1065 entidades espaciales, 11 variables y geometría de tipo MULTIPOLYGON.

El sistema de referencia de coordenadas se mantiene en WGS 84, un sistema global basado en coordenadas geográficas de latitud y longitud.

2.3 Tipos de datos espaciales soportados por st_read() y st_write()

Las funciones st_read() y st_write() del paquete sf permiten trabajar con diferentes tipos de datos espaciales vectoriales, gracias a su integración con la librería GDAL.

Estos formatos facilitan la lectura y escritura de información geográfica en distintos sistemas y plataformas de análisis espacial.

Entre los formatos más utilizados se encuentran:

  • Shapefile (.shp): formato clásico de datos vectoriales compuesto por varios archivos asociados.
  • GeoPackage (.gpkg): formato moderno y eficiente que permite almacenar múltiples capas en un solo archivo.
  • GeoJSON (.geojson): formato basado en texto, ampliamente utilizado en aplicaciones web.
  • KML/KMZ: formatos usados principalmente en plataformas como Google Earth.
  • CSV con WKT: archivos tabulares que incluyen geometrías en formato de texto (Well-Known Text).

En este trabajo se utiliza principalmente el formato GeoPackage (.gpkg) por su eficiencia y capacidad de almacenar múltiples capas en un solo archivo.

3. Selección de entidades espaciales

La selección de entidades por atributos permite filtrar datos espaciales en función de condiciones específicas, de forma similar a una consulta SQL en sistemas GIS.

En R, esta operación se realiza de manera sencilla utilizando la función filter() del paquete dplyr, aplicada a objetos espaciales sf.

choco <- dplyr::filter(colombia, NAME_1 == "Chocó")

En este caso, se seleccionan únicamente los municipios cuyo departamento corresponde a Chocó, generando un nuevo objeto espacial llamado choco.

nrow(choco)
## [1] 21

La función nrow() permite verificar el número de entidades seleccionadas. Este valor debe coincidir con el número de municipios del departamento de Chocó según la base de datos utilizada.

plot(st_geometry(choco), col = sf.colors(12, categorical = TRUE), border = "grey", axes = TRUE)

plot(st_centroid(st_geometry(choco)), pch = 3, col = "red", add = TRUE)

Para la visualización básica de los municipios del departamento de Chocó se utilizó la función plot() del sistema base de R.

En primer lugar, se graficaron los límites municipales mediante st_geometry(), lo que permite observar la forma y distribución espacial de cada municipio dentro del departamento. Posteriormente, se añadieron los centroides de cada polígono utilizando st_centroid(), representados como puntos sobre el mapa, lo cual facilita la identificación de la ubicación aproximada del centro de cada municipio.

st_write(choco, "choco_munic.gpkg", driver = "GPKG", append = FALSE)
## Deleting layer `choco_munic' using driver `GPKG'
## Writing layer `choco_munic' to data source `choco_munic.gpkg' using driver `GPKG'
## Writing 21 features with 11 fields and geometry type Multi Polygon.

El objeto choco se exporta como un archivo GeoPackage, permitiendo su reutilización en otros análisis o software GIS.

4. Selección por localización

4.1 Concepto de selección espacial

La selección por localización permite seleccionar entidades espaciales en función de su relación geométrica con otro conjunto de datos.

Este tipo de operación es equivalente a la herramienta Select by Location en software GIS como ArcGIS o QGIS.

Entre las relaciones espaciales más utilizadas se encuentran:

  • intersects: selecciona entidades que se intersectan con otra.
  • within: selecciona entidades que están dentro de otra.
  • contains: selecciona entidades que contienen a otra.
  • touches: selecciona entidades que comparten frontera.
  • crosses: selecciona entidades que se cruzan geométricamente.
  • distance-based selection: selecciona entidades dentro de una distancia específica.

4.2 Lectura de datos de ciudades

Para ilustrar este proceso, se utiliza una base de datos de ciudades del mundo, la cual contiene información geográfica en formato de coordenadas (longitud y latitud).

ciudades <- st_read("D:/Geomatica Basica (Gr 2)/GB2/Proyecto2/datos/Ciudades de Colombia.gpkg")
## Reading layer `ciudades_de_colombia' from data source 
##   `D:\Geomatica Basica (Gr 2)\GB2\Proyecto2\datos\Ciudades de Colombia.gpkg' 
##   using driver `GPKG'
## Simple feature collection with 722 features and 11 fields
## Geometry type: POINT
## Dimension:     XY
## Bounding box:  xmin: -81.7006 ymin: -4.2167 xmax: -67.4836 ymax: 12.5847
## Geodetic CRS:  WGS 84

El objeto ciudades se convierte en un objeto espacial sf utilizando st_as_sf(), indicando que las columnas de longitud y latitud representan la geometría.

El CRS asignado es 4326 (WGS 84), un sistema global basado en coordenadas geográficas.

4.3 Verificación de sistemas de referencia

st_crs(ciudades)$epsg
## [1] 4326
st_crs(choco)$epsg
## [1] 4326

La función st_crs() permite identificar el sistema de referencia de coordenadas (CRS) de cada objeto espacial.

En este caso, tanto el objeto ciudades como el objeto choco presentan el mismo sistema de referencia EPSG: 4326 (WGS 84), lo que indica que ambos datasets son compatibles para realizar operaciones espaciales sin necesidad de transformación previa.

4.4 Selección espacial (dentro de Chocó)

ciudades_choco <- ciudades[choco, , op = st_within]

Se realiza la selección espacial de las ciudades que se encuentran dentro del departamento de Chocó utilizando la relación topológica within.

plot(st_geometry(choco),
     col = sf.colors(nrow(choco), categorical = TRUE),
     border = "grey",
     axes = TRUE)

plot(st_geometry(ciudades_choco),
     col = "red",
     pch = 20,
     add = TRUE)

Se genera una visualización básica donde se observan los límites del departamento de Chocó y las ciudades que se encuentran dentro de su territorio.

5. Visualización de datos espaciales

5.1 Visualización con ggplot2

ggplot() +
  # Municipios de Chocó
  geom_sf(data = choco) +
  
  # Ciudades dentro de Chocó
  geom_sf(data = ciudades_choco,
          aes(color = city),
          size = 3) +
  
  # Títulos del mapa
  labs(x = "Longitud",
       y = "Latitud",
       title = "Ciudades de Chocó") +
  
  # Tema
  theme_bw()

El paquete ggplot2 permite generar mapas de forma más estética y estructurada a partir de objetos espaciales sf.

La función geom_sf() se utiliza para representar capas espaciales, como polígonos y puntos.

Es importante tener en cuenta el orden de las capas: primero se dibujan los municipios del departamento de Chocó y luego se agregan las ciudades, con el fin de asegurar que los puntos sean visibles sobre el mapa.

5.2 Visualización con ggplot2 y ggspatial

ggplot() +
  # Municipios de Chocó
  geom_sf(data = choco) +
  
  # Ciudades dentro de Chocó
  geom_sf(data = ciudades_choco,
          aes(color = city),
          size = 3) +
  
  # Barra de escala
  annotation_scale(location = "tr",
                   height = unit(0.25, "cm"),
                   width = unit(1, "cm"),
                   pad_x = unit(0.3, "in"),
                   pad_y = unit(0.5, "in")) +
  
  # Flecha norte
  annotation_north_arrow(location = "tr",
                         height = unit(1, "cm"),
                         width = unit(1, "cm"),
                         which_north = "true",
                         pad_x = unit(0.5, "in"),
                         pad_y = unit(0.05, "in")) +
  
  # Títulos
  labs(x = "Longitud",
       y = "Latitud",
       title = "Ciudades del departamento de Chocó") +
  
  # Tema
  theme_bw()
## Warning in annotation_scale(location = "tr", height = unit(0.25, "cm"), :
## Ignoring unknown parameters: `width`

En esta sección se mejora la visualización del mapa utilizando el paquete ggspatial, el cual permite agregar elementos cartográficos como la barra de escala y la flecha norte.

La función annotation_scale() añade una escala gráfica que facilita la interpretación de distancias en el mapa.

La función annotation_north_arrow() incorpora la flecha norte, permitiendo orientar espacialmente el mapa.

Estos elementos complementan la visualización generada con ggplot2, proporcionando una representación cartográfica más completa y profesional.

6. Entorno de computación

La función sessionInfo() permite registrar el entorno de computación utilizado para el análisis.

Esto incluye la versión de R, el sistema operativo, la zona horaria y los paquetes cargados durante la sesión.

sessionInfo()
## R version 4.6.0 (2026-04-24 ucrt)
## Platform: x86_64-w64-mingw32/x64
## Running under: Windows 11 x64 (build 26200)
## 
## Matrix products: default
##   LAPACK version 3.12.1
## 
## locale:
## [1] LC_COLLATE=Spanish_Colombia.utf8  LC_CTYPE=Spanish_Colombia.utf8   
## [3] LC_MONETARY=Spanish_Colombia.utf8 LC_NUMERIC=C                     
## [5] LC_TIME=Spanish_Colombia.utf8    
## 
## time zone: America/Bogota
## tzcode source: internal
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
## [1] ggspatial_1.1.10 ggplot2_4.0.3    dplyr_1.2.1      sf_1.1-1        
## 
## loaded via a namespace (and not attached):
##  [1] gtable_0.3.6       jsonlite_2.0.0     compiler_4.6.0     tidyselect_1.2.1  
##  [5] Rcpp_1.1.1-1.1     jquerylib_0.1.4    scales_1.4.0       yaml_2.3.12       
##  [9] fastmap_1.2.0      R6_2.6.1           generics_0.1.4     classInt_0.4-11   
## [13] s2_1.1.11          knitr_1.51         tibble_3.3.1       units_1.0-1       
## [17] DBI_1.3.0          bslib_0.11.0       pillar_1.11.1      RColorBrewer_1.1-3
## [21] rlang_1.2.0        cachem_1.1.0       xfun_0.58          sass_0.4.10       
## [25] S7_0.2.2           otel_0.2.0         cli_3.6.6          withr_3.0.2       
## [29] magrittr_2.0.5     wk_0.9.5           class_7.3-23       digest_0.6.39     
## [33] grid_4.6.0         rstudioapi_0.19.0  lifecycle_1.0.5    vctrs_0.7.3       
## [37] KernSmooth_2.23-26 proxy_0.4-29       evaluate_1.0.5     glue_1.8.1        
## [41] farver_2.1.2       e1071_1.7-17       rmarkdown_2.31     tools_4.6.0       
## [45] pkgconfig_2.0.3    htmltools_0.5.9

Este registro es importante para garantizar la reproducibilidad del análisis, ya que permite que otros usuarios puedan replicar exactamente el mismo entorno de trabajo.

Referencias

Lizarazo, I. (2025, 20 de mayo). Introduction to simple features in R. RPubs. https://rpubs.com/ials2un/GB_simple_features