getbb("Sevilla, Spain")
bbox_sevilla <- c(xmin = -6.03, ymin = 37.30, xmax = -5.82, ymax = 37.45)
bbox_sevilla <- st_bbox(bbox_sevilla, crs = 4326)
templos <- bbox_sevilla %>%
opq(timeout = 1000) %>%
add_osm_feature(key = "amenity", value = "place_of_worship") %>%
osmdata_sf()
templos_points <- templos$osm_points
templos_pol <- templos$osm_polygons
templos_centroids <- st_centroid(templos_pol)Datos sobre templos en Sevilla
Input
En este trabajo se ha utilizado un conjunto de datos geoespaciales obtenido de OpenStreetMap con la librería osmdata de R, que recoge información sobre templos en en Sevilla. Para obtener los datos se ha utilizado la etiqueta amenity = place_of_worship.
Este tipo de información resulta útil para analizar la distribución espacial de los templos religiosos dentro de la ciudad, así como para su aplicación en estudios urbanos o proyectos turísticos y culturales. En el caso de Sevilla, se trata de un contexto especialmente interesante, ya que cuenta con una gran concentración de templos y una historia marcada por la convivencia de distintas culturas y religiones. Además, muchos de estos espacios tienen un importante valor patrimonial y atraen cada año a miles de turistas.
El dataset original tenía algunas limitaciones importantes, como la existencia de geometrías mixtas (puntos y polígonos), una gran cantidad de duplicados, ya que un mismo templo aparece representado varias veces y tambien la presencia de valores faltantes en atributos relevantes como el nombre. Por esto, se ha llevada a cabo un proceso de limpieza y mejora para obtener un conjunto de datos más consistente y adecuado para su análisis y visualización.
Descripción
Para empezar, se descargan los datos desde OpenStreetMap utilizando la librería osmdata. Se ha definido un área de estudio correspondiente a la ciudad de Sevilla mediante una bounding box.
A partir de esta consulta, obtuvimos dos tipos de geometrías: puntos (osm_points) y polígonos (osm_polygons), ya que en OpenStreetMap los templos estan representados tanto como ubicaciones puntuales como la forma completa del edificio.
Para trabajar con una misma geometria y tener una visualización mas clara de los datos se transforamrón los polígonos en puntos mediante el cálculo de sus centroides (st_centroid).
leaflet() %>%
addProviderTiles("CartoDB.Positron") %>%
addCircleMarkers(data = templos_points,
color = "orange", radius = 3, opacity = 1) %>%
addCircleMarkers(data = templos_centroids,
color = "red", radius = 3, opacity = 1)Se puede observar que el dataset contiene varias redundancias. La mayoria de templos están representados simultáneamente como puntos y polígonos, lo que genera duplicidades espaciales. Además, se identificaron muchos valores nulos en el atributo name, lo que dificulta la interpretación del dataset.
Tratamiento
Para empezar con el tratamiento juntamos los dos conjuntos de puntos originales y centroides y seleccionamos únicamente las variables relevantes (name y geometry) para simplificar el dataset. Además para poder calcular las distancias reales entre puntos se ha cambiado el sistema de coordenadas a EPSG:3857 lo que nos permite trabajar con metros en lugar de grados.
Una vez preparado el conjunto de datos, se aplicó un clustering DBSCAN (dbscan) con la matriz que contiene las distancias entre los puntos. Este algoritmo agrupa los puntos en función de su proximidad espacial, de manera que aquellos puntos situados a menos de la distancia determinada (en este caso, 1000 metros) se consideran parte del mismo grupo o cluster, es decir que son el mismo templo, lo que nos permite eliminar todas las duplicidades.
Una vez que cada registro estaba asignado a un cluster, se procedió a eliminar los duplicados seleccionando un único elemento representativo de cada grupo. Se seleccionaron solo los registros que tenian información en el campo name, utilizando la funcion (arrange(is.na(name))) para darle prioridad a los valores no nulos, es decir a aquellos que contienen el nombre del templo y no un NA, y así poder obtener un dataset con la información que nos interesa.
Finalmente, se realizo una ulitma limpieza renombrando a los NA’s restantes como “Templo sin nombre” , y se cambió el dataset de nuevo a cordenadas. El resultado final se exportó en formato GeoJSON.
templos_points <- st_transform(templos_points, 3857)
templos_centroids <- st_transform(templos_centroids, 3857)
templos_todos <- rbind(
templos_points %>% select(name, geometry),
templos_centroids %>% select(name, geometry)
)
distancias <- st_distance(templos_todos)
db <- dbscan(as.matrix(distancias), eps = 1000, minPts = 1)
templos_todos$cluster <- db$cluster
templos_limpio <- templos_todos %>%
group_by(cluster) %>%
arrange(is.na(name)) %>%
slice(1) %>%
ungroup() %>%
select(name, geometry)
templos_limpio$name[is.na(templos_limpio$name)] <- "Templo sin nombre"
templos_limpio <- st_transform(templos_limpio, 4326)st_write(templos_limpio, "templos_sevilla.geojson", delete_dsn = TRUE)leaflet(templos_limpio) %>%
addProviderTiles("CartoDB.Positron") %>%
addCircleMarkers(radius = 4, color = "blue", label = ~name)Output
Como resultado se ha obtenido un conjunto de datos limpio, homogéneo y libre de duplicidades con el nombre y cordenadas de los templos en la ciudad de Sevilla. A diferencia del dataset original, el resultado final contiene únicamente una punto por templo sin redundancias derivadas de la existencia de múltiples geometrías para un mismo elemento.
El dataset final está compuesto exclusivamente por geometrías puntuales, lo que facilita su análisis y visualización y contiene información depurada en el atributo name, priorizando registros completos y reduciendo la presencia de NA’s.
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)