Tiempo de traslado

Este es un tutorial de cómo hacer análisis de accesibilidad siguiendo la metodología de Andy Nelson & Rolf de By. Para ver más detalles, se puede consultar el siguiente Github (https://github.com/gip-itc-nl/accessibility_course_bhutan) donde además de un ejemplo, se encuentra una presentación con el desarrollo de la metodología y el código necesario para replicarlo.

En este ejercicio, nos concentraremos en la Accesibilidad de \(lugares\)_\(destino\) en el estado de Hidalgo, los cuales podrían ser hospitales, centros comerciales, oficinas, etc.

Para ello, consideraremos rasters de :

Rasters a utilizar

A continuación mostramos los archivos .tif utilizados, los cuales se pueden encontrar en mi Github (https://github.com/JairEsc/Gob/tree/main/Accesibilidad/Documentacion).

library(raster)
uso_de_suelo=raster("Inputs/uso_de_suelo_friccion.tif")
pendiente=raster("Inputs/pendiente.tif")
carreteras=raster("Inputs/carreteras.tif")

Siguiendo la metodología de (Andy Nelson & Rolf de By):

Para cada raster, verificamos que coincidan los valores de:

Calcular velocidad caminando según uso de suelo y pendiente.

Se utiliza la fórmula descrita en Github

\[ 6*\exp(-0.4 \cdot |\tan(\frac{\pi * pendiente}{180})|+0.05) \]

Que si graficamos, se ve como sigue:

Se interpreta como una velocidad de caminata según una pendiente, con valor máximo de $6$ cuando la pendiente es cero.

Definición del raster de velocidad de caminata según uso de suelo y pendiente

slp_walk = 6 * exp(-0.4 * abs(tan(pendiente * pi / 180) + 0.05))  # Calcula la velocidad de caminata ajustada por la pendiente.

terrain_walk_spd = uso_de_suelo * slp_walk# Calcula la velocidad sobre el terreno ajustada por la pendiente y el uso de suelo.

Calcular velocidad en auto según velocidad en carretera y pendiente.

Se utiliza la fórmula descrita en Github

\[ 50*\exp(-0.4 \cdot |\tan(\frac{\pi * pendiente}{180})|+0.12) \]

Que si graficamos, se ve como sigue:

La interpretación es la misma que en el caso a pie. \(50\) kilometros por hora es la velocidad promedio para una pendiente de 0 grados.

Definición del raster de velocidad de caminata según uso de suelo y pendiente

slp_car = 50 * exp(-0.4 * abs(tan(pendiente * pi / 180) + 0.12))  # Calcula la velocidad sobre carreteras ajustada por la pendiente.

sloped_road_spd = carreteras * slp_car / 50.0 # Calcula la velocidad ajustada por pendiente para carreteras y la convierte en un raster.

Cálculo de tiempo de traslado.

Superponemos los raster generados en orden de prioridad. Primero en auto y después a pie:

merged_spd = merge(sloped_road_spd, terrain_walk_spd)     # Combina los rasters de velocidad de carreteras y terreno.

Definimos la fricción de cada pixel del raster en metros por minuto:

friction = 1.0 / (merged_spd * 1000 / 60.0 ) 

Técnicamente, lo que haremos adelante es calcular una matríz de transición entre pixeles en las 8 direcciones posibles:

library(gdistance)
## Warning: package 'gdistance' was built under R version 4.4.1
Trans = transition(friction, function(x) 1 / mean(x), 8)  # Crea una matriz de transición basada en la fricción.
T.GC = geoCorrection(Trans, type="c")

Con lo anterior, podemos calcular el tiempo de traslado dada una ubicación de origen y una de destino. Naturalmente, la ubicación de origen puede ser cualquier pixel de nuestro raster, y el tiempo de traslado se calcula con la matriz de transición utilizando la ruta más corta hacia el lugar de destino.

Con fines didácticos, consideraremos \(lugares\)_\(destino\) de manera aleatoria dentro del estado, pero recordando de la introducción, que pueden ser cualquier ubicación.

Definición de lugares destino:

library(sf)
hidalgo=st_read("Inputs/hidalgo/LIM_MUNICIPALES.shp")
n=7
lugares_destino_ficticios=st_sample(hidalgo$geometry,n)

Para calcular el tiempo de traslado, utilizamos la función :

tiempo = accCost(T.GC, matrix(unlist(lugares_destino_ficticios),nrow = n,ncol = 2,byrow = T))  # Calcula el costo acumulado desde un punto de inicio (coordenadas especificadas) usando la matriz de transición corregida (T.GC).
plot(tiempo, main='Tiempo de traslado al destino más cercano',ylab=' ',xaxt='n',yaxt='n',xlab=' ')
plot(lugares_destino_ficticios,add=T)
legend("topleft", legend=c("Lugares destino"), pch = 'o', cex=0.5)