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).
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.
1) Configuración.
2) Escribir y leer los datos geoespaciales.
3) Selección de caracteristicas.
4) Trazando con elegancia.
5) Entorno de computació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:
st_as_sf()
, que convierte objetos externos en objetos
sf
;st_bbox()
, que devuelve la caja de límites (bounding
box) de un conjunto de datos espaciales;st_geometry()
, que permite obtener, modificar o
establecer la geometría de un objeto sf
;st_read()
para leer datos espaciales desde archivos o
bases de datos.st_write()
para guardar objetos espaciales en archivos
o bases de datos.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)
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)
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
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
(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.
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.
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
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`
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