# PAÍS: ITALIA
# Obtener la geometría de Italia desde Natural Earth
italia <- ne_countries(country = "Italy", scale = "medium", returnclass = "sf")
# Combinar todas las geometrías de Italia en una sola usando st_union
italia <- st_union(italia)
# Asegurar que los puntos y el polígono tienen el mismo CRS
mort_italia_points <- st_transform(mort_italia_points, crs = st_crs(italia))
vet_italia_points <- st_transform(vet_italia_points, crs = st_crs(italia))
prison_italia_points <- st_transform(prison_italia_points, crs = st_crs(italia))
# Filtrar solo los puntos dentro de Italia
mort_italia_points <- mort_italia_points[st_intersects(mort_italia_points, italia, sparse = FALSE), ]
vet_italia_points <- vet_italia_points[st_intersects(vet_italia_points, italia, sparse = FALSE), ]
prison_italia_points <- prison_italia_points[st_intersects(prison_italia_points, italia, sparse = FALSE), ]
# REGIÓN: LACIO
italy_regions <- ne_states(country = "Italy", returnclass = "sf")
lazio <- italy_regions %>%
filter(region == "Lazio")
lazio <- st_union(lazio)
mort_lacio_points <- st_transform(mort_lacio_points, crs = st_crs(lazio))
vet_lacio_points <- st_transform(vet_lacio_points, crs = st_crs(lazio))
prison_lacio_points <- st_transform(prison_lacio_points, crs = st_crs(lazio))
mort_lacio_points <- mort_lacio_points[st_intersects(mort_lacio_points, lazio, sparse = FALSE), ]
vet_lacio_points <- vet_lacio_points[st_intersects(vet_lacio_points, lazio, sparse = FALSE), ]
prison_lacio_points <- prison_lacio_points[st_intersects(prison_lacio_points, lazio, sparse = FALSE), ]
# PROVINCIA: ROMA
roma <- italy_regions %>%
filter(gn_name == "Provincia di Roma")
roma <- st_union(roma)
mort_roma_points <- st_transform(mort_roma_points, crs = st_crs(roma))
vet_roma_points <- st_transform(vet_roma_points, crs = st_crs(roma))
prison_roma_points <- st_transform(prison_roma_points, crs = st_crs(roma))
mort_roma_points <- mort_roma_points[st_intersects(mort_roma_points, roma, sparse = FALSE), ]
vet_roma_points <- vet_roma_points[st_intersects(vet_roma_points, roma, sparse = FALSE), ]
prison_roma_points <- prison_roma_points[st_intersects(prison_roma_points, roma, sparse = FALSE), ]
# MUNICIPIO: MUNICIPIO I
# Definir el municipio de interés
municipio_nombre <- "Municipio Roma I"
# Obtener el polígono del municipio desde OpenStreetMap
municipio <- opq("Rome, Italy") %>%
add_osm_feature(key = "name", value = municipio_nombre) %>%
osmdata_sf()
# Extraer la geometría del municipio
municipio_sf <- municipio$osm_multipolygons
# Filtrar puntos dentro del municipio
mort_municipio <- mort_m1_points[st_intersects(mort_m1_points, municipio_sf, sparse = FALSE), ]
vet_municipio <- vet_m1_points[st_intersects(vet_m1_points, municipio_sf, sparse = FALSE), ]
prison_municipio <- prison_m1_points[st_intersects(prison_m1_points, municipio_sf, sparse = FALSE), ]
Datos sobre Italia
Input
Se ha obtenido un conjunto de datos sobre los veterinarios, prisiones y morgues para Italia, la región de Lacio, Roma y Municipio I, con las coordenadas de cada establecimiento para cada territorio. La fuente de estos datos es OpenStreetMap, accedidos a través de la librería osmdata en R.
Enlace a la fuente:
Descripción
Al representar gráficamente los conjuntos de datos originales, se identificaron dos problemas principales:
Puntos fuera del área seleccionada: Algunos establecimientos se encuentran geolocalizados fuera del territorio de interés.
Agrupación excesiva de puntos: Varios puntos representan el área de un mismo establecimiento, generando redundancia.
Tratamiento
Para mejorar la calidad del conjunto de datos, se aplicaron las siguientes metodologías en R:
Eliminación de puntos fuera del área seleccionada
Se obtuvo la geometría de cada territorio con la librería
rnaturalearth
. Sin embargo, para el caso de Municipio I no funcionaba debido a que es una zona mucho más pequeña que el resto. Por lo tanto, para ese caso usaremosOpenStreetMaps
.Para obtener el contorno de cada lugar como conjunto, usaremos la función
st_union
de la libreríasf
.Posteriormente, aseguramos que coincidan los sistemas de coordenadas (CRS) mediante
st_transform
.Finalmente, se filtraron los puntos dentro del territorio seleccionado utilizando
st_intersects()
.
- Reducción de redundancia en la geolocalización
Se utilizó la librería dbscan
para identificar agrupaciones espaciales en los datos.
Aplicación de DBSCAN: Se ejecutó el algoritmo con un radio de vecindad (eps = 0.001) y un mínimo de un punto por clúster (minPts = 1), lo que permitió detectar agrupaciones densas de establecimientos.
Extracción de puntos representativos: Una vez identificados los clústeres, se seleccionó un único punto representativo por agrupación, reduciendo la redundancia y mejorando la visualización de los datos.
Automatización del proceso: Se diseñó una función para aplicar estos pasos a cada conjunto de datos, optimizando el flujo de trabajo y garantizando coherencia en el tratamiento de todas las regiones analizadas.
# PROCESO PARA OBTENER SOLO LOS PUNTOS REPRESENTATIVOS
# Lista de dataframes
list_dataframes <- list(mort_italia_points, vet_italia_points, prison_italia_points,
mort_lacio_points, vet_lacio_points, prison_lacio_points,
mort_roma_points, vet_roma_points, prison_roma_points,
mort_m1_points, vet_m1_points, prison_m1_points)
# Función para aplicar DBSCAN y obtener puntos representativos
procesar_dataframe <- function(sf_points) {
sf_points <- aplicar_dbscan_sf(sf_points, eps = 0.001, minPts = 1)
sf_points <- obtener_punto_representativo(sf_points)
return(sf_points)
}
# Aplicar la función a cada dataframe
resultados <- lapply(list_dataframes, procesar_dataframe)
# Asignar los resultados a las variables originales
mort_italia_points <- resultados[[1]]
vet_italia_points <- resultados[[2]]
prison_italia_points <- resultados[[3]]
mort_lacio_points <- resultados[[4]]
vet_lacio_points <- resultados[[5]]
prison_lacio_points <- resultados[[6]]
mort_roma_points <- resultados[[7]]
vet_roma_points <- resultados[[8]]
prison_roma_points <- resultados[[9]]
mort_m1_points <- resultados[[10]]
vet_m1_points <- resultados[[11]]
prison_m1_points <- resultados[[12]]
Output
Como resultado, se han obtenido cuatro archivos GeoPackage (.gpkg) con los datos limpios y optimizados para los cuatro territorios de estudio.
Los ficheros generados con estos procedimientos se puede descargar aquí.
Proyectos de Innovación Educativa Emergente PIEE-2737007 y PIEE-3325394