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.
Uso de suelo según vegetación.
Pendiente.
Carreteras con velocidad máxima.
Los cuales, naturalmente, se obtienen de una rasterización de sus versiones vectoriales. Por ejemplo, para calcular la versión Raster de uso de suelo según vegetación se considera el coeficiente de fricción de cada tipo de vegetación
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):
Verificamos los datos en común de los raster.
Calcular velocidad caminando según uso de suelo y pendiente.
Calcular velocidad en auto según velocidad en carretera y pendiente.
carreteras
## class : RasterLayer
## dimensions : 998, 978, 976044 (nrow, ncol, ncell)
## resolution : 200, 200 (x, y)
## extent : 410236.1, 605836.1, 2166950, 2366550 (xmin, xmax, ymin, ymax)
## crs : +proj=utm +zone=14 +datum=WGS84 +units=m +no_defs
## source : carreteras.tif
## names : carreteras
Para cada raster, verificamos que coincidan los valores de:
dimensions
resolution
extent
crs
Nos ahorraremos muchas dificultades técnicas si esto ocurre. En nuestro caso, sà se cumple.
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.
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.
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.
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.
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.
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)