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()
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)))
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)
}
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))
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="")