Reporte de cálculo de métricas del paisaje

Autor/a

Elio Guarionex Lagunes-Díaz

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.

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_clases

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):

Tabla 1: Total de puntos por cobertura
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)
Tabla 2: Métricas utilizadas
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 )
}
Figura 1: Parques usados para el análisis
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 )
}
Figura 2: Parques usados para el análisis

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()
Tabla 3: Ejemplo del resultado de métricas del paisaje
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