Introducción

El presente laboratorio tiene como propósito fundamentar el uso del paquete sf (Simple Features) en el entorno de programación R para la manipulación, consulta y análisis espacial de datos vectoriales georreferenciados. A diferencia de las metodologías tradicionales basadas en entornos de escritorio de Sistemas de Información Geográfica (como QGIS o ArcGIS), este enfoque integra de manera nativa la computación geoespacial con las herramientas de filtrado y estructuración del ecosistema tidyverse (especialmente dplyr). El objetivo central de la práctica consiste en validar procesos críticos de consistencia cartográfica, tales como la verificación de los Sistemas de Referencia de Coordenadas (CRS), para posteriormente ejecutar operaciones avanzadas de selección por atributos y selección por ubicación espacial (Select by Location). Mediante este flujo de trabajo automatizado, se busca aislar y analizar de manera rigurosa las entidades político-administrativas municipales correspondientes al departamento de Nariño y cruzar estructuralmente dicha base con inventarios globales de centros urbanos, consolidando los resultados en un producto cartográfico formal de alta calidad visual.

Desde la página web de Simple Features para R

El paquete sf (Pebesma 2018, 2022) proporciona un conjunto integral de herramientas para trabajar con datos espaciales en el entorno de programación R. Este paquete implementa el estándar Simple Features (Características Simples), el cual es ampliamente utilizado a nivel mundial para la representación y el modelamiento de datos geoespaciales vectoriales.

Bajo este enfoque, los datos espaciales se estructuran como una colección de entidades (features) que poseen tanto atributos geométricos como no geométricos. Los atributos geométricos definen la ubicación espacial, la topología y la forma de los elementos (puntos, líneas o polígonos) sobre la superficie terrestre, mientras que los atributos no geométricos representan las características temáticas, descriptivas o cualitativas de dichas entidades.

Objetivos del cuaderno

Prerrequisitos

Para el desarrollo de esta práctica, es necesario contar con las librerías sf y tidyverse instaladas en el sistema.

1. Setup

Para este trabajo, este cuaderno estará ubicado en la carpeta GB2, de esta orma podrémos usar nuestros archivos espaciales sin problemas. Se necesitarán los siguientes paquetes y funciones de R:

Este cuaderno utiliza las siguientes funciones de sf:

Después de instalar las librerias en la consola con la linea: install.packages(“nombre_de_la_libreria”) las llamamos para poder usarlas, de esta forma:

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

2. Leery Escribir Datos Espaciales

2a. Lectura de Datos Espaciales usando st_read

La función st_read del paquete sf lee datos vectoriales espaciales desde una gran variedad de formatos soportados por GDAL (Geospatial Data Abstraction Library), incluyendo ESRI Shapefile (.shp), GeoJSON (.geojson), GeoPackage (.gpkg), KML (.kml), KMZ (.kmz), CSV con WKT (well-known text) (.csv), entre otros.

st_read simplifica el proceso de lectura de datos espaciales al reconocer automáticamente el formato del archivo y devolver los datos como un objeto de características simples (simple features u objeto sf).

Consejo profesional (Pro Tip): Si el sistema de referencia de coordenadas (CRS) está especificado dentro del archivo, este se leerá de manera completamente automática.

list.files("./Proyecto1/datos")
##  [1] "Ciudades Narino.gpkg"     "ciudadesCol.gpkg"        
##  [3] "COL_adm2.cpg"             "COL_adm2.csv"            
##  [5] "COL_adm2.dbf"             "COL_adm2.prj"            
##  [7] "COL_adm2.shp"             "COL_adm2.shx"            
##  [9] "COL_roads.dbf"            "COL_roads.prj"           
## [11] "COL_roads.shp"            "COL_roads.shx"           
## [13] "Departamento narino.gpkg" "license.txt"             
## [15] "Municipios Narinox.gpkg"  "narino.gpkg"             
## [17] "narino_agua_area.gpkg"    "narino_agua_lineas.gpkg" 
## [19] "narino_alt.tif"           "narino_alt.tif.aux.xml"  
## [21] "narino_mun.gpkg"          "narino_roads.gpkg"       
## [23] "worldcities.csv"          "worldcities.xlsx"

Ahora elegimos el archivo para leer:

colombia <- st_read("./Proyecto1/datos/COL_adm2.shp")
## Reading layer `COL_adm2' from data source 
##   `C:\Users\Acer\Desktop\GB2R\Proyecto1\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

Cuando utilizamos la función st_read para leer un archivo espacial (como un Shapefile o GeoPackage), obtenemos una vista previa de algunos de los metadatos espaciales del archivo:

  • Controlador (Driver): Los datos fueron leídos utilizando el controlador correspondiente al formato del archivo (por ejemplo, ESRI Shapefile o GPKG).
  • Entidades y Atributos: Los datos incluyen el número de entidades (features) espaciales y la cantidad de campos de atributos en la tabla alfanumérica.
  • Tipo de Geometría: El tipo de geometría es multipolygon (multipolígono). ¿Qué es un multipolígono? Es una sola entidad espacial que está compuesta por uno o varios polígonos discontinuos (por ejemplo, un municipio que incluye islas o territorios separados).
  • Cuadro Delimitador (Bounding Box): Define los límites geográficos máximos y mínimos (xmin, ymin, xmax, ymax) que encierran por completo a toda la capa de datos.
  • Sistema de Referencia de Coordenadas (CRS): El sistema de referencia oficial para Colombia es MAGNA-SIRGAS. Revisa los parámetros específicos que arroja tu consola al leer el archivo para verificar las unidades (grados o metros) y la zona de proyección.
head(colombia)

2b. Escribir Datos Espaciales con st_write

Para exportar datos espaciales, la función st_write() puede guardar un objeto sf en una gran variedad de formatos.

Puedes especificar el formato de salida ya sea agregando la extensión de archivo adecuada o especificando el controlador GDAL (driver) correspondiente. Se pueden detallar opciones adicionales para controlar cómo se escriben los datos.

Consejo profesional (Pro Tip): El parámetro append = FALSE (o append = F) permite que la función sobrescriba un archivo ya existente que tenga el mismo nombre dentro del directorio de trabajo.

st_write(colombia, "municipios.gpkg", drive = "GPKG", append = F )
## 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.
list.files(pattern="gpkg")
## [1] "municipios.gpkg"
colombia2 <- st_read("./municipios.gpkg")
## Reading layer `municipios' from data source 
##   `C:\Users\Acer\Desktop\GB2R\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

2c. Tipos de Datos Espaciales Soportados por las Funciones st_read y st_write

A continuación, se presentan los principales formatos de datos espaciales vectoriales compatibles con el paquete sf, clasificados según su uso y características técnicas:

3. Selección de Entidades (Selecting features)

3.1 Selección por Atributos (Select by Attribute)

La herramienta de Selección por Atributos en los programas de SIG tradicionales (como QGIS o ArcGIS) nos permite ingresar una expresión de consulta en SQL para seleccionar las entidades geométricas que cumplan con ciertos criterios específicos.

Por otro lado, la combinación de los paquetes sf y dplyr en R ofrece opciones bastante sencillas y directas para realizar este mismo tipo de operaciones de forma analítica. Examinemos una de ellas.

(narino <- dplyr::filter(colombia, NAME_1 == "Nariño"))

Al verificar el número de entidades (features) tenemos que al realizar el filtro para el departamento de Nariño, el resultado arroja un total de 62 entidades (municipios). Esto coincide con los registros oficiales de la división político-administrativa de la región.

A continuación, realizaremos un mapa preliminar (gráfico rudimentario) de los municipios seleccionados:

3.2 Visualización Preliminar y Centroides Municipales

Una vez filtrado el departamento de Nariño, procedemos a realizar una representación gráfica preliminar utilizando las funciones de graficado nativas del paquete sf.

En este gráfico combinamos dos elementos espaciales clave:

  1. Polígonos Municipales: Representados con una paleta de colores categórica (sf.colors) y bordes grises para diferenciar claramente los límites político-administrativos.

  2. Centroides Geométricos: Calculados mediante la función st_centroid(). Estos puntos representan el centro geométrico de cada municipio (útil como aproximación a las cabeceras municipales) y se superponen usando el argumento add = TRUE con marcadores en forma de cruz de color rojo.

Los ejes perimetrales nos permiten verificar de manera inmediata la extensión geográfica del departamento en coordenadas de latitud y longitud.

plot(st_geometry(narino), col = sf.colors(12, categorical = TRUE), border = 'grey', 
     axes = TRUE)
plot(st_geometry(st_centroid(narino)), pch = 3, col = 'red', add = TRUE)

3.3 Selección por Ubicación (Select by Location)

Una operación fundamental y muy común al trabajar con geodatos es el proceso de seleccionar entidades geográficas basándose en su relación espacial con otro objeto o capa (layer). En los softwares de SIG tradicionales, este proceso se realiza mediante la herramienta Select by Location. Esta metodología permite seleccionar entidades de una capa de entrada a partir de las siguientes relaciones espaciales:

Para ilustrar la funcionalidad de la selección por ubicación, procederemos a cargar una capa de formato tabular (CSV) que contiene las principales ciudades del mundo. Al examinar este tipo de archivos globales, es fundamental recordar que su Sistema de Referencia de Coordenadas (CRS) corresponde de manera estándar a WGS 84 (EPSG: 4326), debido a que almacena ubicaciones en coordenadas geográficas mundiales (latitud y longitud) antes de ser proyectadas a un sistema local.

cities <- read.csv('Proyecto1/datos/worldcities.csv') %>% 
  st_as_sf(coords = c("lng", "lat"), crs = 4326)
cities

Al ejecutar la importación, el entorno de RStudio confirma la creación de un objeto espacial estructurado bajo los siguientes parámetros técnicos:

Comprobamos los códigos EPSG:

st_crs(cities)$epsg
## [1] 4326
st_crs(narino)$epsg
## [1] 4326

Tienen el mismo código EPSG, continuamos.

Extraemos ciudades puntuales dentro de Nariño, seleccionando por ubicación, usando el operador espacial st_within.

ciudades_narino <- cities[narino, , op = st_within]
plot(st_geometry(narino), col = sf.colors(12, categorical = TRUE), border = 'grey', axes = TRUE)
plot(st_geometry(ciudades_narino), pch = 20, col = 'red', add = TRUE)

4.Plotteando con elegancia

4.1 Plotteo con ggplot2

Para la presentación de productos cartográficos con calidad de publicación en informes técnicos, implementamos el paquete ggplot2 en combinación con la función especializada geom_sf(). Esta herramienta interpreta de forma nativa los objetos de la clase Simple Features, encargándose de proyectar y renderizar las geometrías de manera óptima.

Al estructurar un mapa compuesto por múltiples fuentes de datos espaciales, el orden secuencial de las capas dentro del código es un factor crítico. R procesa y superpone los elementos gráficos siguiendo un orden jerárquico estricto de arriba hacia abajo. Por lo tanto, definimos primero la geometría de polígonos correspondientes a los límites municipales de Nariño para establecer el fondo del mapa, y posteriormente superponemos la capa puntual de ciudades (ciudades_narino). Si se invirtiera este orden, la opacidad de los polígonos ocultaría por completo las entidades puntuales inferiores.

Finalmente, complementamos el mapa aplicando elementos estéticos de control como etiquetas personalizadas en los ejes coordenados y el tema minimalista de fondo ordenado theme_bw().

ggplot() +
  geom_sf(data = narino, fill = "whitesmoke", color = "grey60") +
  geom_sf(data = ciudades_narino, aes(color = city, label = city), size = 3) +
  labs(x = "Longitud", y = "Latitud", title = "Ciudades Identificadas en Nariño", subtitle = "Selección espacial basada en el operador st_within", color = "Ciudad") +
  theme_bw()

4.2 Incorporación de Elementos Cartográficos Formales (ggspatial)

Para transformar una representación gráfica bidimensional en un mapa temático estandarizado y de nivel profesional, es indispensable incorporar referencias métricas y de orientación espacial. Utilizando las funciones de extensión del paquete ggspatial, añadimos de manera dinámica una escala gráfica de barras y una rosa de los vientos (flecha de norte) directamente sobre el lienzo de ggplot2.

La inclusión de estos elementos de control geométrico se realiza mediante las funciones annotation_scale() y annotation_north_arrow(). Al trabajar con objetos Simple Features, estas herramientas calculan automáticamente las distancias reales sobre el terreno basándose en las unidades métricas implícitas del Sistema de Referencia de Coordenadas (CRS), garantizando que la barra de escala represente con precisión la dimensión geográfica del departamento. Asimismo, la orientación del norte se ajusta de forma matemática a la convergencia de la cuadrícula, asegurando una lectura e interpretación técnica rigurosa de la distribución de las ciudades en el espacio geográfico.

ggplot() +
  geom_sf(data = narino, fill = "whitesmoke", color = "grey60") +
  geom_sf(data = ciudades_narino, aes(color = city), size = 3) +
  annotation_scale(
    location = "bl", 
    height = unit(0.25, "cm"),
    width_per_cm = 20, 
    pad_x = unit(0.4, "in"), 
    pad_y = unit(0.4, "in")
  ) +
  annotation_north_arrow(
    location = "tr", 
    which_north = "true",
    height = unit(1.2, "cm"), 
    width = unit(1.2, "cm"),
    pad_x = unit(0.3, "in"), 
    pad_y = unit(0.3, "in"),
    style = north_arrow_fancy_orienteering()
  ) +
  labs(
    x = "Longitud", 
    y = "Latitud", 
    title = "Centros Urbanos en Nariño",
    subtitle = "Con control de escala y orientación",
    color = "Ciudad"
  ) +
  theme_bw()

5. Documentación del Entorno de Computación (Computing environment)

A continuación, se ejecuta la función sessionInfo(), la cual genera un registro detallado que incluye la versión del motor de R, el sistema operativo base y las versiones específicas de las dependencias clave de este laboratorio (sf, dplyr, ggplot2 y ggspatial). Esto garantiza que cualquier auditoría técnica o intento posterior de replicación del flujo de trabajo cartográfico sobre el departamento de Nariño cuente con los parámetros de control necesarios.

sessionInfo()
## R version 4.5.2 (2025-10-31 ucrt)
## Platform: x86_64-w64-mingw32/x64
## Running under: Windows 10 x64 (build 19045)
## 
## Matrix products: default
##   LAPACK version 3.12.1
## 
## locale:
## [1] LC_COLLATE=Spanish_Mexico.utf8  LC_CTYPE=Spanish_Mexico.utf8   
## [3] LC_MONETARY=Spanish_Mexico.utf8 LC_NUMERIC=C                   
## [5] LC_TIME=Spanish_Mexico.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.5.2     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.9           knitr_1.51         tibble_3.3.1       units_1.0-1       
## [17] DBI_1.3.0          bslib_0.10.0       pillar_1.11.1      RColorBrewer_1.1-3
## [21] rlang_1.2.0        cachem_1.1.0       xfun_0.57          sass_0.4.10       
## [25] S7_0.2.2           cli_3.6.6          withr_3.0.2        magrittr_2.0.5    
## [29] wk_0.9.5           class_7.3-23       digest_0.6.39      grid_4.5.2        
## [33] rstudioapi_0.18.0  lifecycle_1.0.5    vctrs_0.7.3        KernSmooth_2.23-26
## [37] proxy_0.4-29       evaluate_1.0.5     glue_1.8.1         farver_2.1.2      
## [41] e1071_1.7-17       rmarkdown_2.31     tools_4.5.2        pkgconfig_2.0.3   
## [45] htmltools_0.5.9