7  Introducción a los datos espaciales

NoteResultados de aprendizaje
  • 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.

install.packages(c("sf", "spData"))
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()

NoteLa columna de geometría se “pega”

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")               # GeoPackage

7.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()

Tipsummarise() 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

ImportantEjercicio 7.1 — Tu comuna

Con la capa de comunas del Biobío:

  1. Filtra una comuna de tu interés y grafícala.
  2. Disuelve las comunas por provincia con group_by() + summarise().
  3. Conserva solo los colegios que están dentro de tu comuna usando st_filter().
  4. Construye un mapa que muestre la comuna, sus colegios y sus ciclovías en distinto color.