El paquete sf de R fue diseñado para ofrecer soporte al
estándar simple features (sf) —o «geometrías simples»—,
utilizado para la representación de datos geográficos vectoriales dentro
del ecosistema R. El paquete sf se lanzó por primera vez en
2016 y, en pocos años, superó con creces al paquete sp
(lanzado en 2005) como la opción más utilizada para representar datos
geográficos vectoriales en R. Además de brindar soporte al estándar
simple features, sf incluye una amplia gama de
funciones para trabajar con datos espaciales vectoriales en R. Si usted
está acostumbrado a trabajar con datos espaciales mediante software SIG
de escritorio tradicional, como QGIS o ArcGIS, encontrará en el paquete
sf —potenciado por los paquetes del tidyverse—
equivalentes a las herramientas SIG habituales para el análisis, la
consulta, la selección, el geoprocesamiento y la visualización.
El concepto de «simple features» (sf) —o acceso a «simple features»— hace referencia a un estándar formal (ISO 19125-1:2004) que describe cómo representar en sistemas informáticos los objetos del mundo real, poniendo énfasis en su geometría espacial. Asimismo, detalla cómo almacenar dichos objetos en bases de datos y recuperarlos de ellas, además de definir las operaciones geométricas que deben aplicarse a los mismos. Este estándar cuenta con una amplia implementación en bases de datos espaciales (como PostGIS) y sistemas de información geográfica (SIG) comerciales (por ejemplo, ESRI ArcGIS), y constituye la base de datos vectoriales para bibliotecas como GDAL.
Este cuaderno te introducirá al paquete sf y al trabajo
con datos vectoriales geográficos bajo el estándar de datos simple
features (sf). Este cuaderno pretende ser únicamente
una introducción muy breve al paquete sf, ya que aquí no se
abordarán muchas otras funciones disponibles en dicho paquete.
Tener disponible una copia del archivo shapefile MGN2023_MPIO_POLITICO de DANE (y utilizado desde el inicio del curso de Geomática Básica).
https://www.jessesadler.com/post/simple-feature-objects/ https://learning.nceas.ucsb.edu/2023-04-coreR/session_15.html
Configuración
Lectura y escritura de datos espaciales
Creación y visualización de objetos espaciales
** Este cuaderno debería estar en su directorio GB2, cerca del directorio donde guardó sus datos.**
Este cuaderno requiere los siguientes paquetes y funciones de R.
Este cuaderno utiliza las siguientes funciones de sf:
st_as_sf · convierte un objeto externo en un objeto
sf st_bbox · devuelve el límite de una característica simple o un conjunto de características simples.
st_geometry · obtiene, establece, reemplaza o renombra la geometría de un objeto.
sf st_read · lee características simples o capas de un archivo o base de datos.
st_write · escribe un objeto de características simples en un archivo o base de datos.
https://dplyr.tidyverse.org/- dplyr es una gramática de manipulación de datos que proporciona un conjunto coherente de verbos que te ayudan a resolver los desafíos más comunes de manipulación de datos:
mutate() agrega nuevas variables que son funciones de variables existentes.
select() selecciona variables según sus nombres.
filter() selecciona casos según sus valores.
summarise() reduce múltiples valores a un único resumen.
-arrange() cambia el orden de las filas.
https://ggplot2.tidyverse.org/- ggplot2 es un sistema para crear gráficos de forma declarativa, basado en la Gramática de los Gráficos. Usted proporciona los datos, le indica a ggplot2 cómo asignar variables a elementos estéticos y qué primitivas gráficas usar, y ggplot2 se encarga de los detalles.
https://paleolimbot.github.io/ggspatial/- Los datos espaciales, sumados a la potencia del marco ggplot2, facilitan la creación de mapas.
Puedes instalar las bibliotecas necesarias desde la consola usando install.packages(“nombre_de_la_biblioteca”). Si la instalación es exitosa, debes cargar sf y dplyr para usar sus funciones:
library(sf)
## Linking to GEOS 3.14.1, GDAL 3.12.1, PROJ 9.7.1; sf_use_s2() is TRUE
library(dplyr)
##
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(ggplot2)
library(ggspatial)
La función st_read del paquete sf lee datos vectoriales espaciales de diversos formatos compatibles con GDAL (Geospatial Data Abstraction Library), como ESRI Shapefile (.shp), GeoJSON (.geojson), GeoPackage (.gpkg), KML (.kml) y KMZ (.kmz), CSV con WKT (texto conocido) (.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 (sf).
★ Consejo profesional: Si el sistema de referencia de coordenadas (SRC) está especificado en el archivo, se leerá automáticamente.
list.files("./datos")
## [1] "cities.csv"
## [2] "Evaluaciones_Agropecuarias_Municipales_EVA_20261022.csv"
## [3] "metamun.geojson"
## [4] "MUN_META.gpkg"
## [5] "signos.png"
## [6] "worldcities.csv"
Ahora, puede especificar la ruta relativa para leer el archivo shapefile:
meta <- st_read("./datos/MUN_META.gpkg")
## Reading layer `Municipios ' from data source
## `C:\Users\juane\OneDrive\Escritorio\geomatica\proyecto7\datos\MUN_META.gpkg'
## using driver `GPKG'
## Simple feature collection with 29 features and 11 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: -74.9206 ymin: 1.570401 xmax: -71.0749 ymax: 4.860201
## Geodetic CRS: WGS 84
Cuando utilizamos st_read para leer un archivo shapefile, obtenemos una vista previa de algunos de los metadatos espaciales del archivo.
RTA: Es un tipo de objeto geométrico utilizado en sistemas de información geográfica (GIS) y bases de datos espaciales que representa un conjunto de uno o más polígonos individuales como una sola entidad
El cuadro delimitador los 29 municipios de departamento del Meta
El sistema de referencia de coordenadas (SRC) es MAGNA-SIRGAS. Consulta tu cuaderno físico para conocer los parámetros de este SRC.
meta
Para exportar datos espaciales, la función st_write() permite guardar un objeto sf en diversos formatos. Puede especificar el formato de salida añadiendo la extensión de archivo correspondiente o indicando el controlador GDAL adecuado. Se pueden especificar opciones adicionales para controlar cómo se escriben los datos.
★ Consejo profesional: El parámetro append = F permite que el archivo sobrescriba un archivo ya existente con el mismo nombre en el directorio de trabajo.
st_write(meta, "./datos/metamun.geojson", driver = "GeoJSON", append = F)
## Warning in CPL_write_ogr(obj, dsn, layer, driver,
## as.character(dataset_options), : GDAL Error 6: DeleteLayer() not supported by
## this dataset.
## Deleting layer not supported by driver `GeoJSON'
## Deleting layer `metamun' failed
## Writing layer `metamun' to data source
## `./datos/metamun.geojson' using driver `GeoJSON'
## Updating existing layer metamun
## Writing 29 features with 11 fields and geometry type Multi Polygon.
list.files(pattern="geojson")
## [1] "metamun.geojson" "MUN_META.geojson"
2c. Tipos de datos espaciales compatibles con las funciones st_read y st_write
La herramienta Seleccionar por Atributos en el software SIG nos permite proporcionar una expresión de consulta SQL para seleccionar las entidades que coincidan con los criterios de selección.
Por otro lado, sf y dplyr ofrecen opciones bastante sencillas y directas para realizar operaciones similares. Analicemos una de ellas.
plot(st_geometry(meta), col = sf.colors(12, categorical = TRUE), border = 'grey',
axes = TRUE)
plot(st_geometry(st_centroid(meta)), pch = 3, col = 'red', add = TRUE)
## Warning: st_centroid assumes attributes are constant over geometries
Nótese que hemos trazado los límites de los municipios, así como sus
centroides. Ahora, podemos guardar las características seleccionadas en
un nuevo archivo geopackage para su uso posterior:
st_write(meta, "stder_munic.gpkg", driver = "GPKG", append = F)
## Deleting layer `stder_munic' using driver `GPKG'
## Writing layer `stder_munic' to data source `stder_munic.gpkg' using driver `GPKG'
## Writing 29 features with 11 fields and geometry type Multi Polygon.
Una operación muy común al trabajar con geodatos es la selección de entidades en función de su relación espacial con otro objeto (capa). En el software SIG, este proceso se suele realizar mediante la herramienta Seleccionar por ubicación. Esta herramienta permite seleccionar entidades según las siguientes relaciones:
Vamos a ilustrar la funcionalidad de selección por ubicación. Primero, leamos un archivo CSV con ciudades del mundo. Sí, es el mismo archivo que usamos hace varias semanas en este curso. ¿Recuerdas el sistema de coordenadas de referencia (CRS) de este archivo?
cities = read.csv('./datos/worldcities.csv') %>%
st_as_sf(coords=c("lng","lat"), crs=4326) # remember x=longitude and y=latitude
¿Qué son las ciudades?
cities
Es posible que hayamos notado que el sistema de referencia de coordenadas (CRS) de los dos conjuntos de datos (es decir, Santander y Cities) no coincide. Vamos a demostrarlo:
st_crs(cities)$epsg
## [1] 4326
st_crs(meta)$epsg
## [1] 4326
Antes de utilizar cualquier selección por ubicación, necesitamos transformar el sistema de coordenadas de referencia (SCR) de las ciudades para que coincida con el SCR de Santander. Podemos hacerlo utilizando la función st_transform:
ncities <- st_transform(cities, crs= st_crs(meta))
Ahora, estamos listos para partir:
stder_cities <- ncities[meta, , op = st_within]
¿Obtuvimos lo que esperábamos? Comprobémoslo de nuevo con un gráfico rudimentario:
plot(st_geometry(meta), col = sf.colors(12, categorical = TRUE), border = 'grey', axes = TRUE)
plot(st_geometry(stder_cities), pch = 20, col = 'red', add = TRUE)
Nótese la variedad de símbolos que se pueden utilizar para representar
geometrías de puntos:
Usaremos ggplot() y llamaremos a geom_sf(), que le indica a R que estamos trabajando con datos espaciales. Al crear un mapa, también es crucial considerar el orden de las capas. Si colocamos los datos de las ciudades (stder_cities) antes del polígono de municipios de Santander (santander), las ciudades quedarán debajo del polígono de municipios y no podremos verlas.
ggplot() +
#Add municipalities
geom_sf(data = meta) +
#Add cities layer
geom_sf(data = stder_cities, aes(color = city, label = city), size = 3) +
#Add titles
labs(x = "Longitud", y = "Latitud", title = "Ciudades de Meta") +
#Add theme
theme_bw()
## Warning in layer_sf(geom = GeomSf, data = data, mapping = mapping, stat = stat,
## : Ignoring unknown aesthetics: label
# 4.2 Representación gráfica con ggplot y ggspatial
Ahora, añadiremos algunos elementos personalizados a nuestro mapa, como una flecha que indique el norte y una barra de escala, utilizando el paquete ggspatial de R.
ggplot() +
#Crop Virginia boundary to spatial extent of cities and add Virginia layer
geom_sf(data = meta) +
#Add cities layer
geom_sf(data = stder_cities, aes(color = city, label = city), size = 3) +
#Add scale bar to bottom left from 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")) +
#Add north arrow to bottom left from 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")) +
#Add titles
labs(x = "Longitud", y = "Latitud", title = "Ciudades de Meta") +
#Add theme
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`
Si obtuviste resultados similares a los mostrados anteriormente,
¡felicidades!
sessionInfo()
## R version 4.6.1 (2026-06-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_Spain.utf8 LC_CTYPE=Spanish_Spain.utf8
## [3] LC_MONETARY=Spanish_Spain.utf8 LC_NUMERIC=C
## [5] LC_TIME=Spanish_Spain.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.11 ggplot2_4.0.3 dplyr_1.2.1 sf_1.1-3
##
## loaded via a namespace (and not attached):
## [1] gtable_0.3.6 jsonlite_2.0.0 compiler_4.6.1 tidyselect_1.2.1
## [5] Rcpp_1.1.2 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.13 knitr_1.52 tibble_3.3.1 units_1.0-1
## [17] DBI_1.3.0 bslib_0.12.0 pillar_1.11.1 RColorBrewer_1.1-3
## [21] rlang_1.3.0 cachem_1.1.0 xfun_0.61 sass_0.4.10
## [25] S7_0.2.2 cli_3.6.6 withr_3.0.3 magrittr_2.0.5
## [29] wk_0.9.5 class_7.3-23 digest_0.6.39 grid_4.6.1
## [33] rstudioapi_0.19.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.32 tools_4.6.1 pkgconfig_2.0.3
## [45] htmltools_0.5.9