libs <- c("tidyverse", "sf", "mapSpain", "osmdata", "ggspatial", "prettymapr", "ggplot2", "dbscan", "leaflet","leaflet.extras", "RColorBrewer")
installed_libs <- libs %in% rownames(installed.packages())
if (any(installed_libs == F)) {install.packages(libs[!installed_libs])}
invisible(lapply(libs, library, character.only = T))
rm(libs, installed_libs)
Datos de/sobre las cumbres montañosas de España
Input
Este proyecto tiene como objetivo obtener y analizar datos espaciales de las cumbres montañosas de España. Los resultados del estudio tienen como público objetivo los deportistas de montaña. Por este motivo, no nos centraremos en aquellas cumbres montañosas inferiores a 1000 metros de altitud ya que suelen ser menos atractivas para los deportistas de montaña porque, en general, presentan desniveles más suaves, menor dificultad técnica y escaso componente de alta montaña , lo que reduce el desafío físico y técnico que muchos buscan en sus actividades. Además, estas cumbres suelen tener accesos fáciles o carreteras, perdiendo el sentido de aventura y contacto con la naturaleza. Por debajo de esa altitud, también son menos comunes la nieve, la vegetación de alta montaña y las condiciones extremas que enriquecen la experiencia deportiva.
La principal fuente de datos utilizada para el estudio es OpenStreetMaps ya que ofrece una gran cantidad de datos geográficos, lo cual la convierte en una herramienta valiosa para identificar y mapear las cumbres más destacadas del territorio español. Ahora bien, OSM tiene limitaciones propias de su naturaleza colaborativa. La calidad de los datos varía según la actividad de la comunidad, pudiendo ser incompleta o desactualizada en zonas con menos colaboradores. La falta de uniformidad en el etiquetado y los errores humanos, como ubicaciones incorrectas o duplicadas, son riesgos comunes. Aunque OSM incluye mecanismos de verificación, no siempre garantiza precisión, especialmente en zonas remotas. Aun así, OSM sigue siendo una herramienta valiosa, y además si se complementa con un correcto tartamiento de los datos se pueden solucionar muchos de estos problemas, mejorando la precisión y utilidad de los resultados del proyecto.
Descripción
Extracción de los datos
La utilización del paquete “osmdata” es una de las diferentes maneras que ofrece OSM para extraer información de la plataforma. El proceso consiste en definir un área de interés con getbb() y construir una consulta con opq(), especificando las etiquetas de los elementos que se desean obtener con add_osm_feature(). En este caso, la consulta se filtra específicamente por elementos etiquetados con el valor “peak”, dentro de la clave “natural”, los cuales representan los principales picos y cumbres recogidas en la cartografía..
# Indicamos boundung box
bbox_esp <- getbb("Spain")
# Construimos la consulta
query <- bbox_esp %>%
opq() %>%
add_osm_feature(key = "natural", value = "peak")
A continuación, ejecutamos la consulta con osmdata_sf() para obtener los datos en formato espacial sf.
# Almacenamos el resultado de la consulta (se genera una lista de objetos sf)
cumbres_esp <- osmdata_sf(query)
cumbres_esp
Object of class 'osmdata' with:
$bbox : 27.4335426,-18.3936845,43.9933088,4.5918885
$overpass_call : The call submitted to the overpass API
$meta : metadata including timestamp and version numbers
$osm_points : 'sf' Simple Features Collection with 108029 points
$osm_lines : NULL
$osm_polygons : 'sf' Simple Features Collection with 2 polygons
$osm_multilines : NULL
$osm_multipolygons : NULL
Como resultado obtenemos una lista con 2 colecciones de geometrías diferentes. Por una parte, más de 100000 puntos que se asocian a ubicaciones de cumbres, cruces u otros elementos puntuales. Por otra parte, 2 polígonos, que podrían no contener información relevante. Para aclarar dudas, los representaremos en un gráfico y decidimos si es conveniente tenerlos en cuenta para el estudio o no.
map <- leaflet() %>%
addTiles()
map <- map %>%
addPolygons(data = cumbres_esp$osm_polygons,
color = "blue",
weight = 10,
fillOpacity = 50,group = "Polígonos")
map
Al representar los polígonos nos damos cuenta que pertenecen a una ubicación de África, por tanto no los tendremos en cuenta para el estudio. Por tanto, almacenaremos solo los puntos resultantes de la consulta en un objeto diferente, para así poder tratar los datos posteriormente.
# Extraemos los objetos sf NO NULL de la lista
cumbres_esp_points <- cumbres_esp$osm_points
Preparación de los datos
Para enfocar mejor el tratamiento, realizamos una primera representación del mapa. De esta manera, identificaremos si hay puntos duplicados o puntos fuera del área seleccionada, entre otros.
# Representamos gráficamente
ggplot() +
annotation_map_tile(type="cartolight") +
geom_sf(data = cumbres_esp_points, size = 0.1)
Zoom: 4
A través de la representación, se puede observar que en la consulta se han filtrado datos de cumbres montañosas que no pertenecen a España. Esto puede ser debido a una mala definción de las coordenadas del bounding box, a una incorrecta georreferenciación de los datos por los colaboradores, etc. Además, a vista general observamos grandes concentraciones de puntos en algunas zonas. Esto podría significar que hay datos duplicados, lo cual trataremos de investigar en el apartado siguiente.
Tratamiento
Eliminación de observaciones NA
Como ya hemos mencionado, OSM es una plataforma en la que cualquier usuario puede aportar información geográfica. Aunque esta característica permite generar una gran base de datos abierta y en constante actualización, también provoca que algunas entidades estén incompletas o mal definidas, especialmente en zonas menos mapeadas o de difícil acceso. Por ello, es habitual encontrar registros con bastantes valores NA.
En este contexto, columnas como el nombre permiten identificar cada cumbre y referenciarla correctamente, mientras que la elevación es fundamental para cualquier estudio relacionado con la altitud, como ordenarlas, clasificarlas o representarlas gráficamente. Por ese motivo, la ausencia de nombre y elevación de la montaña pueden complicar algunos aspectos del estudio.
Por este motivo, decido eliminar las observaciones con NA en estos campos para garantizar la calidad del conjunto de datos finales , evitando posibles errores en análisis posteriores y asegurando que el resultado sea más confiable y representativo.
Además, muchas de las columnas de la parte data frame del objeto sf de los puntos son NA, por tanto, vamos a seleccionar aquellas que nos puedan ser de interés a la hora de representar gráficamente. Entre ellas encontramos el nombre de la cumbre, el identificador o la altitud.
cumbres_esp_points$ele <- as.numeric(cumbres_esp_points$ele)
cumbres_esp_points <- cumbres_esp_points %>%
select(osm_id, name, ele, geometry) %>%
filter(!is.na(name)) %>%
filter(!is.na(ele)) %>%
arrange(ele)
Eliminación de los outliers
La solución al problema de la existencia de geometrías fuera del bounding box seleccionado pasa por utilizar la función st_intersection(). Los dos argumentos que le pasaremos a la función son el objeto sf de los puntos representativos de las cumbres, y un multipolígono (sfc) de las áreas con las que queremos interceptar los puntos. En este caso, el multipoligono está formado por poligonos que representan la península y las islas.
Para obtener la geometría sobre la cual realizaremos la intersección obtenemos el poligono administrativo completo de España y filtramos los datos para quedarnos con el contorno del territorio español únicamente.
espana <- opq(bbox = bbox_esp) %>%
add_osm_feature(key = "boundary", value = "administrative") %>%
add_osm_feature(key = "admin_level", value = "2") %>%
osmdata_sf()
espana_sf <- espana$osm_multipolygons %>%
filter(name == "España")
cumbres <- st_intersection(cumbres_esp_points, espana_sf)
cumbres <- select(cumbres,osm_id, name, ele)
Una vez realizada la intersección representamos gráficamente la información obtenida para observar los resultados del tratamiento.
Output
Una vez terminado el tratamiento, representamos los datos de manera gráfica para visualizar el resultado del estudio.
# Seleccionamos cumbres +1000m de altitud
cumbres3 <- cumbres %>%
filter(ele > 1000) %>%
arrange(ele)
# Crear la paleta de colores según la altitud
pal <- colorNumeric(
palette = "YlOrRd",
domain = cumbres3$ele
)
# Crear el mapa
leaflet(cumbres3) %>%
addTiles() %>%
addCircleMarkers(
color = ~pal(ele),
fillOpacity = 0.01,
radius = 0.01,
popup = ~paste("<b>", name, "</b><br>Altitud: ", ele, " m")
) %>%
addLegend(
"bottomright",
pal = pal,
values = ~ele,
title = "Altitud (m)",
opacity = 0.1
)
st_write(cumbres3, "cumbres_españa_1000.gpkg")
El/los fichero(s) generados con este procedimiento/técnica/metodología se puede descargar de aquí.
Proyectos de Innovación Educativa Emergente PIEE-2737007 y PIEE-3325394