Datos sobre las zonas de recarga de vehículos eléctricos en la ciudad de Madrid
Input
El crecimiento del uso de vehículos eléctricos en las ciudades ha generado una nueva necesidad, la creación de una infraestructura adecuada de estaciones de recarga. OpenStreetMap (OSM) es una fuente útil para obtener estos datos, ya que proporciona información geoespacial detallada y actualizada de manera colaborativa y abierta.
Este informe se centra en identificar y mejorar la calidad de los datos sobre puntos de recarga de vehículos eléctricos en la ciudad de Madrid, detectando posibles errores y optimizando su uso para el análisis geoespacial.
Pese a que OSM es una herramienta poderosa debido a su cobertura y actualización continua, su naturaleza colaborativa puede derivar en problemas ya sean datos incompletos, duplicaciones o ubicaciones incorrectas. En este análisis, aplicaremos técnicas para solucionar estos problemas.
Descripción
Cargamos las librerías necesarias:
Antes de extraer los datos, definimos el área geográfica de interés, para ello crearemos la bounding box de la ciudad de Madrid:
# Extraemos el municipio de Madrid con 'mapSpain'
madrid_mun <- mapSpain::esp_get_munic() %>% filter(name == "Madrid")
# Transformamos a bounding box
bbox_madrid <- sf::st_bbox(madrid_mun)
Ahora construiremos la consulta para obtener los puntos de recarga de vehículos eléctricos.
# Consulta OSM para puntos de recarga
q <- bbox_madrid %>%
osmdata::opq(timeout = 1000) %>%
osmdata::add_osm_feature(key = "amenity", value = "charging_station")
# Obtenemos los datos en formato sf
puntos_recarga_sf <- osmdata::osmdata_sf(q)
# Extraemos los puntos de interés
puntos_recarga_sf <- puntos_recarga_sf$osm_points
Verificación de los datos:
# Verificamos el tipo de objeto y cantidad de datos
class(puntos_recarga_sf) # "sf" "data.frame"
[1] "sf" "data.frame"
dim(puntos_recarga_sf) # Número de observaciones y variables
[1] 217 84
Para visualizar los datos en un mapa interactivo:
Al analizar la distribución de los puntos, detectamos dos problemas principales:
1. Duplicaciones: Algunos puntos aparecen varias veces en la misma ubicación.
2. Puntos fuera del municipio: Algunos registros están fuera de Madrid.
Tratamiento
Aplicamos el algoritmo DBSCAN para eliminar duplicaciones:
# Extraemos coordenadas
coords <- sf::st_coordinates(puntos_recarga_sf)
# Aplicación de DBSCAN
res <- dbscan(coords, eps = 0.001, minPts = 1)
puntos_recarga_sf$cluster <- data.frame(res$cluster)
# Calculamos el punto medio de cada clúster
puntos_recarga_sf2 <- puntos_recarga_sf %>%
group_by(cluster) %>%
summarise(geometry = st_centroid(st_combine(geometry)))
# Representación
ggplot() +
geom_sf(data = madrid_mun) +
geom_sf(data = puntos_recarga_sf2) +
theme_void() +
labs(title = "Puntos de Recarga en Madrid (tras DBSCAN)")
Después de eliminar duplicados, reducimos la cantidad de puntos de 217 a 149 estaciones únicas.
Ahora, realizaremos una intersección y filtramos solo los puntos que ‘caigan’ dentro del municipio de Madrid:
# Transformamos puntos_recarga_sf (EPSG:4236) a EPSG:4258 para que coincidan con madrid_mun
puntos_recarga_sf2 <- sf::st_transform(puntos_recarga_sf2, crs = 4258)
# Comprobamos que coincidan
st_crs(madrid_mun)
Coordinate Reference System:
User input: EPSG:4258
wkt:
GEOGCRS["ETRS89",
DATUM["European Terrestrial Reference System 1989",
ELLIPSOID["GRS 1980",6378137,298.257222101,
LENGTHUNIT["metre",1]]],
PRIMEM["Greenwich",0,
ANGLEUNIT["degree",0.0174532925199433]],
CS[ellipsoidal,2],
AXIS["geodetic latitude (Lat)",north,
ORDER[1],
ANGLEUNIT["degree",0.0174532925199433]],
AXIS["geodetic longitude (Lon)",east,
ORDER[2],
ANGLEUNIT["degree",0.0174532925199433]],
USAGE[
SCOPE["Spatial referencing."],
AREA["Europe - onshore and offshore: Albania; Andorra; Austria; Belgium; Bosnia and Herzegovina; Bulgaria; Croatia; Cyprus; Czechia; Denmark; Estonia; Faroe Islands; Finland; France; Germany; Gibraltar; Greece; Hungary; Ireland; Italy; Kosovo; Latvia; Liechtenstein; Lithuania; Luxembourg; Malta; Moldova; Monaco; Montenegro; Netherlands; North Macedonia; Norway including Svalbard and Jan Mayen; Poland; Portugal; Romania; San Marino; Serbia; Slovakia; Slovenia; Spain; Sweden; Switzerland; United Kingdom (UK) including Channel Islands and Isle of Man; Vatican City State."],
BBOX[32.88,-16.1,84.73,40.18]],
ID["EPSG",4258]]
st_crs(puntos_recarga_sf2)
Coordinate Reference System:
User input: EPSG:4258
wkt:
GEOGCRS["ETRS89",
DATUM["European Terrestrial Reference System 1989",
ELLIPSOID["GRS 1980",6378137,298.257222101,
LENGTHUNIT["metre",1]]],
PRIMEM["Greenwich",0,
ANGLEUNIT["degree",0.0174532925199433]],
CS[ellipsoidal,2],
AXIS["geodetic latitude (Lat)",north,
ORDER[1],
ANGLEUNIT["degree",0.0174532925199433]],
AXIS["geodetic longitude (Lon)",east,
ORDER[2],
ANGLEUNIT["degree",0.0174532925199433]],
USAGE[
SCOPE["Spatial referencing."],
AREA["Europe - onshore and offshore: Albania; Andorra; Austria; Belgium; Bosnia and Herzegovina; Bulgaria; Croatia; Cyprus; Czechia; Denmark; Estonia; Faroe Islands; Finland; France; Germany; Gibraltar; Greece; Hungary; Ireland; Italy; Kosovo; Latvia; Liechtenstein; Lithuania; Luxembourg; Malta; Moldova; Monaco; Montenegro; Netherlands; North Macedonia; Norway including Svalbard and Jan Mayen; Poland; Portugal; Romania; San Marino; Serbia; Slovakia; Slovenia; Spain; Sweden; Switzerland; United Kingdom (UK) including Channel Islands and Isle of Man; Vatican City State."],
BBOX[32.88,-16.1,84.73,40.18]],
ID["EPSG",4258]]
# Realizamos la intersección
puntos_recarga_in <- sf::st_intersection(puntos_recarga_sf2, madrid_mun)
Finalmente, representamos los datos finales:
Output
Se ha obtenido un conjunto de datos limpio que contiene únicamente las estaciones de recarga ubicadas dentro del municipio de Madrid, con duplicados eliminados y las ubicaciones geográficas corregidas.
El fichero generado con este procedimiento puede descargarse de aquí.
Proyectos de Innovación Educativa Emergente PIEE-2737007 y PIEE-3325394