Introducción

El modelo de geometrías de simple features es un estándar (ISO 19125) desarrollado por el Open Geospatial Consortium (OGC) para formas geográficas vectoriales, que ha sido adoptado por gran cantidad de software geográfico (entre otros por GeoJSON, ArcGIS, QGIS, PostGIS, MySQL Spatial Extensions, Microsoft SQL Server…). Como ya se comentó, este tipo de datos espaciales está implementado en R en el paquete sf. Los objetos principales, del tipo sf, son extensiones de data.frame (o tibble) y como mínimo contienen una columna denominada simple feature geometry list column que contiene la geometría de cada observación (se trata de una columna tipo list). Cada fila, incluyendo la geometría y otras posibles variables (denominados atributos de la geometría), se considera una simple feature (SF).

¿Ques son las simple features?

Este modelo fue desarrollado para remplazar y ampliar las capacidaddes de algunos paquetes mas antiguos como sp y rgdal, sf puede ofrecer una integración completa con los ecosistemas de R como dplyr, tidyr y ggplot2; facilitando la ejecución de tareas comunes de manipulación de datos, como la selección, la filtración y agregación, directamente en conjuntos de datos espaciales.

Sf puede soportar diferentes tipos de geometrias especiales, que pueden incluir puntos, lineas poligonos y sus variantes combinadas, haciendolo adecuado para una alta gama de tareas y aplicaciones geoespaciales. Su estructura de datos esta alineada con el estandar simple features de la Open Geoespatial Consortium, esto garantiza de manera confiable una compatibilidad con una amplia variedad de herramientas y formatos de datos espaciales.

Resumen del notebook

1) Configuración.

2) Escribir y leer los datos geoespaciales.

3) Selección de caracteristicas.

4) Trazando con elegancia.

5) Entorno de computación.

1) Configuración

Este cuaderno de trabajo requiere varios paquetes de R fundamentales para trabajar con datos espaciales. El paquete principal es sf, que proporciona soporte para el estándar de simple features (características simples), una forma estructurada y ampliamente utilizada para representar datos vectoriales geográficos. Este paquete se conecta con otras bibliotecas clave: GDAL para leer y escribir archivos espaciales, GEOS para realizar operaciones geométricas, y PROJ para transformar sistemas de proyección y coordenadas. Además, sf utiliza por defecto el paquete s2 para operaciones geométricas sobre coordenadas esféricas (longitud y latitud).

Entre las funciones más utilizadas del paquete sf se encuentran:

Junto con sf, se utiliza el paquete dplyr, una herramienta para manipulación de datos que ofrece una gramática sencilla y consistente. Sus funciones principales incluyen mutate() para crear nuevas variables, select() para elegir columnas específicas, filter() para seleccionar filas según condiciones, summarise() para generar resúmenes estadísticos, y arrange() para ordenar los datos.

Para la visualización, se emplea ggplot2, un sistema gráfico basado en la Gramática de los Gráficos, que permite construir gráficos complejos de manera declarativa. Además, el paquete ggspatial complementa a ggplot2 al facilitar la creación de mapas con datos espaciales.

Todos estos paquetes se pueden instalar desde la consola de R con la función install.packages("nombre_del_paquete"), y para utilizarlos es necesario cargarlos con library(sf) y library(dplyr).

#Por medio del comando *"library"* se cargan las librerias que se van a utilizar.
library(sf)
library(dplyr)
library(ggplot2)
library(ggspatial)

2) Escribir y leer los datos espaciales

2a) Leer los datos espaciales con st_read

La función st_read del paquete sf permite leer datos vectoriales espaciales desde una variedad de formatos compatibles con GDAL (Biblioteca de Abstracción de Datos Geoespaciales), incluyendo ESRI Shapefile (.shp), GeoJSON (.geojson), GeoPackage (.gpkg), KML (.kml) y 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 simple features (sf).

#Este comando permite visualizar los archivos que estan en el directorio
list.files("C:\\Users\\brand\\OneDrive\\Escritorio\\GB2\\P3\\DATOS\\MUNICIPIOS")
## [1] "MGN_ADM_MPIO_GRAFICO.cpg"     "MGN_ADM_MPIO_GRAFICO.dbf"    
## [3] "MGN_ADM_MPIO_GRAFICO.prj"     "MGN_ADM_MPIO_GRAFICO.sbn"    
## [5] "MGN_ADM_MPIO_GRAFICO.sbx"     "MGN_ADM_MPIO_GRAFICO.shp"    
## [7] "MGN_ADM_MPIO_GRAFICO.shp.xml" "MGN_ADM_MPIO_GRAFICO.shx"
#El comando st_read() lee las propiedades de un archivo.
colombia <- st_read("C:\\Users\\brand\\OneDrive\\Escritorio\\GB2\\P3\\DATOS\\MUNICIPIOS\\MGN_ADM_MPIO_GRAFICO.shp")
## Reading layer `MGN_ADM_MPIO_GRAFICO' from data source 
##   `C:\Users\brand\OneDrive\Escritorio\GB2\P3\DATOS\MUNICIPIOS\MGN_ADM_MPIO_GRAFICO.shp' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 1121 features and 11 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -81.73562 ymin: -4.229406 xmax: -66.84722 ymax: 13.39473
## Geodetic CRS:  MAGNA-SIRGAS

Cuando usamos st_read para leer un archivo shapefile, obtenemos una vista previa de algunos metadatos espaciales del archivo.

Los datos se leyeron utilizando el controlador ESRI Shapefile.

El conjunto de datos incluye 1121 entidades espaciales, que corresponden al número de municipios en Colombia, y contiene 11 campos de atributos.

El tipo de geometría es multipolygon.

¿Qué es un multipolygon? Un multipolygon (o multipolígono) es una geometría que representa varias superficies cerradas (polígonos) como una sola entidad. Es útil cuando una sola característica geográfica (como un municipio) está compuesta por varias áreas separadas, por ejemplo, islas o zonas no contiguas

Un bounding box es un rectángulo que encierra por completo todas las geometrías de un conjunto de datos espaciales. Este rectángulo se define por sus coordenadas extremas:

xmin: la coordenada mínima en el eje X (longitud más occidental).

ymin: la coordenada mínima en el eje Y (latitud más austral).

xmax: la coordenada máxima en el eje X (longitud más oriental).

ymax: la coordenada máxima en el eje Y (latitud más septentrional).

Con estas cuatro coordenadas, se forma un rectángulo que representa el área geográfica total cubierta por el conjunto de datos.

Los valores del bounding box dependen del sistema de referencia de coordenadas (CRS). Si el CRS está en latitud/longitud, las unidades serán grados. Si está proyectado (por ejemplo, en metros), las unidades serán diferentes.

colombia2 <- st_read("C:\\Users\\brand\\OneDrive\\Escritorio\\GB2\\P3\\DATOS\\MAGDALENA.shp")
## Reading layer `MAGDALENA' from data source 
##   `C:\Users\brand\OneDrive\Escritorio\GB2\P3\DATOS\MAGDALENA.shp' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 30 features and 11 fields
## Geometry type: POLYGON
## Dimension:     XY
## Bounding box:  xmin: -74.9466 ymin: 8.936489 xmax: -73.54184 ymax: 11.34891
## Geodetic CRS:  MAGNA-SIRGAS
colombia3 <- st_read("C:\\Users\\brand\\OneDrive\\Escritorio\\GB2\\P3\\DATOS\\CIUDADES_MAGDALENA.gpkg")
## Reading layer `CIUDADES' from data source 
##   `C:\Users\brand\OneDrive\Escritorio\GB2\P3\DATOS\CIUDADES_MAGDALENA.gpkg' 
##   using driver `GPKG'
## Simple feature collection with 28 features and 11 fields
## Geometry type: POINT
## Dimension:     XY
## Bounding box:  xmin: -74.8589 ymin: 8.9983 xmax: -73.9747 ymax: 11.2419
## Geodetic CRS:  WGS 84
#Con el comando head() se pueden visualizar los primeros 6 datos de una variable de manera ordenada en una tabla.
head(colombia) 
head(colombia2)
head(colombia3)

2b) escribir los datos con st_write

Para exportar datos espaciales, se utiliza la función st_write() del paquete sf, la cual permite guardar un objeto de clase sf en una variedad de formatos compatibles con GDAL. El formato de salida se puede indicar agregando la extensión adecuada al nombre del archivo (como .shp, .geojson, .gpkg, etc.) o especificando directamente el driver correspondiente mediante el argumento driver. Además, se pueden establecer opciones adicionales para controlar cómo se escribe el archivo, como delete_dsn = TRUE para sobrescribir archivos existentes. Por ejemplo, st_write(mi_objeto_sf, “municipios_colombia.geojson”) exporta el objeto en formato GeoJSON, mientras que st_write(mi_objeto_sf, “municipios_colombia”, driver = “ESRI Shapefile”) lo guarda como un Shapefile.

st_write(colombia, "municipios.gpkg", driver = "GPKG", append = F)
## Deleting layer `municipios' using driver `GPKG'
## Writing layer `municipios' to data source `municipios.gpkg' using driver `GPKG'
## Writing 1121 features with 11 fields and geometry type Multi Polygon.
st_write(colombia2, "magdalena.gpkg", driver = "GPKG", append = F)
## Deleting layer `magdalena' using driver `GPKG'
## Writing layer `magdalena' to data source `magdalena.gpkg' using driver `GPKG'
## Writing 30 features with 11 fields and geometry type Polygon.
st_write(colombia3, "ciudades_mgdlna.gpkg", driver = "GPKG", append = F)
## Deleting layer `ciudades_mgdlna' using driver `GPKG'
## Writing layer `ciudades_mgdlna' to data source 
##   `ciudades_mgdlna.gpkg' using driver `GPKG'
## Writing 28 features with 11 fields and geometry type Point.
#Se revisan los archivos creados en geopackage
list.files(pattern="gpkg")
## [1] "ciudades_mgdlna.gpkg" "magdalena.gpkg"       "mgdlna_munic.gpkg"   
## [4] "municipios.gpkg"
colombia4 <- st_read("C:\\Users\\brand\\OneDrive\\Escritorio\\GB2\\P3\\DATOS\\municipios.gpkg")
## Reading layer `municipios' from data source 
##   `C:\Users\brand\OneDrive\Escritorio\GB2\P3\DATOS\municipios.gpkg' 
##   using driver `GPKG'
## Simple feature collection with 1121 features and 11 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -81.73562 ymin: -4.229406 xmax: -66.84722 ymax: 13.39473
## Geodetic CRS:  MAGNA-SIRGAS

2c) Tipos de datos espaciales soportados por las funciones st_read y st_write


1. GeoPackage (.gpkg)

Es un formato moderno basado en SQLite que permite almacenar múltiples capas (capas vectoriales y ráster) en un solo archivo. Es ideal para trabajar con grandes volúmenes de datos y es muy compatible con distintos software SIG. Es uno de los formatos más recomendados hoy en día por su eficiencia y flexibilidad.


2. ESRI Shapefile (.shp)

Es uno de los formatos más antiguos y ampliamente soportados por casi todos los programas SIG. Sin embargo, tiene limitaciones importantes, como nombres de campo de solo 10 caracteres y falta de soporte para múltiples capas. A pesar de esto, sigue siendo muy común por su compatibilidad.


3. GeoJSON (.geojson)

Formato basado en JSON, ligero y fácil de usar en aplicaciones web y visualización en navegadores. Ideal para compartir mapas de forma rápida en línea. Aunque no es óptimo para archivos muy grandes, es excelente para datos vectoriales simples.


4. CSV con WKT/WKB (.csv)

Es un archivo tabular (como una hoja de cálculo) que almacena geometría en formato de texto WKT o WKB, junto con atributos. Muy útil para intercambiar datos entre programas que no son específicamente SIG. También es muy común y fácil de editar manualmente.


5. KML/KMZ (.kml, .kmz)

Formato utilizado principalmente por Google Earth. Es fácil de visualizar y compartir, pero limitado en funciones SIG avanzadas. KMZ es simplemente una versión comprimida del KML. Se usa más en presentaciones y visualización ligera que en análisis profundo.


6. FlatGeobuf (.fgb)

Es un formato binario de alto rendimiento, diseñado para manejar conjuntos de datos muy grandes y transmitirlos rápidamente. Es relativamente nuevo y menos común, pero útil para aplicaciones web modernas que manejan mucha información espacial.


7. SpatiaLite (.sqlite)

Similar a GeoPackage, también se basa en SQLite, pero ha sido menos adoptado. Permite almacenar datos espaciales dentro de una base de datos ligera y portátil. Es útil si quieres trabajar con datos estructurados pero no necesitas todas las funcionalidades de PostGIS.


8. MapInfo TAB (.tab)

Formato propietario usado en el software MapInfo, que es utilizado principalmente en ambientes gubernamentales. Aunque no es tan común como Shapefile o GeoPackage, sigue siendo necesario en ciertos entornos institucionales.


9. GML (.gml)

Formato basado en XML, usado en estándares abiertos como OGC (Open Geospatial Consortium). Se emplea en sistemas europeos, especialmente con requerimientos como INSPIRE. Es detallado y flexible, pero complejo y poco usado fuera de contextos oficiales.


10. PostGIS (sin extensión, conexión directa)

No es un archivo sino una base de datos espacial construida sobre PostgreSQL. Ofrece funciones espaciales avanzadas para consultas complejas. Requiere conocimientos técnicos en bases de datos y es ideal para proyectos grandes, colaborativos y con mucha interacción espacial.


11. OpenStreetMap XML (.osm)

Formato XML que contiene datos de OpenStreetMap. Es muy detallado, pero su estructura es compleja y requiere herramientas específicas para leerlo correctamente. Se usa para análisis y extracción de información del proyecto OSM.


12. DXF (.dxf)

Formato CAD (Diseño Asistido por Computadora), común en ingeniería, arquitectura y topografía. Permite intercambiar geometrías vectoriales con programas como AutoCAD. No es un formato SIG puro, pero es útil para proyectos técnicos que cruzan datos de ingeniería con SIG.


13. GPX (.gpx)

Formato utilizado por dispositivos GPS, ideal para guardar rutas, pistas y puntos de interés. Es muy común en actividades al aire libre (senderismo, ciclismo, etc.) y para importar/exportar datos desde GPS de mano.


3) seleccion de caracteristicas

La herramienta Select By Attributes (Seleccionar por atributos) permite seleccionar elementos espaciales (como puntos, líneas o polígonos) basados en valores de sus atributos. Es decir, puedes aplicar un filtro para seleccionar solo aquellos objetos que cumplen una condición específica.

Funciona como una consulta SQL (Structured Query Language), similar a buscar en una tabla de Excel según ciertos criterios.

3.1) selección por atributos

(magdalena <- dplyr::filter(colombia, dpto_cnmbr=="MAGDALENA"))

Al observar la tabla se puede evidenciar que efectivamente se filtraron los 30 municipios que conforman al departamento del Magdalena, tambien se evidencia que estan acompañados de datos importantes como su area y su codigo correspondiente.

plot(st_geometry(magdalena), col = sf.colors(12, categorical = TRUE), border = 'grey', 
     axes = TRUE)
plot(st_geometry(st_centroid(magdalena)), pch = 3, col = 'red', add = TRUE)
## Warning: st_centroid assumes attributes are constant over geometries

Como se puede observar, en el mapa se visualizan tanto los límites de los municipios (sus contornos poligonales) con sus respectivos centroides. Ahora, se procede a guardar estos elementos seleccionados en un nuevo archivo GeoPackage para poder utilizarlos más adelante.

st_write(magdalena, "mgdlna_munic.gpkg", driver = "GPKG", append = F)
## Deleting layer `mgdlna_munic' using driver `GPKG'
## Writing layer `mgdlna_munic' to data source `mgdlna_munic.gpkg' using driver `GPKG'
## Writing 30 features with 11 fields and geometry type Multi Polygon.

3.2) Seleccion por locación

En el manejo de datos geoespaciales, una operación fundamental es seleccionar elementos basados en su relación espacial con otra capa, proceso que en los SIG se realiza mediante la herramienta “Seleccionar por Ubicación”. Esta permite filtrar elementos según criterios como: intersección, proximidad (usando distancia euclidiana), contención (parcial o total), ubicación dentro de otro elemento, identidad geométrica, contacto de bordes, compartición de segmentos lineales, cruce de contornos o inclusión del centroide (calculado como centroide para polígonos o punto medio para líneas).

cities = read.csv("C:\\Users\\brand\\OneDrive\\Escritorio\\GB2\\P3\\DATOS\\CIUDADES\\worldcities.csv") %>%
  st_as_sf(coords=c("lng","lat"), crs=4326)

las ciudades son puntos o poligonos que representan datos geograficos en un mapa con atributos como nombre, poblacion o coordenadas. En este caso el archivo cities contiene datos de longitud, laatitud, nombre de la ciudad y el país.

cities
st_crs(cities)$epsg
## [1] 4326
st_crs(magdalena)$epsg
## [1] 4686

Se utiliza el comando st_transform() para transformar el SCR de las ciudades al mismo de los municipios del Magdalena.

ncities <- st_transform(cities, crs= st_crs(magdalena))
mgdalena_cities <- ncities[magdalena, , op = st_within]

Para verificar que efectivamente se tuvieron los resultados esperados, se va a realizar el grafico del departamento del Magdalena y verificar que efectivamente las ciudades estan donde corresponden dentro del poligono.

plot(st_geometry(magdalena), col = sf.colors(12, categorical = TRUE), border = 'grey', axes = TRUE)
plot(st_geometry(mgdalena_cities), pch = 18, col = 'red', add = TRUE)

st_write(magdalena, "mgdlna_munic.gpkg", driver = "GPKG", append = F)
## Deleting layer `mgdlna_munic' using driver `GPKG'
## Writing layer `mgdlna_munic' to data source `mgdlna_munic.gpkg' using driver `GPKG'
## Writing 30 features with 11 fields and geometry type Multi Polygon.

4) trazando con ggplot

4.1) trazando con ggplot

Se procede a utilizar ggplot() junto con geom_sf() —una capa especial para datos espaciales— para visualizar la información geográfica. Un detalle clave al construir mapas es el orden de las capas: si se coloca primero los datos de ciudades (stder_cities) y luego los polígonos de los municipios de Santander (santander), las ciudades quedarán ocultas debajo de los polígonos.

ggplot() +
  #Añadir municipios
  geom_sf(data = magdalena) +
  #Aañadir capa de ciudades
  geom_sf(data = mgdalena_cities, aes(color = city, label = city), size = 3) +
  #Añadir titulos
  labs(x = "Longitud", y = "Latitud", title = "Ciudades de Magdalena") +
  coord_sf(xlim = c(-75.5, -73), ylim = c(8.8, 12), expand = FALSE) +

  #Añadir tema
  theme_bw()
## Warning in layer_sf(geom = GeomSf, data = data, mapping = mapping, stat = stat,
## : Ignoring unknown aesthetics: label

4.2) Trazando usando ggplot y ggspatial

ggplot() +
  #Recortar el límite de Magdalena a la extensión espacial de las ciudades y agregar la capa de Magdalena
  geom_sf(data = magdalena) +
  #Add cities layer
  geom_sf(data = mgdalena_cities, aes(color = city, label = city), size = 3) +
  coord_sf(xlim = c(-75.5, -73), ylim = c(8.8, 12), expand = FALSE) +
  #Agregar barra de escala en la esquina inferior izquierda desde ggspatial
  annotation_scale(location = "tr", height = unit(.25, "cm"), 
                   width = unit(1, "cm"), pad_x = unit(0.3, "in"), 
                   pad_y = unit(0.5, "in")) +
  #Agregar una flecha del norte en la esquina inferior izquierda de ggspatial
  annotation_north_arrow(height = unit(1, "cm"), width = unit(1, "cm"),
                         which_north = "true", location = "tr", 
                         pad_x = unit(0.5, "in"), pad_y = unit(0.05, "in")) +
  #Añadir titulos
  labs(x = "Longitud", y = "Latitud", title = "Ciudades de Magdalena") +
  #Añadir tema
  theme_bw()
## Warning in layer_sf(geom = GeomSf, data = data, mapping = mapping, stat = stat,
## : Ignoring unknown aesthetics: label
## Warning in annotation_scale(location = "tr", height = unit(0.25, "cm"), :
## Ignoring unknown parameters: `width`

5) Entorno de computación

sessionInfo()
## R version 4.4.3 (2025-02-28 ucrt)
## Platform: x86_64-w64-mingw32/x64
## Running under: Windows 11 x64 (build 26100)
## 
## Matrix products: default
## 
## 
## 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.9 ggplot2_3.5.2   dplyr_1.1.4     sf_1.0-20      
## 
## loaded via a namespace (and not attached):
##  [1] gtable_0.3.6       jsonlite_2.0.0     compiler_4.4.3     tidyselect_1.2.1  
##  [5] Rcpp_1.0.14        jquerylib_0.1.4    scales_1.4.0       yaml_2.3.10       
##  [9] fastmap_1.2.0      R6_2.6.1           generics_0.1.4     classInt_0.4-11   
## [13] s2_1.1.7           knitr_1.50         tibble_3.2.1       units_0.8-7       
## [17] DBI_1.2.3          bslib_0.9.0        pillar_1.10.2      RColorBrewer_1.1-3
## [21] rlang_1.1.6        cachem_1.1.0       xfun_0.52          sass_0.4.10       
## [25] cli_3.6.5          withr_3.0.2        magrittr_2.0.3     wk_0.9.4          
## [29] class_7.3-23       digest_0.6.37      grid_4.4.3         rstudioapi_0.17.1 
## [33] lifecycle_1.0.4    vctrs_0.6.5        KernSmooth_2.23-26 proxy_0.4-27      
## [37] evaluate_1.0.3     glue_1.8.0         farver_2.1.2       e1071_1.7-16      
## [41] rmarkdown_2.29     tools_4.4.3        pkgconfig_2.0.3    htmltools_0.5.8.1