Estaciones de Bomberos en Cataluña
Input
Los datos geoespaciales son fundamentales para el análisis territorial y la planificación urbana, y OpenStreetMap (OSM) se ha convertido en una de las principales fuentes de información abierta en este ámbito. Gracias a la colaboración de una comunidad global de voluntarios, OSM proporciona un mapa detallado del mundo con una amplia variedad de elementos, desde carreteras y edificios hasta infraestructuras esenciales como estaciones de bomberos.
En este caso, nos centraremos en el análisis de las estaciones de bomberos en Cataluña, utilizando datos extraídos directamente de OSM. En lugar de recurrir a fuentes oficiales o bases de datos estáticas, emplearemos consultas automatizadas para obtener la información más actualizada disponible. Sin embargo, al tratarse de datos colaborativos, es posible que encontremos inconsistencias, duplicidades o imprecisiones que deban ser depuradas antes de su uso en estudios más específicos.
El objetivo de esta práctica es explorar el potencial y las limitaciones de OSM como fuente de datos geoespaciales, aplicando técnicas de análisis para mejorar la calidad de la información. A través de la agrupación y limpieza de datos, demostraremos cómo se pueden obtener resultados más precisos y representativos de la realidad, lo que resulta clave para estudios urbanos, planificación de emergencias y gestión de recursos.
Descripción
Primeramente cargamos las librerías necesarias:
Obtenemos la cartografía oficial de la Comunidad Autónoma de Cataluña y la almacenamos en un bounding box usando la función st_bbox
cataluna <- esp_get_ccaa() %>% filter(ine.ccaa.name == "Cataluña")
bbox_cat <- st_bbox(cataluna)
Extraemos los datos de OpenStreetMaps relacionados con las estaciones de bomberos
q_fire_stations <- opq(bbox_cat, timeout=1000) %>%
add_osm_feature(key = "amenity", value = "fire_station")
fire_stations <- osmdata_sf(q_fire_stations)
Nos interesan los puntos, por lo que los extraemos y almacenamos, para poder visualizar las estaciones.
fire_stations_points <- fire_stations$osm_points
dim(fire_stations_points) #disponemos de 1887 observaciones y 20 variables
[1] 1891 20
Representamos los datos usando la librería leaflet
Nos encontramos con dos problemas:
Por un lado hay demasiados puntos superpuestos, que pertenecen a una misma estación de bomberos, ya que hay aproximadamente unas 150 estaciones de bombero en Cataluña, y nos salen 1887 puntos. Existe por tanto una clara redundancia. Esto se debe a que OSM puede incluir múltiples puntos para una misma estación (como entradas, edificios dentro de un complejo, etc…)
Por otro lado tenemos puntos representados fuera del límite de Cataluña, por lo que hay que abordarlo también.
Tratamiento
Primeramente agrupamos los puntos con la función dbscan (librería dbscan) para agrupar los puntos cercanos y reducir la cantidad de estaciones redundantes en OSM.
coords <- st_coordinates(fire_stations_points) # Extraemos latitud y longitud
El parámetro clave aquí es eps, que define el radio de agrupación en grados. Un valor típico para coordenadas geográficas es 0.01 ≈ 1 km
Asignamos clusters
fire_stations_points$cluster <- as.factor(clusters$cluster)
Reducimos a un solo punto por cluster
fire_stations_clustered <- fire_stations_points %>%
group_by(cluster) %>%
summarise(geometry = st_centroid(st_union(geometry))) %>%
ungroup()
dim(fire_stations_clustered)
[1] 213 2
Pasamos a tener 213 observaciones.
El siguiente paso es solucionar el problema de los puntos que se hallan fuera del territorio de la Comunidad Autónoma de Cataluña, para ello aplicamos la función st_difference a los objetos fire_stations_clustered y cataluna. Antes de eso transformamos ambos objetos al mismo sistema de coordenadas con la función st_transform.
# Transformamos al mismo sistema de coordenadas
fire_stations_clustered <- st_transform(fire_stations_clustered, st_crs(cataluna))
# Detectamos los Outliers
stations_out <- st_difference(fire_stations_clustered, cataluna)
Warning: attribute variables are assumed to be spatially constant throughout
all geometries
dim(stations_out)
[1] 57 23
Tenemos 57 observaciones de las que debemos prescindir pues no se encuentran dentro de Cataluña.
Eliminamos las observaciones que no nos interesan con la función st_intersection
# Estaciones de Policía dentro del municipio de Valencia
stations_inside <- st_intersection(fire_stations_clustered,cataluna)
Warning: attribute variables are assumed to be spatially constant throughout
all geometries
dim(stations_inside)
[1] 156 23
Comprobamos que, ahora sí, tenemos 156 estaciones de bomberos que pertenecen a la Comunidad Autónoma de Cataluña.
Output
Representamos los datos de las estaciones ahora depurados.
spain <- mapSpain::esp_get_ccaa()
spain <- sf::st_transform(spain, crs=4326)
limites_cat <- sf::st_buffer(cataluna, 15000) %>% sf::st_bbox()
ggplot() +
geom_sf(data = spain, fill="white") +
geom_sf(data = cataluna, fill="pink") +
geom_sf(data = stations_inside, size=1) +
coord_sf(xlim = c(limites_cat["xmin"], limites_cat["xmax"]),
ylim = c(limites_cat["ymin"], limites_cat["ymax"])) +
theme_minimal() +
theme(axis.title = element_blank(),
panel.background = element_rect(fill="lightblue"))
Podemos visualizar claramente las estaciones reales de bomberos en la Comunidad Autónoma de Cataluña, tras realizar las agrupaciones pertinentes con dbscan, eliminando los puntos indeseables y transformando al mismo sistema de coordenadas con el paquete sf.
Así pues usando las diferentes funciones de los paquetes cargados hemos conseguido tratar correctamente los datos extraídos de OpenStreetMaps para obtener información mucho más precisa y fiable.
sf::st_write(stations_inside, "estaciones_bombero_cataluna.gpkg")
El fichero generado con este procedimiento se puede descargar de aquí.
Proyectos de Innovación Educativa Emergente PIEE-2737007 y PIEE-3325394