Analizando recorridos y distancias en la Ciudad

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))
Paso 1: Encontrar los centroides de los Barrios
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()

  • Barrio Céntrico: PALERMO
  • Barrio Periférico: VILLA RIACHUELO
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()

Paso 2: Generar función para ruteo con osrmRoute
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)
  
}
Paso 3: Hacer ruteos del centroide del barrio céntrico a los hospitales
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)
Paso 4: Hacer ruteos del centroide del barrio periférico a los hospitales
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)