install.packages(c("sf", "spData"))7 Introducción a los datos espaciales
- R4. Importar y manipular información espacial en R.
Aquí comienza el corazón geográfico del curso. Trabajaremos con datos vectoriales (puntos, líneas y polígonos) usando el paquete sf (simple features), el estándar moderno para datos espaciales en R.
library(tidyverse)
library(sf)
library(spData)7.1 ¿Qué es un objeto sf?
Un objeto sf es un data frame normal más una columna especial (la geometría) que guarda la forma geográfica de cada fila. Esto significa que puedes usar todas las funciones de tidyverse (filter, select, mutate…) sobre datos espaciales.
Podemos cargar el mapa del mundo incluido en spData y graficarlo con geom_sf():
ggplot(data = world) +
geom_sf() +
theme_void()
7.2 Importar archivos espaciales
st_read() lee shapefiles (.shp), GeoPackages (.gpkg), FlatGeobuf (.fgb) y muchos otros formatos. Usaremos las comunas de la Región del Biobío:
comunas <- st_read("data/comunas_biobio.gpkg")Reading layer `comunas_biobio' from data source
`/Users/sebastianbaeza/REPOSITORIES/R_spatial_book/libro/data/comunas_biobio.gpkg'
using driver `GPKG'
Simple feature collection with 52 features and 4 fields
Geometry type: MULTIPOLYGON
Dimension: XY
Bounding box: xmin: -73.96724 ymin: -38.48986 xmax: -70.98486 ymax: -36.0051
Geodetic CRS: WGS 84
ggplot(data = comunas) +
geom_sf() +
theme_void()
Para explorar la tabla de atributos usamos las funciones de siempre:
glimpse(comunas)Rows: 52
Columns: 5
$ region <int> 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, …
$ region_1 <chr> "VIII", "VIII", "VIII", "VIII", "VIII", "VIII", "VIII", "VII…
$ comuna <chr> "ANTUCO", "ARAUCO", "BULNES", "CABRERO", "CANETE", "CHIGUAYA…
$ provincia <chr> "BIOBIO", "ARAUCO", "NUBLE", "BIOBIO", "ARAUCO", "CONCEPCION…
$ geom <MULTIPOLYGON [°]> MULTIPOLYGON (((-71.09544 -..., MULTIPOLYGON ((…
7.3 Filtrar y seleccionar datos espaciales
Como un sf es un data frame, filtramos con tidyverse:
tome <- comunas %>%
filter(comuna == "TOME")
ggplot(data = tome) +
geom_sf() +
theme_void()
Al usar select(), la columna de geometría se conserva automáticamente aunque no la nombres; es “pegajosa”. Para eliminarla y quedarte con un data frame común necesitas st_drop_geometry().
tome <- tome %>%
select(comuna, provincia)
names(tome)[1] "comuna" "provincia" "geom"
7.4 Guardar datos espaciales
st_write() exporta a distintos formatos. st_drivers() lista los disponibles:
st_drivers() # formatos soportados
st_write(tome, "tome.gpkg") # GeoPackage7.5 Operaciones geométricas
Estas funciones transforman las geometrías mismas.
st_union() fusiona geometrías. Combinado con group_by() + summarise(), disuelve polígonos por una variable (aquí, agrupar comunas en provincias):
provincias <- comunas %>%
group_by(provincia) %>%
summarise()
ggplot(data = provincias) +
geom_sf(aes(fill = provincia)) +
theme_void()
summarise() une geometrías automáticamente
Cuando aplicas summarise() a un objeto sf agrupado, la columna de geometría se fusiona con st_union() por defecto. Por eso no hace falta escribirlo.
st_boundary() extrae el borde (límite) de un polígono:
comunas %>%
st_union() %>%
st_boundary() %>%
ggplot() + geom_sf() + theme_void()
7.6 Operaciones de relación espacial
Estas combinan dos capas según cómo se relacionan en el espacio. Cargamos los colegios y las ciclovías del Biobío:
colegios <- st_read("data/colegios_biobio.gpkg", quiet = TRUE)
ciclovias <- st_read("data/ciclovias_biobio.gpkg", quiet = TRUE)st_filter() con un predicado (ej. st_intersects) conserva los elementos de una capa que cumplen una relación con otra. Aquí, todo lo que cae dentro de Concepción:
conce <- comunas %>% filter(comuna == "CONCEPCION")
colegios_conce <- colegios %>% st_filter(conce, .predicate = st_intersects)
ciclo_conce <- ciclovias %>% st_filter(conce, .predicate = st_intersects)
ggplot() +
geom_sf(data = conce) +
geom_sf(data = colegios_conce, color = "blue2", size = 0.8) +
geom_sf(data = ciclo_conce, color = "tomato1") +
theme_void()
st_intersection() recorta una capa con otra (devuelve solo la parte común). A diferencia de st_filter(), sí modifica las geometrías:
biobio_poly <- st_union(comunas)
colegios_bio <- st_intersection(colegios, biobio_poly)
ggplot() +
geom_sf(data = biobio_poly) +
geom_sf(data = colegios_bio, color = "red", size = 0.3) +
theme_void()
Ejercicios
Con la capa de comunas del Biobío:
- Filtra una comuna de tu interés y grafícala.
- Disuelve las comunas por provincia con
group_by()+summarise(). - Conserva solo los colegios que están dentro de tu comuna usando
st_filter(). - Construye un mapa que muestre la comuna, sus colegios y sus ciclovías en distinto color.