library(landscapemetrics)
library(knitr)
library(terra)
library(dplyr)
= vect("~/papers_y_tesis/A_RESPALDARparques_marisela/parques_nuevos.gpkg")
parques = rast("~/papers_y_tesis/A_RESPALDARparques_marisela/clasificacion_2023_agosto_rf.tif")
clases
%in% c(4,5,6)] = 4
clases[clases[] = droplevels(clases)
clases
= data.frame(
id_clases value = c(1, 2, 3, 4, 7),
cover = c("agua", "arbórea", "asfalto", "construído", "pasto")
)
levels(clases) = id_clases
Reporte 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):
= data.frame(lsm_fun = c("lsm_c_enn_mn", "lsm_c_ca", "lsm_c_te", "lsm_c_np"),
metricas 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" ))
::kable(metricas) knitr
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).
= seq(100, 900, by = 100 )
buffers = vector(mode = "list", length = length(buffers))
parks_lsm names(parks_lsm) = paste0("b_", buffers)
for(i in buffers){
= vector(mode = "list", length = 2) # solo 2 parques para el html de quarto
lsm_buff names(lsm_buff) = parques$Parques[1:2] #
for(j in seq_along(parques)[1:2]){ #
= crop(clases, terra::buffer(parques[j,], i)) |>
temp mask( terra::buffer(parques[j,], i))
= bind_rows(
tempdf lsm_c_enn_mn(temp),
lsm_c_ca(temp),
lsm_c_te(temp),
lsm_c_np(temp)
)$Parques[j]]] = tempdf
lsm_buff[[parques
}paste0("b_", i)]] = bind_rows(lsm_buff, .id = "parque")
parks_lsm[[
}
= bind_rows(parks_lsm, .id = "buffer")
parks_lsm_b
= 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)
|> head() |> kable() parks_lsm_b
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 |