library(landscapemetrics)
library(knitr)
library(terra)
library(dplyr)
parques = vect("~/papers_y_tesis/A_RESPALDARparques_marisela/parques_nuevos.gpkg")
clases = rast("~/papers_y_tesis/A_RESPALDARparques_marisela/clasificacion_2023_agosto_rf.tif")
clases[clases[] %in% c(4,5,6)] = 4
clases = droplevels(clases)
id_clases = data.frame(
value = c(1, 2, 3, 4, 7),
cover = c("agua", "arbórea", "asfalto", "construído", "pasto")
)
levels(clases) = id_clasesReporte de cálculo de métricas del paisaje
Se hizo un análisis de métricas del paisaje para 25 parques de la Ciudad de México, utilizando el paquete landscapemetrics. Se usó el producto de la clasificación supervisada del paso anterior, con las coberturas reclasificadas en agua, arbórea, asfalto, construído y pasto.
Antes del cálculo de las métricas se revisa que la imagen tif de la clasificación esté correcta para los procesos (Tabla 1):
check_landscape(clases) layer crs units class n_classes OK
1 1 projected m integer 5 ✔
Las métricas calculadas están en la (Tabla 2):
metricas = data.frame(lsm_fun = c("lsm_c_enn_mn", "lsm_c_ca", "lsm_c_te", "lsm_c_np"),
solicitud = c("Distancia euclideana promedio entre parches más cercanos",
"Cobertura de bosque",
"Longitud de borde",
"Número de parches"),
unidades = c("m", "ha", "m", "none" ))
knitr::kable(metricas)| lsm_fun | solicitud | unidades |
|---|---|---|
| lsm_c_enn_mn | Distancia euclideana promedio entre parches más cercanos | m |
| lsm_c_ca | Cobertura de bosque | ha |
| lsm_c_te | Longitud de borde | m |
| lsm_c_np | Número de parches | none |
En la Figura 1 y Figura 2 se aprecian los radios de 900 m a partir del punto central de cada parque.
par(mfrow = c(4,4))
for(i in 1:16) {
crop(clases, terra::buffer(parques[i,], 900)) |>
mask( terra::buffer(parques[i,], 900)) |>
plot(main = paste0( parques$Parques[i], ", 900m"), cex.main = .8, legend = F )
}par(mfrow = c(4,4))
for(i in 17:25) {
crop(clases, terra::buffer(parques[i,], 900)) |>
mask( terra::buffer(parques[i,], 900)) |>
plot(main = paste0( parques$Parques[i], ", 900m"), cex.main = .8, legend = F )
}Las métricas del paisaje fueron calculadas a 100, 200, 300, …, 900 m a partir del punto central de cada parque (Tabla 3).
buffers = seq(100, 900, by = 100 )
parks_lsm = vector(mode = "list", length = length(buffers))
names(parks_lsm) = paste0("b_", buffers)
for(i in buffers){
lsm_buff = vector(mode = "list", length = 2) # solo 2 parques para el html de quarto
names(lsm_buff) = parques$Parques[1:2] #
for(j in seq_along(parques)[1:2]){ #
temp = crop(clases, terra::buffer(parques[j,], i)) |>
mask( terra::buffer(parques[j,], i))
tempdf = bind_rows(
lsm_c_enn_mn(temp),
lsm_c_ca(temp),
lsm_c_te(temp),
lsm_c_np(temp)
)
lsm_buff[[parques$Parques[j]]] = tempdf
}
parks_lsm[[paste0("b_", i)]] = bind_rows(lsm_buff, .id = "parque")
}
parks_lsm_b = bind_rows(parks_lsm, .id = "buffer")
parks_lsm_b = parks_lsm_b |>
left_join(id_clases, by = c("class" = "value"))
#parks_lsm_b |>
# write.csv("parques_lsm_planet.csv", row.names = FALSE)
parks_lsm_b |> head() |> kable()| buffer | parque | layer | level | class | id | metric | value | cover |
|---|---|---|---|---|---|---|---|---|
| b_100 | Alameda del Sur | 1 | class | 2 | NA | enn_mn | 22.36068 | arbórea |
| b_100 | Alameda del Sur | 1 | class | 3 | NA | enn_mn | 60.00000 | asfalto |
| b_100 | Alameda del Sur | 1 | class | 4 | NA | enn_mn | 30.19804 | construído |
| b_100 | Alameda del Sur | 1 | class | 7 | NA | enn_mn | NA | pasto |
| b_100 | Alameda del Sur | 1 | class | 2 | NA | ca | 2.81000 | arbórea |
| b_100 | Alameda del Sur | 1 | class | 3 | NA | ca | 0.08000 | asfalto |

