Análisis de Flujos urbanos

Belén Butler & Julia Gerlo

Mayo 2020

Analizando recorridos y distancias en la Ciudad de Rosario

###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.

library(tidyverse)
## -- Attaching packages --------------------- tidyverse 1.3.0 --
## v ggplot2 3.3.0     v purrr   0.3.4
## v tibble  3.0.1     v dplyr   0.8.5
## v tidyr   1.0.2     v stringr 1.4.0
## v readr   1.3.1     v forcats 0.5.0
## -- Conflicts ------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
library(sf)
## Linking to GEOS 3.8.0, GDAL 3.0.4, PROJ 6.3.1
library(osmdata)
## Data (c) OpenStreetMap contributors, ODbL 1.0. https://www.openstreetmap.org/copyright
library(osrm)
## Data: (c) OpenStreetMap contributors, ODbL 1.0 - http://www.openstreetmap.org/copyright
## Routing: OSRM - http://project-osrm.org/
library(leaflet)
library(lwgeom)
## Linking to liblwgeom 3.0.0beta1 r16016, GEOS 3.6.1, PROJ 4.9.3
## Warning in fun(libname, pkgname): GEOS versions differ: lwgeom has 3.6.1 sf has
## 3.8.0
## Warning in fun(libname, pkgname): PROJ versions differ: lwgeom has 4.9.3 sf has
## 6.3.1

###Luego es necesario cargar los dataset seleccionados.

barrios <- st_read('https://datos.rosario.gob.ar/sites/default/files/barrios.gml')
## Reading layer `barrios' from data source `https://datos.rosario.gob.ar/sites/default/files/barrios.gml' using driver `GML'
## Simple feature collection with 50 features and 4 fields
## geometry type:  POLYGON
## dimension:      XY
## bbox:           xmin: -60.79693 ymin: -33.03934 xmax: -60.61278 ymax: -32.86941
## geographic CRS: WGS 84
hospitales_rosario <- st_read("https://datos.rosario.gob.ar/sites/default/files/geo_salud.gml")
## Reading layer `OGRGeoJSON' from data source `https://datos.rosario.gob.ar/sites/default/files/geo_salud.gml' using driver `GML'
## Simple feature collection with 67 features and 23 fields
## geometry type:  POINT
## dimension:      XY
## bbox:           xmin: -60.76006 ymin: -33.02803 xmax: -60.61493 ymax: -32.88314
## geographic CRS: WGS 84

###Encontramos los centroides de los barrios de la ciudad de Rosario.

barrios_centroides <- barrios %>%
  st_centroid()
## Warning in st_centroid.sf(.): st_centroid assumes attributes are constant over
## geometries of x
## Warning in st_centroid.sfc(st_geometry(x), of_largest_polygon =
## of_largest_polygon): st_centroid does not give correct centroids for longitude/
## latitude data
ggplot()+
  geom_sf(data=barrios, fill="lightyellow")+
  geom_sf(data=barrios_centroides, color="red", shape=4, stroke=2, size=0.5)+
  labs(title = "Barrios de la Ciudad de Rosario",
         subtitle = "Ubicación de los centroides",
         fill="Barrios",
         caption= "Fuente:https://datos.rosario.gob.ar/")+
  theme_void()

Seleccionamos:

Barrio Céntrico: Centro Barrio Periférico: Las Flores

barrios_centroides <- barrios_centroides %>%
  filter(BARRIO=="Centro" | BARRIO=="Las Flores")
barrios_centroides <- cbind(barrios_centroides, st_coordinates(barrios_centroides)) %>%
                      st_set_geometry(NULL)
hospitales_rosario <- hospitales_rosario %>%
mutate(long = unlist(map(hospitales_rosario$geometry,1)),
lat = unlist(map(hospitales_rosario$geometry,2)))

Mapeamos los centroides del barrio Centro y barrio Las Flores de la ciudad de Rosario junto con los hospitales y centros de salud de la ciudad.

ggplot()+
  geom_sf(data=barrios, fill="lightyellow") + geom_point(data=barrios_centroides, aes(x=X, y=Y), size=4, color = "blue")+ geom_point(data=hospitales_rosario, aes(x=long, y=lat), color="lightblue")+
  labs(title = "Barrios de la Ciudad de Rosario",
         subtitle = "Ubicación de los centroides",
         color="Barrios",
         caption= "Fuente:https://datos.rosario.gob.ar/")+
  theme_void()

###Generamos 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)
  
}

Hacemos ruteo del centroide del Barrio centro a los hospitales

hospitales_centro <- hospitales_rosario %>%
  mutate(ORIGEN="Centro") %>%
  left_join(barrios_centroides, by=c("ORIGEN"="BARRIO"))
## Warning: Column `ORIGEN`/`BARRIO` joining character vector and factor, coercing
## into character vector
hospitales_centro_2  <- hospitales_centro  %>%
  rename(NOMBRE_ORIGEN=ORIGEN,
         LON_ORIGEN=X,
         LAT_ORIGEN=Y,
         NOMBRE_DESTINO=name,
         LON_DESTINO=long,
         LAT_DESTINO=lat) %>%
  select(NOMBRE_ORIGEN, LON_ORIGEN, LAT_ORIGEN, NOMBRE_DESTINO, LON_DESTINO, LAT_DESTINO)
ruteo_centro <- list(hospitales_centro_2$NOMBRE_ORIGEN, hospitales_centro_2$LON_ORIGEN,hospitales_centro_2$LAT_ORIGEN,
                   hospitales_centro_2$NOMBRE_DESTINO, hospitales_centro_2$LON_DESTINO,hospitales_centro_2$LAT_DESTINO)
ruteo_centrico <- pmap(ruteo_centro, ruteo_a_hospitales) %>% 
  reduce(rbind)
ruteo_centrico <-mutate(ruteo_centrico, RUTA = paste(ORIGEN,"a", DESTINO)) 

¿Cuál es el Hospital más cercano a Centro? ¿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: -60.65222 ymin: -32.95177 xmax: -60.64492 ymax: -32.94608
## geographic CRS: WGS 84
##   ORIGEN                  DESTINO    src dst duration distance
## 1 Centro Centro de Salud "Martin" Centro  21    4.845   1.3468
##                         geometry                              RUTA
## 1 LINESTRING (-60.64492 -32.9... Centro a Centro de Salud "Martin"

###El hospital más cercano a barrio centro es el Centro de Salud “Martin” que se encuentra a 1.34 km y la duración del viaje estimada es de 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)

###Hacemos ruteo del centroide del barrio periférico Las Flores a los hospitales

hospitales_flores <- hospitales_rosario %>%
  mutate(ORIGEN="Las Flores") %>%
  left_join(barrios_centroides, by=c("ORIGEN"="BARRIO")) %>%
  rename(NOMBRE_ORIGEN=ORIGEN,
         LON_ORIGEN=X,
         LAT_ORIGEN=Y,
         NOMBRE_DESTINO=name,
         LON_DESTINO=long,
         LAT_DESTINO=lat) %>%
  select(NOMBRE_ORIGEN, LON_ORIGEN, LAT_ORIGEN, NOMBRE_DESTINO, LON_DESTINO, LAT_DESTINO)
## Warning: Column `ORIGEN`/`BARRIO` joining character vector and factor, coercing
## into character vector
ruteo_flores <- list(hospitales_flores$NOMBRE_ORIGEN, hospitales_flores$LON_ORIGEN,hospitales_flores$LAT_ORIGEN,
                   hospitales_flores$NOMBRE_DESTINO, hospitales_flores$LON_DESTINO,hospitales_flores$LAT_DESTINO)
ruteo_periferico <- pmap(ruteo_flores, ruteo_a_hospitales) %>% 
  reduce(rbind)

###¿Cuál es el Hospital más cercano a Las Flores? ¿Y a qué distancia se encuentra?

filter(ruteo_periferico, distance == min(distance))
## Simple feature collection with 1 feature and 6 fields
## geometry type:  LINESTRING
## dimension:      XY
## bbox:           xmin: -60.66049 ymin: -33.01878 xmax: -60.65767 ymax: -33.0185
## geographic CRS: WGS 84
##       ORIGEN                      DESTINO        src dst duration distance
## 1 Las Flores Centro de Salud "Las Flores" Las Flores  17 1.066667   0.3026
##                         geometry
## 1 LINESTRING (-60.65767 -33.0...

###El más cercano a a Las Flores es el Centro de Salud “Las Flores”, que se encuentra a 300 metros y la duración del viaje estimada es de 1 minuto.

ruteo_periferico <-mutate(ruteo_periferico, RUTA = paste(ORIGEN,"a", DESTINO)) 
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)

###Por último presentamos dos mapas con la distancia de cada uno de los centroides a los hospitales de la ciudad de Rosario

hospitales_barrios<- st_join(hospitales_rosario, barrios)
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
## although coordinates are longitude/latitude, st_intersects assumes that they are planar
barrios_centro <- barrios %>%
  filter(BARRIO == "Centro")
barrios_flores <- barrios %>%
  filter(BARRIO == "Las Flores")
barrios_flores <- barrios_flores %>%
  st_centroid()
## Warning in st_centroid.sf(.): st_centroid assumes attributes are constant over
## geometries of x
## Warning in st_centroid.sfc(st_geometry(x), of_largest_polygon =
## of_largest_polygon): st_centroid does not give correct centroids for longitude/
## latitude data
barrios_centro <- barrios_centro %>%
  st_centroid()
## Warning in st_centroid.sf(.): st_centroid assumes attributes are constant over
## geometries of x
## Warning in st_centroid.sfc(st_geometry(x), of_largest_polygon =
## of_largest_polygon): st_centroid does not give correct centroids for longitude/
## latitude data
hospitales_barrios_2 <- hospitales_barrios %>%
  mutate(dist_centro = st_distance(hospitales_barrios, barrios_centro))
ggplot()+
  geom_sf(data=barrios, color="gray")+
  geom_sf(data=hospitales_barrios_2, aes(color=as.numeric(dist_centro)))+
   geom_sf(data=barrios_centro, color="blue", shape=4, stroke=2, size=1)+
  scale_color_viridis_c(direction = -1)+
  labs(title="Distancia al Centro",
       subtitle="Hospitales en Rosario",
       color="Distancia",
       x="",
       y="")

hospitales_barrios_3 <- hospitales_barrios %>%
  mutate(dist_flores = st_distance(hospitales_barrios, barrios_flores))
ggplot()+
  geom_sf(data=barrios, color="gray")+
  geom_sf(data=hospitales_barrios_3, aes(color=as.numeric(dist_flores)))+
   geom_sf(data=barrios_flores, color="blue", shape=4, stroke=2, size=1)+
  scale_color_viridis_c(direction = -1)+
  labs(title="Distancia a Barrio La Flores",
       subtitle="Hospitales en Rosario",
       color="Distancia",
       x="",
       y="")