A continuación se mostrará un ejemplo de aplicación del servicio de ruteo de “OSRM”. El objetivo será detectar las distancias desde el centroide de un barrio céntrico y el de uno periférico de la Ciudad hasta los hospitales.
El primer paso es cargar las librerías necesarias: “tidyverse”, “sf”, “osrm” y “leaflet”.
library(tidyverse)
library(sf)
library(osrm)
library(leaflet)
Luego es necesario cargar los dataset seleccionados. En este caso, se utilizarán los barrios y los hospitales de CABA disponibles en el Portal de Datos Abiertos.
barrios <- st_read("http://cdn.buenosaires.gob.ar/datosabiertos/datasets/barrios/barrios.geojson")
hospitales <- read.csv("http://cdn.buenosaires.gob.ar/datosabiertos/datasets/hospitales/hospitales.csv",
encoding="UTF-8") %>%
mutate(nombre=as.character(nombre))
barrios_centroides <- barrios %>%
st_centroid()
ggplot()+
geom_sf(data=barrios, fill="lightyellow")+
geom_sf(data=barrios_centroides, size=2)+
labs(title = "Barrios de la Ciudad",
subtitle = "Ubicación de los centroides",
fill="Barrios",
caption= "Fuente:https://data.buenosaires.gob.ar/")+
theme_void()
barrios_centroides <- barrios_centroides %>%
filter(barrio=="PALERMO" | barrio=="VILLA RIACHUELO") %>%
mutate(ubicacion=if_else(barrio=="PALERMO", "CENTRO", "PERIFERIA"))
Genero los puntos X e Y del centroide:
barrios_centroides <- cbind(barrios_centroides, st_coordinates(barrios_centroides)) %>%
st_set_geometry(NULL)
ggplot()+
geom_sf(data=barrios, fill="lightyellow")+
geom_point(data=barrios_centroides, aes(x=X, y=Y, color=ubicacion), size=4)+
geom_point(data=hospitales, aes(x=long, y=lat), color="salmon4")+
labs(title = "Barrios de la Ciudad",
subtitle = "Ubicación de los centroides",
color="Barrios",
caption= "Fuente:https://data.buenosaires.gob.ar/")+
theme_void()
ruteo_a_hospitales <- function(o_nombre, o_x, o_y, d_nombre, d_x, d_y) {
ruta <- osrmRoute(src = c(o_nombre, o_x, o_y),
dst = c(d_nombre, d_x, d_y),
returnclass = "sf",
overview = "full")
cbind(ORIGEN = o_nombre, DESTINO = d_nombre, ruta)
}
hospitales_palermo <- hospitales %>%
mutate(ORIGEN="PALERMO") %>%
left_join(barrios_centroides, by=c("ORIGEN"="barrio")) %>%
rename(NOMBRE_ORIGEN=ORIGEN,
LON_ORIGEN=X,
LAT_ORIGEN=Y,
NOMBRE_DESTINO=nombre,
LON_DESTINO=long,
LAT_DESTINO=lat) %>%
select(NOMBRE_ORIGEN, LON_ORIGEN, LAT_ORIGEN, NOMBRE_DESTINO, LON_DESTINO, LAT_DESTINO)
ruteo_palermo <- list(hospitales_palermo$NOMBRE_ORIGEN, hospitales_palermo$LON_ORIGEN,hospitales_palermo$LAT_ORIGEN,
hospitales_palermo$NOMBRE_DESTINO, hospitales_palermo$LON_DESTINO,hospitales_palermo$LAT_DESTINO)
ruteo_centrico <- pmap(ruteo_palermo, ruteo_a_hospitales) %>%
reduce(rbind)
ruteo_centrico <-mutate(ruteo_centrico, RUTA = paste(ORIGEN,"a", DESTINO))
¿Cuál es el Hospital más cercano a Palermo? ¿Y a qué distancia se encuentra?
filter(ruteo_centrico, distance == min(distance))
## Simple feature collection with 1 feature and 7 fields
## geometry type: LINESTRING
## dimension: XY
## bbox: xmin: -58.42444 ymin: -34.58318 xmax: -58.40624 ymax: -34.57398
## epsg (SRID): 4326
## proj4string: +proj=longlat +datum=WGS84 +no_defs
## ORIGEN DESTINO src
## 1 PALERMO HOSPITAL GENERAL DE AGUDOS DR. J. A. FERNANDEZ PALERMO
## dst duration distance
## 1 HOSPITAL GENERAL DE AGUDOS DR. J. A. FERNANDEZ 11.49167 2.8155
## geometry
## 1 LINESTRING (-58.42253 -34.5...
## RUTA
## 1 PALERMO a HOSPITAL GENERAL DE AGUDOS DR. J. A. FERNANDEZ
El más cercano a Palermo es el HOSPITAL GENERAL DE AGUDOS DR. J. A. FERNANDEZ, que se encuentra a 2,81km y la duración del viaje estimada es de 11,5 minutos.
leaflet(ruteo_centrico) %>%
addTiles() %>%
addProviderTiles(providers$CartoDB.DarkMatter) %>%
addPolylines(color = ~colorNumeric("BrBG", ruteo_centrico$distance)(distance),
label = ruteo_centrico$RUTA %>%
lapply(htmltools::HTML)) %>%
addLegend("bottomright", pal = colorNumeric("BrBG", ruteo_centrico$distance), values = ~distance,
title = "Distancia",
opacity = 0.55)
hospitales_vriachuelo <- hospitales %>%
mutate(ORIGEN="VILLA RIACHUELO") %>%
left_join(barrios_centroides, by=c("ORIGEN"="barrio")) %>%
rename(NOMBRE_ORIGEN=ORIGEN,
LON_ORIGEN=X,
LAT_ORIGEN=Y,
NOMBRE_DESTINO=nombre,
LON_DESTINO=long,
LAT_DESTINO=lat) %>%
select(NOMBRE_ORIGEN, LON_ORIGEN, LAT_ORIGEN, NOMBRE_DESTINO, LON_DESTINO, LAT_DESTINO)
ruteo_vriachuelo <- list(hospitales_vriachuelo$NOMBRE_ORIGEN, hospitales_vriachuelo$LON_ORIGEN,hospitales_vriachuelo$LAT_ORIGEN,
hospitales_vriachuelo$NOMBRE_DESTINO, hospitales_vriachuelo$LON_DESTINO,hospitales_vriachuelo$LAT_DESTINO)
ruteo_periferico <- pmap(ruteo_vriachuelo, ruteo_a_hospitales) %>%
reduce(rbind)
ruteo_periferico <-mutate(ruteo_periferico, RUTA = paste(ORIGEN,"a", DESTINO))
¿Cuál es el Hospital más cercano a Villa Riachuelo? ¿Y a qué distancia se encuentra?
filter(ruteo_periferico, distance == min(distance))
## Simple feature collection with 1 feature and 7 fields
## geometry type: LINESTRING
## dimension: XY
## bbox: xmin: -58.46538 ymin: -34.69378 xmax: -58.44957 ymax: -34.67049
## epsg (SRID): 4326
## proj4string: +proj=longlat +datum=WGS84 +no_defs
## ORIGEN DESTINO src
## 1 VILLA RIACHUELO HOSPITAL CECILIA GRIERSON VILLA RIACHUELO
## dst duration distance
## 1 HOSPITAL CECILIA GRIERSON 10.98167 4.1818
## geometry
## 1 LINESTRING (-58.46335 -34.6...
## RUTA
## 1 VILLA RIACHUELO a HOSPITAL CECILIA GRIERSON
El más cercano a Villa Riachuelo es el HOSPITAL CECILIA GRIERSON, que se encuentra a 4,18km y la duración del viaje estimada es de 11 minutos.
leaflet(ruteo_periferico) %>%
addTiles() %>%
addProviderTiles(providers$CartoDB.DarkMatter) %>%
addPolylines(color = ~colorNumeric("BrBG", ruteo_periferico$distance)(distance),
label = ruteo_periferico$RUTA %>%
lapply(htmltools::HTML)) %>%
addLegend("bottomright", pal = colorNumeric("BrBG", ruteo_periferico$distance), values = ~distance,
title = "Distancia",
opacity = 0.55)