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.
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.
sf en R para la gestión y análisis de datos
geoespaciales.sf).sf y
tidyverse para realizar consultas espaciales y descriptivas
sobre el territorio del departamento de Nariño.Para el desarrollo de esta práctica, es necesario contar con las
librerías sf y tidyverse instaladas en el
sistema.
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:
sf:
Este cuaderno utiliza las siguientes funciones de
sf:
st_as_sf: convierte un objeto
externo en un objeto de tipo sf.
st_bbox: devuelve el cuadro
delimitador (bounding box).
st_geometry: obtiene, define,
reemplaza o renombra la geometría de un objeto sf.
st_read: lee características
simples o capas desde un archivo.
st_write: escribe un objeto de
características simples en un archivo.
dplyr:
mutate(): añade nuevas variables que
son funciones de variables existentes.select(): selecciona variables en
función de sus nombres.filter(): selecciona casos o filas en
función de sus valores.summarise(): reduce múltiples valores
a un solo resumen estadístico.arrange(): cambia el orden de las
filas.ggplot2
ggspatial
ggplot2
para una creación de mapas mucho más sencilla.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)
st_readLa 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:
head(colombia)
st_writePara 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
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:
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:
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:
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.
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)
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:
search_distance para definir dicha longitud.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:
features) correspondientes a
ciudades a nivel global, con 9 campos o variables de atributos
asociados.POINT (dimensiones XY). La caja de delimitación
espacial (Bounding box) abarca prácticamente todo el
planeta, extendiéndose desde la longitud xmin: -179.6 hasta
xmax: 179.3667, y desde la latitud
ymin: -54.9333 hasta ymax: 81.7166.WGS 84. Al
coincidir con el CRS de nuestra capa base de departamentos y municipios
de Colombia, nos permite realizar operaciones geométricas y de selección
por ubicación de manera directa y sin necesidad de realizar una
reproyección previa.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)
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()
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()
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