El paquete sf de R fue diseñado para proover ayuda al trabajar con caracteristicas simples (sf) las cuales son estandar para la representacion de datos vectoriales geograficos dentro del ecosistema R. El paquete sf se lanzó por primera vez en 2016 y, en pocos años, superó ampliamente al paquete sp (lanzado por primera vez en 2005) como la representación de datos geográficos más utilizada para datos vectoriales en R. Además de ofrecer compatibilidad con el estándar de datos Simple Features, sf incluye una amplia gama de funciones para trabajar con datos vectoriales espaciales en R. Si estás acostumbrado a trabajar con datos espaciales utilizando software tradicional de SIG de escritorio, como QGIS o ArcGIS, encontrarás equivalentes a las herramientas típicas de análisis, consulta, selección, geoprocesamiento y visualización de SIG dentro del paquete sf, potenciado por los paquetes de tidyverse.
El término «elementos simples» (sf) o «acceso a elementos simples» se refiere a una norma formal (ISO 19125-1:2004) que describe cómo se pueden representar en computadoras los objetos del mundo real, haciendo hincapié en la geometría espacial de dichos objetos. También describe cómo se pueden almacenar y recuperar dichos objetos de las bases de datos, y qué operaciones geométricas deben definirse para ellos. La norma se aplica ampliamente en bases de datos espaciales (como PostGIS), SIG comerciales (por ejemplo, ESRI ArcGIS) y constituye la base de datos vectoriales para bibliotecas como GDAL.
Este cuaderno te presentará el paquete sf y te enseñará a trabajar con datos vectoriales geográficos en el estándar de datos Simple Features (sf). Este cuaderno solo pretende ser una introducción muy breve al paquete sf, ya que aquí no se abordarán muchas otras funciones de sf.
✨ Requisitos previos ✨
Tener una copia del archivo shapefile MGN2023_MPIO_POLITICO, disponible en DANE (y utilizado desde el inicio del curso de Geomática Básica).
Configuracion
Lectura y escritura de datos espaciales
Creando y viendo objetos espaciales
Este cuaderno debe estar en tu carpeta GB2 cerca al directorio donde guardas tus datos
Este cuaderno requiere los siguientes paquetes y funciones de R:
Este cuaderno hace uso de las siguientes funciones de sf:
st_as_sf· convierte un objeto extraño por un objeto sf
st_bbox· devuelve los límites de un elemento simple o un conjunto de elementos simples
st_geometry· toma,configura,remplasa o renombra geometrias de un objeto sf
st_read · lee elementos simples o capas de el archivo o base de datos
st_write· escribe elementos simples al archivo o
base de datos
dplyr · dplyr es una gramática de manipulación de datos que ofrece un conjunto coherente de verbos que te ayudan a resolver los retos más comunes en la manipulación de datos:
mutate() añade nuevas variables que son funciones de variables existentes
select() elige variables basada en sus nombres
-filter()elie¿ge casos basado en sus valores
summarise()reduce multiples valores a un solo indice
arrange() cambia el orden de las filas
ggplot2 ggplot2 es un sistema para crear gráficos de manera declarativa, basado en «The Grammar of Graphics». Tú proporcionas los datos, le indicas a ggplot2 cómo asignar las variables a los elementos estéticos y qué primitivas gráficas utilizar, y él se encarga de los detalles.
ggspatialLos datos espaciales, junto con el potencial del marco ggplot2, facilitan la creación de mapas.
Puedes instalar las bibliotecas necesarias desde la consola utilizando install.packages(“nombre_de_la_biblioteca”). Si la instalación se realiza correctamente, debes cargar sf y dplyr para poder utilizar 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), entre ellos ESRI Shapefile (.shp), GeoJSON (.geojson), GeoPackage (.gpkg), KML (.kml) y KMZ (.kmz), CSV con WKT (texto bien conocido) (.csv) y más.
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).
##obten el nombre del archivo cercano a tu cuaderno
list.files("C:/GB02-20260909T121559Z-1-001/GB02/R proyecto 3 GIS Y R")
## [1] "byc_munic.gpkg"
## [2] "datos"
## [3] "GIS-y-R.html"
## [4] "GIS-y-R.Rmd"
## [5] "GIS y R.nb.html"
## [6] "GIS y R.Rmd"
## [7] "MGN2025_ADM_MPIO_GRAFICO_(Geopackage)"
## [8] "municipios.gpkg"
## [9] "MUNICIPIOS_2025.gpkg"
## [10] "rsconnect"
## [11] "stder_munic.gpkg"
## [12] "worldcities csv.csv"
Ahora, puedes especificar el camino relativo para leer el archivo:
colombia <- st_read("C:/GB02-20260909T121559Z-1-001/GB02/R proyecto 3 GIS Y R/MUNICIPIOS_2025.gpkg")
## Reading layer `MGN_ADM_MPIO_GRAFICO (Geopackage)' from data source
## `C:\GB02-20260909T121559Z-1-001\GB02\R proyecto 3 GIS Y R\MUNICIPIOS_2025.gpkg'
## using driver `GPKG'
## Simple feature collection with 1122 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: WGS 84
Cuando usamos st_read() para leer un geopackage obtenemos una prevista de algunos de los metadatos de espacio del archivo.
los datos fueron leidos usando el driver GPKG
los datos incluyen 1121 elementos(el numero de municipios en Colombia) y tiene 11 campos de atributos.
El tipo de geometria es multipoligono. ¿que es un multipoligono? Un multipolígono (MULTIPOLYGON) es un tipo de geometría geográfica que representa varios polígonos agrupados dentro de un mismo objeto o registro espacial.
La caja limitante es: xmin: -81.73562 ymin: -4.229406 xmax: -66.84722 ymax: 13.39473
El sistema coordinado de referencias(CRS) es WGS 84
head(colombia)
Para exportar datos espaciales, la funcion st_write puede guardar un objeto sf a una variedad de formatos.
Puedes especificar el formato de salida ya sea agregando la extensión de archivo adecuada o indicando el controlador GDAL correspondiente. Se pueden especificar opciones adicionales para controlar cómo se escriben los datos.
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 1122 features with 11 fields and geometry type Multi Polygon.
## prueba que el nuevo archivo geopackage allá sido creado
list.files(pattern = "gpkg")
## [1] "byc_munic.gpkg" "municipios.gpkg" "MUNICIPIOS_2025.gpkg"
## [4] "stder_munic.gpkg"
## lee el geopackage "municipios" xomo un objeto sf
colombia2 <- st_read("./municipios.gpkg")
## Reading layer `municipios' from data source
## `C:\GB02-20260909T121559Z-1-001\GB02\R proyecto 3 GIS Y R\municipios.gpkg'
## using driver `GPKG'
## Simple feature collection with 1122 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: WGS 84
La herramienta Seleccionar por atributos en software de GIS nos permite una expresión de consulta SQL para seleccionar características que cumplan con los criterios de selección.
Por otro lado, sf y dplyr ofrecen opciones bastante sencillas y directas para realizar operaciones similares. Veamos una de ellas.
(boyaca <- dplyr::filter(colombia, dpto_cnmbr=="BOYACÁ"))
Revisa el numero de elementos seleccionado. ¿Coincide con la informacion previa de tu departamento?
Entonces, vamos a hacer una grafica muy rudimentaria, los municipios de Boyaca:
plot(st_geometry(boyaca), col = sf.colors(12, categorical = TRUE), border = 'grey',
axes = TRUE)
plot(st_geometry(st_centroid(boyaca)), pch = 3, col = 'red', add = TRUE)
## Warning: st_centroid assumes attributes are constant over geometries
Note que graficamos las fronteras de los municipios asi como sus centroides.
Ahora, podemos escribir los elementos seleccionados dentro de un nuevo archivo geopackage para usar despues:
st_write(boyaca, "byc_munic.gpkg", driver = "GPKG", append = F)
## Deleting layer `byc_munic' using driver `GPKG'
## Writing layer `byc_munic' to data source `byc_munic.gpkg' using driver `GPKG'
## Writing 123 features with 11 fields and geometry type Multi Polygon.
Una operación muy común al trabajar con datos geográficos es el proceso de seleccionar elementos en función de una relación espacial con otro objeto (capa). En los programas de SIG, este proceso suele realizarse mediante la herramienta «Seleccionar por ubicación». Esta herramienta permite seleccionar elementos en función de las siguientes relaciones:
intersect: Se seleccionarán los elementos de la capa de entrada si se cruzan con un elemento de selección. Esta es la opción predeterminada.
within_a_distance: Se seleccionarán los elementos de la capa de entrada que se encuentren dentro de la distancia especificada (utilizando la distancia euclidiana) de un elemento de selección. Usa el parámetro search_distance para especificar la distancia.
contains: Se seleccionarán los elementos de la capa de entrada si contienen un elemento de selección.
within: Los elementos de la capa de entrada se seleccionarán si se encuentran dentro de un elemento de selección.
completely_within: Los elementos de la capa de entrada se seleccionarán si se encuentran completamente dentro de un elemento de selección o están contenidos por este.
are_identical_to: Se seleccionarán los elementos de la capa de entrada si son idénticos (en geometría) a un elemento de selección.
boundary_touches:Los elementos de la capa de entrada se seleccionarán si tienen un límite que toque un elemento de selección. Cuando los elementos de entrada son líneas o polígonos, el límite del elemento de entrada solo puede tocar el límite del elemento de selección, y ninguna parte del elemento de entrada puede cruzar el límite del elemento de selección.
share_a_line_segment_with: Se seleccionarán los elementos de la capa de entrada si comparten un segmento de línea con un elemento de selección. Tanto los elementos de entrada como los de selección deben ser líneas o polígonos.
crossed_by_the_outline_of: Se seleccionarán los elementos de la capa de entrada si son atravesados por el contorno de un elemento de selección. Tanto los elementos de entrada como los de selección deben ser líneas o polígonos. Si se utilizan polígonos para la capa de entrada o de selección, se utilizará el contorno (línea) del polígono. Se seleccionarán las líneas que se crucen en un punto; no se seleccionarán las líneas que compartan un segmento de línea.
have_their_center_in: Se seleccionarán los elementos de la capa de entrada si su centro se encuentra dentro de un elemento de selección. El centro del elemento se calcula de la siguiente manera: para polígonos y multipuntos, se utiliza el centroide de la geometría; para entradas de línea, se utiliza el punto medio de la geometría.
Veamos cómo funciona la función 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. ¿Te acuerdas del CRS de este archivo?
cities = read.csv('worldcities csv.csv') %>%
st_as_sf(coords=c("lng","lat"), crs=4326) # remember x=longitude and y=latitude
¿Que es cities?
cities
Pudimos haber notado que la CRS de los dos sets de datos (i.e. santander and cities) no coinciden. Vamos a probarlo:
st_crs(cities)$epsg
## [1] 4326
st_crs(boyaca)$epsg
## [1] 4326
Ya coincide pero en caso de que no se debe hacer una transformacion:
##
##ncities <- st_transform(cities, crs= st_crs(santander))
#segundopaso#stder_cities <- ncities[santander, , op = st_within]
Nosotros retomamos desde el segundo paso:
boy_cities <- cities[boyaca, , op = st_within]
Obtuvimos lo esperado? Vamos a comprobar usando una grafica rudimentaria nuevamente:
plot(st_geometry(boyaca), col = sf.colors(12, categorical = TRUE), border = 'grey', axes = TRUE)
plot(st_geometry(boy_cities), pch = 20, col = 'red', add = TRUE)
Usaremos ggplot() y llamaremos a geom_sf(), lo cual le indica a R que estamos trabajando con datos espaciales. Al crear un mapa, también es fundamental considerar el orden de nuestras capas. Si colocamos nuestros datos de ciudades (boy_cities) antes del polígono de los municipios de Boyacá (boyaca), las ciudades quedarán ocultas bajo el polígono de los municipios y no podremos verlas.
ggplot() +
#Add municipalities
geom_sf(data = boyaca) +
#Add cities layer
geom_sf(data = boy_cities, aes(color = city, label = city), size = 3) +
#Add titles
labs(x = "Longitud", y = "Latitud", title = "Ciudades de Boyacá") +
#Add theme
theme_bw()
## Warning in layer_sf(geom = GeomSf, data = data, mapping = mapping, stat = stat,
## : Ignoring unknown aesthetics: label
Ahora, agregaremos algunos elementos personalizados a nuestro mapa, como una flecha que indica 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 = boyaca) +
#Add cities layer
geom_sf(data = boy_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(2, "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(2.3, "in"), pad_y = unit(0.05, "in")) +
#Add titles
labs(x = "Longitud", y = "Latitud", title = "Ciudades de Boyacá") +
#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`
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_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.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.62 sass_0.4.10
## [25] S7_0.2.2 otel_0.2.0 cli_3.6.6 withr_3.0.3
## [29] magrittr_2.0.5 wk_0.9.5 class_7.3-23 digest_0.6.39
## [33] grid_4.6.1 rstudioapi_0.19.0 lifecycle_1.0.5 vctrs_0.7.3
## [37] KernSmooth_2.23-26 proxy_0.4-29 evaluate_1.0.5 glue_1.8.1
## [41] farver_2.1.2 e1071_1.7-17 rmarkdown_2.32 tools_4.6.1
## [45] pkgconfig_2.0.3 htmltools_0.5.9