Datos sobre museos y monumentos de Valencia

Valencia
OSM
Museos
Autor/a
Afiliación

Agatha del Olmo Tirado

Universitat de València

Fecha de publicación

29 de marzo de 2025

Input

En este análisis, se trabaja con un conjunto de datos geoespaciales obtenidos de OpenStreetMap que contiene información sobre las principales atracciones turísticas en la ciudad de Valencia, con un enfoque particular en museos y monumentos. El objetivo es procesar, limpiar y visualizar estos datos de manera que se eliminen redundancias y se agrupen correctamente los edificios que están representados por múltiples polígonos.

En el ámbito del turismo, la correcta representación de los puntos de interés, como museos y monumentos, es esencial para proporcionar a los visitantes una experiencia enriquecedora. Este trabajo facilita la creación de mapas interactivos y aplicaciones geoespaciales que pueden ser utilizados por turistas, planificadores urbanos y autoridades locales.

Además, este tipo de análisis puede tener un impacto significativo en la gestión del patrimonio cultural, permitiendo a los gestores de museos y monumentos comprender mejor la distribución de los puntos de interés y priorizar acciones de conservación o promoción. En resumen, este trabajo no solo mejora la calidad de los datos disponibles, sino que también tiene el potencial de contribuir a una gestión más efectiva de los recursos turísticos y culturales de la ciudad.

Descripción

Primero se define un área de interés en Valencia mediante un bounding box, el cual se ha especificado manualmente. Usando este área de interés, se consultan los datos de OpenStreetMap para obtener información sobre las atracciones turísticas de la ciudad, en concreto en museos y monumentos. A partir de los datos obtenidos, se extraen los puntos y polígonos correspondientes a las atracciones turísticas.

bbox_valencia <- c(xmin = -0.41, ymin = 39.43, xmax = -0.25, ymax = 39.51)
bbox_valencia <- sf::st_bbox(bbox_valencia, crs = 4326)

turism <- osmdata::opq(bbox = bbox_valencia) %>%
  osmdata::add_osm_feature(key = "tourism", value = c("museum", "monument")) %>%
  osmdata::osmdata_sf()

turism_points <- turism$osm_points
turism_pol <- turism$osm_polygons
leaflet() %>%
  addProviderTiles("CartoDB.Positron") %>%
  addCircleMarkers(data = turism_points, 
                   color = "orange", radius = 3, opacity = 1)

Algunos museos están representados únicamente por puntos y otros, además, por polígonos, que están formados por puntos de los vértices de los edificios. Para solucionar la redundancia de puntos podemos extraer los centroides de los polígonos, que representan el centro de cada uno de los museos.

turism_centroids <- st_centroid(turism_pol)
Warning: st_centroid assumes attributes are constant over geometries
rm(turism_pol)

Una vez que los datos se han extraído, es importante visualizarlos para confirmar que los centroides han representado correctamente cada atracción turística. Usando la librería leaflet, se genera un mapa interactivo en el cual se representan los puntos de las atracciones turísticas, así como los centroides de los edificios representados por polígonos. Los puntos de atracción se muestran con marcadores naranjas, mientras que los centroides se representan con marcadores rojos. Por cada geometría en rojo debería haber un punto naranja

leaflet() %>%
  addProviderTiles("CartoDB.Positron") %>%
  addCircleMarkers(data = turism_points, 
                   color = "orange", radius = 3, opacity = 1) %>%
  addCircleMarkers(data = turism_centroids, 
                   color = "red", radius = 3, opacity = 1)

Se detecta que algunos edificios están compuestos por múltiples polígonos, por lo tanto, hay varios centroides que representan un solo museo. Además, algunos puntos no tenían polígonos asociados en turism_pol, y por lo tanto, se han quedado sin centroides en turism_centroids. Esto implica que no se pueden usar únicamente los centroides a la hora de graficar porque habría museos sin representar, y se deberán extraer de turism_points.

Para solucionar estos problemas, se han aplicado técnicas de filtrado de datos geoespaciales y análisis de agrupación.

Tratamiento

Primero, en cuanto a los puntos, se calculan las distancias entre los puntos de atracciones turísticas utilizando la función st_distance, tras haberse duplicado el objeto pero con el sistema de coordenadas EPSG:3857, que usa las unidades de medida de metros.

Luego, se identifican los puntos “solos”, es decir, aquellos que están a más de 100 metros de cualquier otro punto de atracción turística. Primero, se calcula la matriz de distancias entre todos los puntos de atracciones turísticas. Después, para cada punto, se verifica si existe otro punto a menos de 100 metros de distancia. Esto se hace al revisar todas las distancias en la fila correspondiente a cada punto (sin contar la distancia del punto consigo mismo, que está en la diagonal de la matriz de distancias). Si todas las distancias a otros puntos son mayores a 100 metros, se considera que ese punto está “solo”.

Finalmente, se filtran los puntos que cumplen con esta condición y los almacenamos en turism_points_solos. Estos puntos representan las atracciones turísticas que no tenían un polígono asociado porque no se guardaron con tanta precisión, y que no podríamos haber representado con centroides como el resto.

turism_points_m <- st_transform(turism_points, crs = 3857)
distancias <- st_distance(turism_points_m)

solos <- apply(distancias, 1, function(x) all(x[-which.min(x)] > 100))

turism_points_solos <- turism_points[solos, ]

Segundo, en cuanto a los centroides, se encuentra el probolema de que algunos edificios se componen por diversos polígonos (dos edificios de un mismo museo, patios interiores, etc). Para solucionarlo, se vuelve a realizar un análisis de agrupación utilizando el algoritmo DBSCAN.

Primero, se vuelve a transformar las coordenadas de los centroides de los polígonos de atracciones turísticas al sistema de coordenadas proyectado EPSG: 3857 para realizar cálculos de distancia más precisos en unidades de metros.

Luego, se calcula la distancia entre los centroides utilizando la función st_distance, que devuelve una matriz de distancias entre todos los puntos de los centroides, y se convierte esta matriz.

Con la matriz de distancias, se aplica el algoritmo DBSCAN, un algoritmo de clustering basado en densidad que agrupa puntos según su proximidad, en este caso para agrupar los centroides. El parámetro eps define el radio de búsqueda para los puntos cercanos (1000 metros) y minPts especifica el número mínimo de puntos requeridos para formar un grupo. El resultado de DBSCAN asigna un número de cluster a cada centroide.

Posteriormente, se selecciona solo un punto por grupo con slice(1). Este paso permite obtener un punto representativo para cada grupo de centroides cercanos.

turism_centroids_m <- st_transform(turism_centroids, crs = 3857)

distancias_centroids <- st_distance(turism_centroids_m)
distancias_centroids_matrix <- as.matrix(distancias_centroids)

dbscan_result <- dbscan(distancias_centroids_matrix, eps = 1000, minPts = 1)

turism_centroids$cluster <- dbscan_result$cluster

centroids_unicos <- turism_centroids %>%
  group_by(cluster) %>%
  slice(1) %>%
  ungroup()

Finalmente, se combinan estos puntos representativos con aquellos puntos “solos” anteriores, creando un conjunto final de puntos únicos que representan las atracciones turísticas. Se han seleccionado previamente las columnas geometry y name para que sus dimensiones coincidieran y poder realizar el rbind.

centroids_unicos <- centroids_unicos %>%
  select(geometry, name)

turism_points_solos <- turism_points_solos %>%
  select(geometry, name)

todos_museos <- rbind(turism_points_solos, centroids_unicos)

sum(is.na(todos_museos$name))
[1] 8

Por último, se detecta que faltan los nombres de algunos museos que no fueron registrados en su momento correctamente, los cuales se introducen manualmente buscando en GoogleMaps qué museos se encuentran en cada coordenada correspondiente.

todos_museos[1,1] <- "Exposició: Espai Ferroviari a Marxalenes"
todos_museos[6,1] <- "Set Espai d'Art"
todos_museos[13,1] <- "Museu de Belles Arts de València"
todos_museos[15,1] <- "Museo de las Ciencias"
todos_museos[17,1] <- "Casa Museo Benlliure"
todos_museos[19,1] <- "Museo Palacio del Marqués de Campo"
todos_museos[22,1] <- "Museo del Corpus - Casa de las Rocas"
todos_museos[25,1] <- "Museo Histórico Militar"

Output

El conjunto de datos depurado obtenido contiene puntos representativos de atracciones turísticas sin redundancias, y centroides de atracciones agrupados para representar correctamente los edificios compuestos por múltiples polígonos. Se eliminaron los puntos redundantes, filtrando aquellos que estaban demasiado cerca entre sí, y se agruparon los centroides de edificios representados por varios polígonos utilizando el algoritmo DBSCAN. Esto asegura una representación más precisa y eficiente de las atracciones turísticas, mejorando la calidad de los datos para su uso en análisis, visualizaciones y aplicaciones geoespaciales, facilitando la interpretación y toma de decisiones en el ámbito turístico y urbano.

leaflet() %>%
  addProviderTiles("CartoDB.Positron") %>%
  addCircleMarkers(data = todos_museos, 
                   color = "red", radius = 3, opacity = 1, 
                   label = ~name)

El/los fichero(s) generados con este procedimiento/técnica/metodología se puede(n) descargar de aquí.



Proyectos de Innovación Educativa Emergente PIEE-2737007 y PIEE-3325394