Estaciones de metro en Madrid capital
Input
En este trabajo utilizaremos datos sacados de la plataforma colaborativa OpenStreetMap, la cual proporciona datos geoespaciales abiertos y actualizados de forma continua por una comunidad global, centrandonos en las estaciones de metro de Madrid. Estas estaciones se encuentran representadas en la OSM ante las siguientes etiquetas railway=station y station=subway. Esta aproximacion garantiza que los datos utilizados esten actualizados y sean reproducibles desde cualquier equipo, cumpliendo asi con los requisitos del proyecto DataEnhance UV. Pese a ello, al tratarse de una base de datos colaborativa, podemos encontrar algunos problemas en cuanto a la calidad del dato (duplicados, cambios en los nombres o atributos incompletos). Teniendo en cuenta esto, resulta esencial realizar un proceso de limpieza para mejorar el conjunto de datos.
Descripción
Empezamos cargando todas las librerias necesarias para este trabajo, donde realizaremos consultas a traves de OpenStreetMaps y generaremos mapas.
En este apartado consultaremos todas las etiquetas disponibles en la categoria railway en OMS. Aqui identificaremos los valores existentes y confirmaremos cual es el adecuado para obtner los puntos correspondientes a las entradas de metro. Se verifica que la etiqueta correcta es subway_entrance.
osm_railway <- osmdata::available_tags("railway")
head(osm_railway, 20)# A tibble: 20 × 2
Key Value
<chr> <chr>
1 railway abandoned
2 railway buffer_stop
3 railway construction
4 railway crossing
5 railway derail
6 railway disused
7 railway funicular
8 railway halt
9 railway level_crossing
10 railway light_rail
11 railway miniature
12 railway monorail
13 railway narrow_gauge
14 railway platform
15 railway preserved
16 railway proposed
17 railway rail
18 railway railway_crossing
19 railway roundhouse
20 railway signal
# A tibble: 1 × 2
Key Value
<chr> <chr>
1 railway subway_entrance
Continuamos extrayendo a partir de la cartogrofia oficial del municipio de Madrid, y su correspondiente bounding box con forma rectangular, donde se define el area exacta en la cual realizaremos la consulta, evitando de esta manera descargar datos innecesarios fuera del municipio.
madrid_city <- mapSpain::esp_get_munic() %>%
filter(name == "Madrid")! The file to be downloaded has size 74.6 Mb.
bbox_madrid_city <- st_bbox(madrid_city)Utilizando el bounding box de Madrid previamente construido y la etiqueta subway_entrance realizaeremos finalmente la consulta. El resultado es un conjunto de puntos ubicados en las entradas de las bocas de metro registradas en la OSM dentro de la capital.
q_metro_madrid_city <- bbox_madrid_city %>%
opq(timeout = 1000) %>%
add_osm_feature(key = "railway", value = "subway_entrance")
metro_madrid_city <- osmdata_sf(q_metro_madrid_city)
metro_madrid_city_pts <- metro_madrid_city$osm_points
ggplot() +
ggspatial::annotation_map_tile(type = "cartolight", zoom = 12) +
geom_sf(data = metro_madrid_city_pts,
color = "#33a02c", size = 2, alpha = 0.6) +
theme_void()Zoom: 12
Fetching 30 missing tiles
|
| | 0%
|
|== | 3%
|
|===== | 7%
|
|======= | 10%
|
|========= | 13%
|
|============ | 17%
|
|============== | 20%
|
|================ | 23%
|
|=================== | 27%
|
|===================== | 30%
|
|======================= | 33%
|
|========================== | 37%
|
|============================ | 40%
|
|============================== | 43%
|
|================================= | 47%
|
|=================================== | 50%
|
|===================================== | 53%
|
|======================================== | 57%
|
|========================================== | 60%
|
|============================================ | 63%
|
|=============================================== | 67%
|
|================================================= | 70%
|
|=================================================== | 73%
|
|====================================================== | 77%
|
|======================================================== | 80%
|
|========================================================== | 83%
|
|============================================================= | 87%
|
|=============================================================== | 90%
|
|================================================================= | 93%
|
|==================================================================== | 97%
|
|======================================================================| 100%
...complete!
Tratamiento
Empezamos tratando la base de datos agrupando puntos proximos entre si, para asi detectar accesos redundantes del metro. EL parametro eps define la distancia maxima que pueden haber entre dos puntos para considerarlos en la misma estacion. Cada observacion tiene un identificador de cluster para consolidar las entradas repetidas.
coords_metro <- st_coordinates(metro_madrid_city_pts)
set.seed(562)
clusters_metro <- dbscan(coords_metro, eps = 0.0015, minPts = 2)
metro_madrid_city_pts$cluster <- as.factor(clusters_metro$cluster)En este paso consiladamos los clusters creados en unico punto, se empieza calculando el centroide del conjunto, eliminado los accesos redundantes y manteniendo una sola observacion por grupo espacial. Hemos convertido el objeto resultante en un sf para que se mantenga la estructura espacial.
st_write(metro_clean, "data/metro_clean.gpkg", delete_dsn = TRUE)Deleting source `data/metro_clean.gpkg' failed
Writing layer `metro_clean' to data source `data/metro_clean.gpkg' using driver `GPKG'
Writing 195 features with 1 fields and geometry type Point.
Output
Se ha obtenido el siguiente resultado tras el proceso de limpieza. Donde encontramos un grafico mucho mas limpio comparado al inicial, es decir, se han quitado con eficacia las estaciones duplicadas, mejorando de esta manera el dataset.
ggplot() +
ggspatial::annotation_map_tile(type = "cartolight", zoom = 13) +
geom_sf(data = metro_clean,
color = "#1E88E5", size = 2, alpha = 0.8) +
theme_void()Zoom: 13
Fetching 81 missing tiles
|
| | 0%
|
|= | 1%
|
|== | 2%
|
|=== | 4%
|
|=== | 5%
|
|==== | 6%
|
|===== | 7%
|
|====== | 9%
|
|======= | 10%
|
|======== | 11%
|
|========= | 12%
|
|========== | 14%
|
|========== | 15%
|
|=========== | 16%
|
|============ | 17%
|
|============= | 19%
|
|============== | 20%
|
|=============== | 21%
|
|================ | 22%
|
|================ | 23%
|
|================= | 25%
|
|================== | 26%
|
|=================== | 27%
|
|==================== | 28%
|
|===================== | 30%
|
|====================== | 31%
|
|====================== | 32%
|
|======================= | 33%
|
|======================== | 35%
|
|========================= | 36%
|
|========================== | 37%
|
|=========================== | 38%
|
|============================ | 40%
|
|============================= | 41%
|
|============================= | 42%
|
|============================== | 43%
|
|=============================== | 44%
|
|================================ | 46%
|
|================================= | 47%
|
|================================== | 48%
|
|=================================== | 49%
|
|=================================== | 51%
|
|==================================== | 52%
|
|===================================== | 53%
|
|====================================== | 54%
|
|======================================= | 56%
|
|======================================== | 57%
|
|========================================= | 58%
|
|========================================= | 59%
|
|========================================== | 60%
|
|=========================================== | 62%
|
|============================================ | 63%
|
|============================================= | 64%
|
|============================================== | 65%
|
|=============================================== | 67%
|
|================================================ | 68%
|
|================================================ | 69%
|
|================================================= | 70%
|
|================================================== | 72%
|
|=================================================== | 73%
|
|==================================================== | 74%
|
|===================================================== | 75%
|
|====================================================== | 77%
|
|====================================================== | 78%
|
|======================================================= | 79%
|
|======================================================== | 80%
|
|========================================================= | 81%
|
|========================================================== | 83%
|
|=========================================================== | 84%
|
|============================================================ | 85%
|
|============================================================ | 86%
|
|============================================================= | 88%
|
|============================================================== | 89%
|
|=============================================================== | 90%
|
|================================================================ | 91%
|
|================================================================= | 93%
|
|================================================================== | 94%
|
|=================================================================== | 95%
|
|=================================================================== | 96%
|
|==================================================================== | 98%
|
|===================================================================== | 99%
|
|======================================================================| 100%
...complete!
El/los fichero(s) generados con este procedimiento/técnica/metodología se puede(n) descargar de aquí.
Proyecto de Innovación Educativa Emergente (PIEE-3898312)