Introducción

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.

De la página web de Simple Features para R

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.

objetivos del cuaderno

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.

✨ prerrequisitos ✨

Tener disponible una copia del archivo shapefile MGN2023_MPIO_POLITICO de DANE (y utilizado desde el inicio del curso de Geomática Básica).

Recursos adicionales en la web

https://www.jessesadler.com/post/simple-feature-objects/ https://learning.nceas.ucsb.edu/2023-04-coreR/session_15.html

Descripción general del portátil

1. configuración

** 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:

-arrange() cambia el orden de las filas.

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)

2. Lectura y escritura de datos espaciales

2a. Lectura de datos espaciales con st_read

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.

  • Los datos se leyeron utilizando el controlador ESRI Shapefile.
  • Los datos incluyen 1121 características (el número de municipios en Colombia) y tienen 11 campos de atributos.
  • El tipo de geometría es multipolígono. ¿Qué es un multipolígono?

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

2b. Escritura de datos espaciales con st_write

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

3. Selección de características

3.1 Seleccionar por atributo

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.

5.2 Seleccionar por ubicación

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:

4. Trazar con elegancia

4.1 Representación gráfica con ggplot

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!

5. Entorno informático

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