Ciudad de Córdoba
Genero y verifico los bounding boxes:
bbox<-getbb("Córdoba, Municipio de Córdoba, Pedanía Capital, Departamento Capital, Córdoba, X5000, Argentina")
bbox_poly<-getbb("Córdoba, Municipio de Córdoba, Pedanía Capital, Departamento Capital, Córdoba, X5000, Argentina",format_out = "sf_polygon")
bbox
## min max
## x -64.31010 -64.05725
## y -31.52513 -31.30752
Descargo calles de OSM:
cordoba<-opq(bbox_poly) %>%
add_osm_feature(key="highway") %>%
osmdata_sf()
calles<-cordoba$osm_lines %>%
st_intersection(bbox_poly)
Descargo edificios esenciales de OSM:
osm_school<-opq(bbox_poly) %>%
add_osm_feature(key="amenity",value="school") %>%
osmdata_sf()
osm_college<-opq(bbox_poly) %>%
add_osm_feature(key="amenity",value="college") %>%
osmdata_sf()
osm_university<-opq(bbox_poly) %>%
add_osm_feature(key="amenity",value="university") %>%
osmdata_sf()
osm_clinic<-opq(bbox_poly) %>%
add_osm_feature(key="amenity",value="clinic") %>%
osmdata_sf()
osm_hospital<-opq(bbox_poly) %>%
add_osm_feature(key="amenity",value="hospital") %>%
osmdata_sf()
osm_police<-opq(bbox_poly) %>%
add_osm_feature(key="amenity",value="police") %>%
osmdata_sf()
osm_bank<-opq(bbox_poly) %>%
add_osm_feature(key="amenity",value="bank") %>%
osmdata_sf()
osm_supermarket<-opq(bbox_poly) %>%
add_osm_feature(key="shop",value="supermarket") %>%
osmdata_sf()
Los convierto a “SF” recortandolos con los boundingboxes:
osm_school<-st_intersection(osm_school$osm_points,bbox_poly) %>%
select(osm_id,geometry)
osm_college<-st_intersection(osm_college$osm_points,bbox_poly) %>%
select(osm_id,geometry)
osm_university<-st_intersection(osm_university$osm_points,bbox_poly) %>%
select(osm_id,geometry)
osm_clinic<-st_intersection(osm_clinic$osm_points,bbox_poly) %>%
select(osm_id,geometry)
osm_hospital<-st_intersection(osm_hospital$osm_points,bbox_poly) %>%
select(osm_id,geometry)
osm_police<-st_intersection(osm_police$osm_points,bbox_poly) %>%
select(osm_id,geometry)
osm_bank<-st_intersection(osm_bank$osm_points,bbox_poly) %>%
select(osm_id,geometry)
osm_supermarket<-st_intersection(osm_supermarket$osm_points,bbox_poly) %>%
select(osm_id,geometry)
Combino todas las categorias en un solo data frame:
esenciales<-mutate(osm_school,tipo="school") %>%
rbind(mutate(osm_college,tipo="college")) %>%
rbind(mutate(osm_university,tipo="university")) %>%
rbind(mutate(osm_clinic,tipo="clinic")) %>%
rbind(mutate(osm_hospital,tipo="hospital")) %>%
rbind(mutate(osm_police,tipo="police")) %>%
rbind(mutate(osm_bank,tipo="bank")) %>%
rbind(mutate(osm_supermarket,tipo="supermarket"))
Convierto los datos espaciales a un data frame comun con coordenadas y descargo mapa base:
esenciales_nogeo<-esenciales %>%
mutate(lon=unlist(map(esenciales$geometry,1))) %>%
mutate(lat=unlist(map(esenciales$geometry,2))) %>%
st_set_geometry(NULL)
mapa<-get_stamenmap(bbox,maptype = "toner-background",zoom=11)
Genero mapa de densidad para verificar datos por categorias:
ggmap(mapa)+
geom_density2d(data=esenciales_nogeo,aes(x=lon,y=lat,color=stat(level)))+
scale_colour_viridis_c()+
facet_wrap(~tipo,nrow = 2)+
theme(axis.text=element_blank(),
axis.ticks = element_blank(),
axis.title=element_blank())+
labs(title="Equipamientos esenciales Ciudad de Cordoba",
subtitle ="Mapas de densidad por categorias",
color="Densidad de establecimientos",
caption ="Datos de Open Street Map.
Mapa base: D. Kahle and H. Wickham.
ggmap: Spatial Visualization with ggplot2.
The RJournal, 5(1), 144-161.
URL http://journal.r-project.org/archive/2013-1/kahle-wickham.pdf")
Genero mapa de puntos para verificar los barrios con menor densidad de servicios esenciales:
esenciales_geo<-st_as_sf(esenciales_nogeo,coords=c("lon","lat"),crs=4326)
barrios<-st_read("Barrio.shp")
## Reading layer `Barrio' from data source `/Users/santiago/Google Drive/DRIVE MEU/- CIENCIA DE DATOS 2/Barrio.shp' using driver `ESRI Shapefile'
## replacing null geometries with empty geometries
## Simple feature collection with 503 features and 4 fields (with 1 geometry empty)
## geometry type: GEOMETRY
## dimension: XY
## bbox: xmin: 4375309 ymin: 6512169 xmax: 4399439 ymax: 6536199
## proj4string: +proj=tmerc +lat_0=-90 +lon_0=-63 +k=1 +x_0=4500000 +y_0=0 +datum=WGS84 +units=m +no_defs
ggplot()+
geom_sf(data=calles,size=.07,color="gray35")+
geom_sf(data=barrios,size=.1,fill=NA,color="red")+
geom_sf(data=esenciales_geo,alpha=.25,aes(color=tipo))+
scale_color_viridis_d()+
labs(title="Equipamientos esenciales Ciudad de Cordoba",
subtitle ="Mapas de distribución por categorias",
color="Categoria de establecimientos",
caption ="Datos de Open Street Map.
Mapa base: D. Kahle and H. Wickham.
ggmap: Spatial Visualization with ggplot2.
The RJournal, 5(1), 144-161.
URL http://journal.r-project.org/archive/2013-1/kahle-wickham.pdf")
Realizo una union espacial para obtener un data frame con los datos de servicios esenciales por barrio y verifico la distribucion en un histograma:
barrios<-st_transform(barrios,crs=4326)
barrios_features<-st_join(barrios,esenciales_geo)
barrios_features_agrup<-barrios_features %>%
filter(!is.na(tipo)) %>%
group_by(Nombre,tipo) %>%
summarise(conteo=n()) %>%
st_set_geometry(NULL)
ggplot(barrios_features_agrup) +
geom_histogram(aes(x=conteo))+
facet_wrap(~tipo)+
labs(title="Equipamientos esenciales Ciudad de Cordoba",
subtitle ="Histogramas de distribución por categorias",
x="Cantidad por barrio",
y="Conteo",
caption ="Datos de Open Street Map")
barrios_features_agrup_total<-as.data.frame(barrios_features_agrup) %>%
select(Nombre,tipo,conteo) %>%
group_by(Nombre) %>%
summarise(totalbarrio=sum(as.numeric(conteo)))
barrios_total<-left_join(barrios,barrios_features_agrup_total,by="Nombre")
Defino los origenes - detino en base a los centroides de cada categoria de servicio esencial y los centroides de los 2 barrios elegidos:
#Hallo el centroide de los barrios
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
#Hallo el centroide del conjunto de puntos por categoria
esenciales_centroides<-esenciales_nogeo %>%
group_by(tipo) %>%
summarise(lon=mean(lon),lat=mean(lat))
ggplot()+
geom_sf(data=calles,size=.05,color="gray35")+
geom_sf(data=filter(barrios_total,Nombre=="JUAN B. JUSTO"|Nombre=="NUEVA CORDOBA"),aes(fill=Nombre))+
geom_point(data=esenciales_centroides,aes(x=lon,y=lat,color=tipo))+
scale_color_viridis_d()+
labs(title="Equipamientos esenciales Ciudad de Cordoba",
subtitle ="Centroides de categorias",
fill="Barrios",
color="Centroides",
caption ="Datos de Open Street Map")+
theme(axis.text=element_blank(),
axis.ticks = element_blank(),
axis.title=element_blank())
Asigno categoria “PERIFERIA” / “CENTRO” para facilitar ruteo:
barrios_centroides<-barrios_centroides %>%
filter(Nombre=="JUAN B. JUSTO"|Nombre=="NUEVA CORDOBA") %>%
mutate(ubicacion=if_else(Nombre=="JUAN B. JUSTO","PERIFERIA","CENTRO"))
Obtengo los centroides de barrios elegidos:
barrios_centroides<-cbind(barrios_centroides,st_coordinates(barrios_centroides)) %>%
st_set_geometry(NULL)
#RUTEOS A CENTROIDES
Genero la funcion para obtener los recorridos:
obtener_recorrido <- 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)}
Genero las rutas desde el Centro:
viajes_desde_centro <- esenciales_centroides %>%
mutate(ORIGEN="CENTRO") %>%
left_join(barrios_centroides, by=c("ORIGEN"="ubicacion")) %>%
rename(NOMBRE_ORIGEN=ORIGEN,
LON_ORIGEN=X,
LAT_ORIGEN=Y,
NOMBRE_DESTINO=tipo,
LON_DESTINO=lon,
LAT_DESTINO=lat) %>%
select(NOMBRE_ORIGEN, LON_ORIGEN, LAT_ORIGEN, NOMBRE_DESTINO, LON_DESTINO, LAT_DESTINO)
argumento <- list(viajes_desde_centro$NOMBRE_ORIGEN, viajes_desde_centro$LON_ORIGEN,viajes_desde_centro$LAT_ORIGEN,
viajes_desde_centro$NOMBRE_DESTINO, viajes_desde_centro$LON_DESTINO,viajes_desde_centro$LAT_DESTINO)
recorrido_centro <- pmap(argumento, obtener_recorrido) %>%
reduce(rbind)
recorrido_centro <-mutate(recorrido_centro, RUTA = paste(ORIGEN,"a", DESTINO))
Verifico los resultados en un mapa interactivo:
leaflet(recorrido_centro) %>%
addTiles() %>%
addProviderTiles(providers$CartoDB.DarkMatter) %>%
addPolylines(color = ~colorNumeric("BrBG", recorrido_centro$distance)(distance),
label = recorrido_centro$RUTA %>%
lapply(htmltools::HTML)) %>%
addLegend("bottomright", pal = colorNumeric("BrBG", recorrido_centro$distance), values = ~distance,
title = "Distancia",
opacity = 0.55)
Genero rutas desde barrio periferico:
viajes_desde_periferia <- esenciales_centroides %>%
mutate(ORIGEN="PERIFERIA") %>%
left_join(barrios_centroides, by=c("ORIGEN"="ubicacion")) %>%
rename(NOMBRE_ORIGEN=ORIGEN,
LON_ORIGEN=X,
LAT_ORIGEN=Y,
NOMBRE_DESTINO=tipo,
LON_DESTINO=lon,
LAT_DESTINO=lat) %>%
select(NOMBRE_ORIGEN, LON_ORIGEN, LAT_ORIGEN, NOMBRE_DESTINO, LON_DESTINO, LAT_DESTINO)
argumento <- list(viajes_desde_periferia$NOMBRE_ORIGEN, viajes_desde_periferia$LON_ORIGEN,viajes_desde_periferia$LAT_ORIGEN,
viajes_desde_periferia$NOMBRE_DESTINO, viajes_desde_periferia$LON_DESTINO,viajes_desde_periferia$LAT_DESTINO)
recorrido_periferia <- pmap(argumento, obtener_recorrido) %>%
reduce(rbind)
recorrido_periferia <-mutate(recorrido_periferia, RUTA = paste(ORIGEN,"a", DESTINO))
Verifico en mapa:
leaflet(recorrido_periferia) %>%
addTiles() %>%
addProviderTiles(providers$CartoDB.DarkMatter) %>%
addPolylines(color = ~colorNumeric("BrBG", recorrido_periferia$distance)(distance),
label = recorrido_periferia$RUTA %>%
lapply(htmltools::HTML)) %>%
addLegend("bottomright", pal = colorNumeric("BrBG", recorrido_periferia$distance), values = ~distance,
title = "Distancia",
opacity = 0.55)
Analizo los resultados:
recorridos<-recorrido_centro %>%
rbind(recorrido_periferia)
resumen<-as.data.frame(recorridos) %>%
select(ORIGEN,DESTINO,duration) %>%
spread(ORIGEN,duration)
resumen
## DESTINO CENTRO PERIFERIA
## 1 bank 10.573333 18.95167
## 2 clinic 11.058333 19.43667
## 3 college 25.918333 15.80000
## 4 hospital 6.273333 23.76833
## 5 police 12.393333 17.71833
## 6 school 17.443333 15.14833
## 7 supermarket 14.211667 19.42333
## 8 university 14.713333 19.92500
ggplot(as.data.frame(recorridos)) +
geom_boxplot(aes(x=duration,y=ORIGEN))+
labs(title="Comparacion duracion de viajes",
subtitle ="Barrios centro y periferia",
x="DURACION",
y="ORIGEN")
Los resultados muestran una un mayor tiempo de viaje promedio desde la periferia hasta los centroides de los conjunto de edificios esenciales, aunque con la presencia de ouliers. La razon es la aglomeracion de servicios en barrios perifericos de alto valor adquisitivo que desvian el centroide pero no representan la situacion de los barrios perifericos mas pobres.