Análisis espacial multicriterio
para la Identificación de áreas susceptibles
a Incendios Forestales en la región del Bio Bio.
Estudiante: Nelson Mattie
Los incendios forestales causan daños económicos, afectan el suelo, alteran los ciclos hidrológicos, provocan serios deterioros a los ecosistemas forestales y a la biodiversidad y aportan carbono a la atmósfera, contribuyendo en el calentamiento global de la tierra. Aunque en condiciones naturales los incendios forman parte del proceso dinámico de los ecosistemas (Ferreras, J. et al, 2001).
En las últimas décadas, los incendios forestales han sido una preocupación en distintas regiones del mundo, especialmente en Chile, por el incremento en su ocurrencia producto de actividades humanas y cambio climático. En este trabajo se presenta una aplicación práctica de Análisis Multicriterio desarrollada en el software R, utilizando datos vectoriales y ráster obtenidos de la base de datos del Centro de Información de Recursos Naturales (CIREN), IDE-Chile, e Imágenes del satélite Landsat-8.
Para plantear este trabajo se hizo una breve revisión de los elementos y factores geográficos que configuran la zona de estudio, lo cual permitió establecer la base de trabajo para el análisis espaciales, posteriormente se explican los conceptos teóricos y metodológicos desarrollados en R, y por último se analizan los resultados.
El área de estudio está ubicada en la región del bío bío, a unos 90 kilómetros al Sur-Este de la ciudad de Concepción, y comprende una superficie aproximada de 6.750 km2. Desde el punto de vista morfológico, se distinguen las unidades tradicionales del relieve chileno como lo son la cordillera de los Andes, depresión intermedia, cordillera de la Costa y planicies litorales.
La región marca la transición entre los climas templados secos de la zona central de Chile y los climas templados lluviosos que se desarrollan inmediatamente al sur del río Bío Bío. En la franja costera y en los sectores altos y laderas occidental de la cordillera de la Costa se presenta un clima templado húmedo, con una humedad constante con precipitaciones que fluctúan entre 1.200 mm y 2.000 mm anuales de norte a sur de la región. Hacia el interior el clima templado costero húmedo posee también temperaturas menos extremas donde las precipitaciones alcanzan 1.330 mm anuales con un período seco de cuatro meses. En el valle longitudinal las temperaturas presentan un mayor contraste entre día y noche. En la parte norte de la región predomina el clima templado mediterráneo abarcando toda la zona intermedia, bordes orientales de la cordillera de la Costa y los sectores más bajos de la precordillera. En la cordillera de los Andes por sobre los 1.500 metros de altura se desarrolló el clima frío de altura con abundantes precipitaciones, más de 2.000 mm anuales y las bajas temperaturas que permiten la presencia de nieves permanentes en las alturas de la cordillera. Las características climáticas que presenta la región en su extremo norte permiten la existencia del espino, asociado con boldo, peumo y quillay. En cambio hacia el sur se encuentra el bosque esclerófilo, en donde hoy es posible apreciar el cambio que se ha producido en la vegetación natural por las plantaciones forestales de pinos y por cultivos agrícolas.
Al sur del Bío Bío se ubica el bosque templado higromórfico, principalmente en la cordillera de la Costa y en la precordillera andina, donde predominan especies como roble, ciprés, coigüe, lenga y ñirre y en los sectores con mayores alturas es posible encontrar alerce y mañío. Además está acompañado por un denso sotobosque formado por canelo, olivillo, avellano y especies menores como el copihue, quila y ulmo.
Mapa del área de estudio.
El objetivo fue obtener un modelo de áreas susceptibles a los incendios forestales en la región del Bio Bio. Este estudio en esta zona es importante ya que la industria forestal chilena dispone de más de un millón de hectáreas plantadas de eucaliptus y pino radiata, lo que sustenta aserraderos, fábricas de paneles, enchapados e industrias de celulosa y papel.
Para el desarrollo de este trabajo se utilizó el software R, y la librería GDAL, el entorno Google Earth Engine y el software QGis. A continuación señalamos los paquetes y herramientas usados.
Los datos vectoriales fueron obtenidos de las bases de datos del Centro de Información de Recursos Naturales (CIREN) https://www.ciren.cl/ , IDE-Chile http://www.ide.cl/ y las Imágenes del satélite Landsat-8 se obtuvieron utilizando Google Earth Engine https://code.earthengine.google.com/
Lista de capas de información
Instalamos paquetes necesarios para ejecutar la sesión en código R.
if(!require(rgdal)) suppressMessages( suppressWarnings( install.packages("rgdal") ))
if(!require(raster)) suppressMessages( suppressWarnings( install.packages("raster") ))
if(!require(sf)) suppressMessages( suppressWarnings( install.packages("sf") ))Definimos una estructura de directorio con una carpeta de datos para insumos y resultados que sea común para cada uno de los talleres que se hicieron previamente.
ruta_proyecto <- dirname(getwd())
ruta_clase_01 <- file.path(ruta_proyecto, "Clase_01_GEE")
ruta_clase_02 <- file.path(ruta_proyecto, "Clase_02_R")
ruta_clase_03 <- file.path(ruta_proyecto, "Clase_03_Modelamiento")
ruta_clase_04 <- file.path(ruta_proyecto, "Clase_04_Maxent")
ruta_clase_05 <- file.path(ruta_proyecto, "Clase_05_Metricas")
ruta_clase_06 <- file.path(ruta_proyecto, "Clase_06_amc")
ruta_datos <- file.path(ruta_proyecto, "datos")Vamos a cargar los archivos correspondientes a la nueva zona de estudio. Comenzamos con el shapefile que contiene el límite de la zona de interés.
zona_estudio_amc <- sf::st_read(file.path(ruta_datos,"raster_amc/area_de_interes_nm.shp"),quiet=TRUE)Este shapefile está en formato UTM18S, lo que nos permitirá configurar la resolución en metros. Revisamos la proyección del mismo para ver que se encuentre en metros.
raster::crs(zona_estudio_amc)
## CRS arguments:
## +proj=utm +zone=18 +south +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0Hemos generado un nuevo conjunto de variables dependientes para la zona de estudio. Las presentaremos a continuación. Comenzaremos con las coberturas separadas (uni clase) que se utilizan para MaxEnt y luego las coberturas juntas (multi clase) para RandomForest. Cargamos las coberturas y comprobamos su proyección que esté en metros.
puntos <- read.csv(file.path(ruta_datos,"raster_amc/cobertura_veg_points2.csv") , header=TRUE, sep=",")
puntos <- sf::st_as_sf(puntos, wkt='WKT')
sf::st_crs(puntos) <- 32718
raster::crs(puntos)
## CRS arguments:
## +proj=utm +zone=18 +south +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0Hacemos un recuento inicial de las coberturas existentes en la zona de interés.
setNames(aggregate( as.character(WKT) ~ USO, puntos, length),c('USO','Recuento'))
## USO Recuento
## 1 Abierto 34
## 2 Agricola 290
## 3 Agua 40
## 4 Construido 68
## 5 Nativo 943
## 6 Plantacion 977Realizamos una selección aleatoria al listado de coberturas presentes según cada tipo de uso. Definimos un tamaño muestral de 34, porque consideramos que es suficiente para realizar la etapa de entrenamiento del MaxEnt.
idx01 <- sample( as.numeric(rownames( puntos [ puntos$USO == "Abierto" , ] )) , 34 )
idx02 <- sample( as.numeric(rownames( puntos [ puntos$USO == "Agricola" , ] )) , 34 )
idx03 <- sample( as.numeric(rownames( puntos [ puntos$USO == "Agua" , ] )) , 34 )
idx04 <- sample( as.numeric(rownames( puntos [ puntos$USO == "Construido" , ] )) , 34 )
idx05 <- sample( as.numeric(rownames( puntos [ puntos$USO == "Nativo" , ] )) , 34 )
idx06 <- sample( as.numeric(rownames( puntos [ puntos$USO == "Plantacion" , ] )) , 34 )Aplicamos el índice generado en la selección aleatoria para separar en coberturas independientes desde el data frame original.
puntos_amc_abierto <- puntos [ idx01 , ]
puntos_amc_agricola <- puntos [ idx02 , ]
puntos_amc_agua <- puntos [ idx03 , ]
puntos_amc_construido <- puntos [ idx04 , ]
puntos_amc_nativo <- puntos [ idx05 , ]
puntos_amc_plantacion <- puntos [ idx06 , ]Comprobamos las distribución posterior a la selección aleatoria para ver que cumpla con el tamaño muestral definido para cada una de las nuevas coberturas.
rbind(
setNames(aggregate( as.character(WKT) ~ USO, puntos_amc_abierto , length),c('USO','Recuento')),
setNames(aggregate( as.character(WKT) ~ USO, puntos_amc_agricola , length),c('USO','Recuento')),
setNames(aggregate( as.character(WKT) ~ USO, puntos_amc_agua , length),c('USO','Recuento')),
setNames(aggregate( as.character(WKT) ~ USO, puntos_amc_construido, length),c('USO','Recuento')),
setNames(aggregate( as.character(WKT) ~ USO, puntos_amc_nativo , length),c('USO','Recuento')),
setNames(aggregate( as.character(WKT) ~ USO, puntos_amc_plantacion, length),c('USO','Recuento'))
)
## USO Recuento
## 1 Abierto 34
## 2 Agricola 34
## 3 Agua 34
## 4 Construido 34
## 5 Nativo 34
## 6 Plantacion 34Ahora usamos los mismos puntos pero esta vez con coordenadas en formato XYZ.
puntos_xyz <- read.csv(file.path(ruta_datos,"raster_amc/cobertura_veg_points2_xyz.csv") , header=TRUE, sep=",")Aplicamos el índice generado en la selección aleatoria para separar en coberturas independientes desde el data frame original.
puntos_xyz_abierto <- puntos_xyz [ idx01 , ]
puntos_xyz_agricola <- puntos_xyz [ idx02 , ]
puntos_xyz_agua <- puntos_xyz [ idx03 , ]
puntos_xyz_construido <- puntos_xyz [ idx04 , ]
puntos_xyz_nativo <- puntos_xyz [ idx05 , ]
puntos_xyz_plantacion <- puntos_xyz [ idx06 , ]Volvemos a concatenar las coberturas esta vez muestreadas en caso de necesitarlas más adelante.
puntos_xyz_muestreados <-
rbind(
puntos_xyz_abierto ,
puntos_xyz_agricola ,
puntos_xyz_agua ,
puntos_xyz_construido,
puntos_xyz_nativo ,
puntos_xyz_plantacion
)Lo convertimos en objeto sf para exportarlo como Shapefile.
puntos_xyz_muestreados <- st_as_sf( puntos_xyz_muestreados, coords=c('X','Y'))
st_crs( puntos_xyz_muestreados) <- 32718Grabamos un archivo en disco para poder inspeccionar con QGis de ser necesario.
st_write(puntos_xyz_muestreados,
file.path(ruta_datos,"raster_amc/cobertura_veg_points2_sample.shp"),
delete_layer=TRUE,
quiet=TRUE)Ahora cargaremos los archivos raster que utilizaremos para el ejercicio. Estas imágenes fueron generadas para la zona de interés con GEE usando código Javascript. Posteriormente se procesaron con la librería GDAL, pasos tales como, reproyección, máscara y remuestreo. Listamos las imágenes GeoTiff con las que vamos a trabajar.
archivos_raster_amc <- list.files(file.path(ruta_datos,"raster_amc/Bandas_Landsat"),
pattern="_crop_32718.tif$|aspect.tif$|slope.tif$|dem.tif$")
archivos_raster_amc <- archivos_raster_amc[c(2:7,9,1,8,10)]
as.data.frame(archivos_raster_amc)
## archivos_raster_amc
## 1 B2_crop_32718.tif
## 2 B3_crop_32718.tif
## 3 B4_crop_32718.tif
## 4 B5_crop_32718.tif
## 5 B6_crop_32718.tif
## 6 B7_crop_32718.tif
## 7 NDVI_crop_32718.tif
## 8 aspect.tif
## 9 dem.tif
## 10 slope.tifVamos a trabajar con las bandas B2, a B6, con NDVI y las demás las dejaremos para pasos posteriores. Con esas bandas, creamos un archivo stack usando la librería GDAL y la cargamos directamente en R desde nuestro directorio.
stack_bandas_amc <- raster::stack( file.path(ruta_datos,"raster_amc/Bandas_Landsat/stack_bandas_amc_32718.tif" ))
names(stack_bandas_amc) <- c('B2','B3','B4','B5','B6','NDVI')Vamos a aplicar de nuevo el procedimiento de MaxEnt a las nuevas imágenes. El propósito es generar con el algoritmo MaxEnt un tipo de mapa temático que se use como insumo para aplicar el análisis multicriterio.
Retiramos la variable USO de cada capa de cobertura para trabajar únicamente con las coordenadas.
puntos_xyz_abierto $USO <- NULL
puntos_xyz_agricola $USO <- NULL
puntos_xyz_agua $USO <- NULL
puntos_xyz_construido$USO <- NULL
puntos_xyz_nativo $USO <- NULL
puntos_xyz_plantacion$USO <- NULLCreamos grupos sintéticos para particionar posteriormente cada conjunto de datos.
grupos_amc_abierto <- dismo::kfold( puntos_xyz_abierto , k=5)
grupos_amc_agricola <- dismo::kfold( puntos_xyz_agricola , k=5)
grupos_amc_agua <- dismo::kfold( puntos_xyz_agua , k=5)
grupos_amc_construido <- dismo::kfold( puntos_xyz_construido, k=5)
grupos_amc_nativo <- dismo::kfold( puntos_xyz_nativo , k=5)
grupos_amc_plantacion <- dismo::kfold( puntos_xyz_plantacion, k=5)Particionamos cada conjunto de datos para crear una muestra de entrenamiento y una de prueba respectivamente.
puntos_xyz_train_abierto <- puntos_xyz_abierto [ grupos_amc_abierto != 1 , ]
puntos_xyz_train_agricola <- puntos_xyz_agricola [ grupos_amc_agricola != 1 , ]
puntos_xyz_train_agua <- puntos_xyz_agua [ grupos_amc_agua != 1 , ]
puntos_xyz_train_construido <- puntos_xyz_construido [ grupos_amc_construido != 1 , ]
puntos_xyz_train_nativo <- puntos_xyz_nativo [ grupos_amc_nativo != 1 , ]
puntos_xyz_train_plantacion <- puntos_xyz_plantacion [ grupos_amc_plantacion != 1 , ]
puntos_xyz_teste_abierto <- puntos_xyz_abierto [ grupos_amc_abierto == 1 , ]
puntos_xyz_teste_agricola <- puntos_xyz_agricola [ grupos_amc_agricola == 1 , ]
puntos_xyz_teste_agua <- puntos_xyz_agua [ grupos_amc_agua == 1 , ]
puntos_xyz_teste_construido <- puntos_xyz_construido [ grupos_amc_construido == 1 , ]
puntos_xyz_teste_nativo <- puntos_xyz_nativo [ grupos_amc_nativo == 1 , ]
puntos_xyz_teste_plantacion <- puntos_xyz_plantacion [ grupos_amc_plantacion == 1 , ]Ya tenemos los necesario para entrenar cada cobertura usando MaxEnt. Usamos el argumento path para que la ejecución sea más rápida a partir de la primera corrida con lo cual se almacenan varios archivos en disco que el algoritmo crea cada vez que corre.
maxent_xyz_train_abierto <- dismo::maxent( x=stack_bandas_amc, p=puntos_xyz_train_abierto , ngb=2000, cache=TRUE, threads=4, memory_assigned=3600, skipifexists=TRUE, verbose=FALSE, path=file.path(ruta_datos,"maxent_xyz/train_abierto" ), silent=FALSE)
## Loading required namespace: rJava
## This is MaxEnt version 3.4.1
maxent_xyz_train_agricola <- dismo::maxent( x=stack_bandas_amc, p=puntos_xyz_train_agricola , ngb=2000, cache=TRUE, threads=4, memory_assigned=3600, skipifexists=TRUE, verbose=FALSE, path=file.path(ruta_datos,"maxent_xyz/train_agricola" ), silent=FALSE)
## This is MaxEnt version 3.4.1
maxent_xyz_train_agua <- dismo::maxent( x=stack_bandas_amc, p=puntos_xyz_train_agua , ngb=2000, cache=TRUE, threads=4, memory_assigned=3600, skipifexists=TRUE, verbose=FALSE, path=file.path(ruta_datos,"maxent_xyz/train_agua" ), silent=FALSE)
## This is MaxEnt version 3.4.1
maxent_xyz_train_construido <- dismo::maxent( x=stack_bandas_amc, p=puntos_xyz_train_construido , ngb=2000, cache=TRUE, threads=4, memory_assigned=3600, skipifexists=TRUE, verbose=FALSE, path=file.path(ruta_datos,"maxent_xyz/train_construido"), silent=FALSE)
## Warning in .local(x, p, ...): 1 (3.7%) of the presence points have NA predictor values
## This is MaxEnt version 3.4.1
maxent_xyz_train_nativo <- dismo::maxent( x=stack_bandas_amc, p=puntos_xyz_train_nativo , ngb=2000, cache=TRUE, threads=4, memory_assigned=3600, skipifexists=TRUE, verbose=FALSE, path=file.path(ruta_datos,"maxent_xyz/train_nativo" ), silent=FALSE)
## This is MaxEnt version 3.4.1
maxent_xyz_train_plantacion <- dismo::maxent( x=stack_bandas_amc, p=puntos_xyz_train_plantacion , ngb=2000, cache=TRUE, threads=4, memory_assigned=3600, skipifexists=TRUE, verbose=FALSE, path=file.path(ruta_datos,"maxent_xyz/train_plantacion"), silent=FALSE)
## Warning in .local(x, p, ...): 1 (3.7%) of the presence points have NA predictor values
## This is MaxEnt version 3.4.1Graficamos la contribución de variables por cada cobertura.
#par(mfrow=c(2,3))
#plot(maxent_xyz_train_abierto , main="Variable contribution\nAbierto" )
#plot(maxent_xyz_train_agricola , main="Variable contribution\nAgricola" )
#plot(maxent_xyz_train_agua , main="Variable contribution\nAgua" )
#plot(maxent_xyz_train_construido , main="Variable contribution\nConstruido" )
#plot(maxent_xyz_train_nativo , main="Variable contribution\nNativo" )
#plot(maxent_xyz_train_plantacion , main="Variable contribution\nPlantacion" )Contribución de variables al modelo MaxEnt.
Obtenemos raster con las predicciones para cada cobertura.
maxent_xyz_predict_abierto <- dismo::predict(maxent_xyz_train_abierto , stack_bandas_amc, filename=file.path(ruta_datos,"raster_xyz/maxent_xyz_predict_abierto.tif" ), overwrite=TRUE)
## Loading required namespace: rJava
## This is MaxEnt version 3.4.1
maxent_xyz_predict_agricola <- dismo::predict(maxent_xyz_train_agricola , stack_bandas_amc, filename=file.path(ruta_datos,"raster_xyz/maxent_xyz_predict_agricola.tif" ), overwrite=TRUE)
## This is MaxEnt version 3.4.1
maxent_xyz_predict_agua <- dismo::predict(maxent_xyz_train_agua , stack_bandas_amc, filename=file.path(ruta_datos,"raster_xyz/maxent_xyz_predict_agua.tif" ), overwrite=TRUE)
## This is MaxEnt version 3.4.1
maxent_xyz_predict_construido <- dismo::predict(maxent_xyz_train_construido , stack_bandas_amc, filename=file.path(ruta_datos,"raster_xyz/maxent_xyz_predict_construido.tif"), overwrite=TRUE)
## This is MaxEnt version 3.4.1
maxent_xyz_predict_nativo <- dismo::predict(maxent_xyz_train_nativo , stack_bandas_amc, filename=file.path(ruta_datos,"raster_xyz/maxent_xyz_predict_nativo.tif" ), overwrite=TRUE)
## This is MaxEnt version 3.4.1
maxent_xyz_predict_plantacion <- dismo::predict(maxent_xyz_train_plantacion , stack_bandas_amc, filename=file.path(ruta_datos,"raster_xyz/maxent_xyz_predict_plantacion.tif"), overwrite=TRUE)
## This is MaxEnt version 3.4.1Generamos puntos background de testeo para poder evaluar las predicciones.
puntos_xyz_bg_teste <- dismo::randomPoints( stack_bandas_amc, 1000)Evaluamos cada modelo usando los mismos puntos de background generados previamente.
maxent_xyz_eval_abierto <- dismo::evaluate(maxent_xyz_train_abierto , p=puntos_xyz_train_abierto , a=puntos_xyz_bg_teste, x=stack_bandas_amc)
## This is MaxEnt version 3.4.1
## This is MaxEnt version 3.4.1
maxent_xyz_eval_agricola <- dismo::evaluate(maxent_xyz_train_agricola , p=puntos_xyz_train_agricola , a=puntos_xyz_bg_teste, x=stack_bandas_amc)
## This is MaxEnt version 3.4.1
## This is MaxEnt version 3.4.1
maxent_xyz_eval_agua <- dismo::evaluate(maxent_xyz_train_agua , p=puntos_xyz_train_agua , a=puntos_xyz_bg_teste, x=stack_bandas_amc)
## This is MaxEnt version 3.4.1
## This is MaxEnt version 3.4.1
maxent_xyz_eval_construido <- dismo::evaluate(maxent_xyz_train_construido, p=puntos_xyz_train_construido, a=puntos_xyz_bg_teste, x=stack_bandas_amc)
## This is MaxEnt version 3.4.1
## This is MaxEnt version 3.4.1
maxent_xyz_eval_nativo <- dismo::evaluate(maxent_xyz_train_nativo , p=puntos_xyz_train_nativo , a=puntos_xyz_bg_teste, x=stack_bandas_amc)
## This is MaxEnt version 3.4.1
## This is MaxEnt version 3.4.1
maxent_xyz_eval_plantacion <- dismo::evaluate(maxent_xyz_train_plantacion, p=puntos_xyz_train_plantacion, a=puntos_xyz_bg_teste, x=stack_bandas_amc)
## This is MaxEnt version 3.4.1
## This is MaxEnt version 3.4.1Podemos graficar las curvas ROC por cada cobertura.
#par(mfrow=c(2,3))
#plot(maxent_xyz_eval_abierto , 'ROC')
#plot(maxent_xyz_eval_agricola , 'ROC')
#plot(maxent_xyz_eval_agua , 'ROC')
#plot(maxent_xyz_eval_construido , 'ROC')
#plot(maxent_xyz_eval_nativo , 'ROC')
#plot(maxent_xyz_eval_plantacion , 'ROC')Curvas ROC de cada variables en el modelo MaxEnt.
Extraemos los valores del estadígrafo MaxKappa.
maxkpp_xyz_eval_abierto <- maxent_xyz_eval_abierto @t[which.max(maxent_xyz_eval_abierto @kappa)]
maxkpp_xyz_eval_agricola <- maxent_xyz_eval_agricola @t[which.max(maxent_xyz_eval_agricola @kappa)]
maxkpp_xyz_eval_agua <- maxent_xyz_eval_agua @t[which.max(maxent_xyz_eval_agua @kappa)]
maxkpp_xyz_eval_construido <- maxent_xyz_eval_construido@t[which.max(maxent_xyz_eval_construido@kappa)]
maxkpp_xyz_eval_nativo <- maxent_xyz_eval_nativo @t[which.max(maxent_xyz_eval_nativo @kappa)]
maxkpp_xyz_eval_plantacion <- maxent_xyz_eval_plantacion@t[which.max(maxent_xyz_eval_plantacion@kappa)]Extraemos los valores del estadígrafo TSS.
maxtss_xyz_eval_abierto <- maxent_xyz_eval_abierto @t[which.max(maxent_xyz_eval_abierto @TPR+(maxent_xyz_eval_abierto @TNR-1))]
maxtss_xyz_eval_agricola <- maxent_xyz_eval_agricola @t[which.max(maxent_xyz_eval_agricola @TPR+(maxent_xyz_eval_agricola @TNR-1))]
maxtss_xyz_eval_agua <- maxent_xyz_eval_agua @t[which.max(maxent_xyz_eval_agua @TPR+(maxent_xyz_eval_agua @TNR-1))]
maxtss_xyz_eval_construido <- maxent_xyz_eval_construido@t[which.max(maxent_xyz_eval_construido@TPR+(maxent_xyz_eval_construido@TNR-1))]
maxtss_xyz_eval_nativo <- maxent_xyz_eval_nativo @t[which.max(maxent_xyz_eval_nativo @TPR+(maxent_xyz_eval_nativo @TNR-1))]
maxtss_xyz_eval_plantacion <- maxent_xyz_eval_plantacion@t[which.max(maxent_xyz_eval_plantacion@TPR+(maxent_xyz_eval_plantacion@TNR-1))]Promediamos ambas métricas para reclasificar cada imagen en función de ese valor promedio.
maxprom_xyz_eval_abierto <- (maxkpp_xyz_eval_abierto +maxtss_xyz_eval_abierto )/2
maxprom_xyz_eval_agricola <- (maxkpp_xyz_eval_agricola +maxtss_xyz_eval_agricola )/2
maxprom_xyz_eval_agua <- (maxkpp_xyz_eval_agua +maxtss_xyz_eval_agua )/2
maxprom_xyz_eval_construido <- (maxkpp_xyz_eval_construido+maxtss_xyz_eval_construido)/2
maxprom_xyz_eval_nativo <- (maxkpp_xyz_eval_nativo +maxtss_xyz_eval_nativo )/2
maxprom_xyz_eval_plantacion <- (maxkpp_xyz_eval_plantacion+maxtss_xyz_eval_plantacion)/2Definimos una función que reclasifique cada imagen según un valor de corte suministrado, en este caso, el promedio entre el MaxKappa y el MaxTSS.
funReclValProm <- function(...,strval) {
ifelse(... <= strval, 0,
ifelse(... > strval, 1, NA)) }Luego llamamos dicha función con los argumentos que corresponde en cada caso.
maxent_xyz_reclass_abierto <- calc(maxent_xyz_predict_abierto , function(x){ funReclValProm(x,strval=maxprom_xyz_eval_abierto )}, filename=file.path(ruta_datos,"raster_xyz/maxent_xyz_reclass_abierto.tif" ), overwrite=TRUE)
maxent_xyz_reclass_agricola <- calc(maxent_xyz_predict_agricola , function(x){ funReclValProm(x,strval=maxprom_xyz_eval_agricola )}, filename=file.path(ruta_datos,"raster_xyz/maxent_xyz_reclass_agricola.tif" ), overwrite=TRUE)
maxent_xyz_reclass_agua <- calc(maxent_xyz_predict_agua , function(x){ funReclValProm(x,strval=maxprom_xyz_eval_agua )}, filename=file.path(ruta_datos,"raster_xyz/maxent_xyz_reclass_agua.tif" ), overwrite=TRUE)
maxent_xyz_reclass_construido <- calc(maxent_xyz_predict_construido, function(x){ funReclValProm(x,strval=maxprom_xyz_eval_construido)}, filename=file.path(ruta_datos,"raster_xyz/maxent_xyz_reclass_construido.tif"), overwrite=TRUE)
maxent_xyz_reclass_nativo <- calc(maxent_xyz_predict_nativo , function(x){ funReclValProm(x,strval=maxprom_xyz_eval_nativo )}, filename=file.path(ruta_datos,"raster_xyz/maxent_xyz_reclass_nativo.tif" ), overwrite=TRUE)
maxent_xyz_reclass_plantacion <- calc(maxent_xyz_predict_plantacion, function(x){ funReclValProm(x,strval=maxprom_xyz_eval_plantacion)}, filename=file.path(ruta_datos,"raster_xyz/maxent_xyz_reclass_plantacion.tif"), overwrite=TRUE)Graficamos las imágenes temáticas.
png(file.path(ruta_datos,"figs/graficar_reclass_valor_cobertura-1.png"), units="in", width=8.45, height=6, res=300)
par(mfrow=c(2,3))
plot(maxent_xyz_reclass_abierto ,main="Reclass\nAbierto ")
plot(maxent_xyz_reclass_agricola ,main="Reclass\nAgricola ")
plot(maxent_xyz_reclass_agua ,main="Reclass\nAgua ")
plot(maxent_xyz_reclass_construido,main="Reclass\nConstruido")
plot(maxent_xyz_reclass_nativo ,main="Reclass\nNativo ")
plot(maxent_xyz_reclass_plantacion,main="Reclass\nPlantacion")
box()
dev.off()## png
## 2
Coberturas reclasificadas por Max Kappa y Max TSS.
Generamos un grillado usando el software QGis para poder dividir la zona de estudio en parches de menor tamaño. Encontramos que nuestra zona de interés posee una grilla que no son cuadrados regulares, sino que irregulares, por lo que la grilla generada por nosotros no se ajustó exactamente al área, quedando los parches de los bordes de un tamaño inferior.
Rejilla con cuadrantes para la zona de estudio.
Vamos a generar algunas métricas de paisaje para obtener coberturas representativas para identificar zonas con mayor propensión a incendios forestales.
if(!require(landscapemetrics)) suppressMessages( suppressWarnings( install.packages("landscapemetrics") ))Verificamos que las capas temáticas resultantes de MaxEnt posean las propiedades necesarias.
check_landscape(maxent_xyz_reclass_abierto )
## layer crs units class n_classes OK
## 1 1 projected m integer 2 ✔
check_landscape(maxent_xyz_reclass_agricola )
## layer crs units class n_classes OK
## 1 1 projected m integer 2 ✔
check_landscape(maxent_xyz_reclass_agua )
## layer crs units class n_classes OK
## 1 1 projected m integer 2 ✔
check_landscape(maxent_xyz_reclass_construido)
## layer crs units class n_classes OK
## 1 1 projected m integer 2 ✔
check_landscape(maxent_xyz_reclass_nativo )
## layer crs units class n_classes OK
## 1 1 projected m integer 2 ✔
check_landscape(maxent_xyz_reclass_plantacion)
## layer crs units class n_classes OK
## 1 1 projected m integer 2 ✔Resumimos las áreas totales.
rbind(
lsm_l_ta( maxent_xyz_reclass_abierto ),
lsm_l_ta( maxent_xyz_reclass_agricola ),
lsm_l_ta( maxent_xyz_reclass_agua ),
lsm_l_ta( maxent_xyz_reclass_construido ),
lsm_l_ta( maxent_xyz_reclass_nativo ),
lsm_l_ta( maxent_xyz_reclass_plantacion )
)
## # A tibble: 6 x 6
## layer level class id metric value
## <int> <chr> <int> <int> <chr> <dbl>
## 1 1 landscape NA NA ta 671141.
## 2 1 landscape NA NA ta 671141.
## 3 1 landscape NA NA ta 671141.
## 4 1 landscape NA NA ta 671141.
## 5 1 landscape NA NA ta 671141.
## 6 1 landscape NA NA ta 671141.Resumimos los bordes totales.
rbind(
lsm_l_te( maxent_xyz_reclass_abierto ),
lsm_l_te( maxent_xyz_reclass_agricola ),
lsm_l_te( maxent_xyz_reclass_agua ),
lsm_l_te( maxent_xyz_reclass_construido ),
lsm_l_te( maxent_xyz_reclass_nativo ),
lsm_l_te( maxent_xyz_reclass_plantacion )
)
## # A tibble: 6 x 6
## layer level class id metric value
## <int> <chr> <int> <int> <chr> <dbl>
## 1 1 landscape NA NA te 41657375.
## 2 1 landscape NA NA te 35474272.
## 3 1 landscape NA NA te 15178427.
## 4 1 landscape NA NA te 7722284.
## 5 1 landscape NA NA te 30634735.
## 6 1 landscape NA NA te 47951068.Resumimos índique de complejidad de forma, a mayor valor, mayor complejidad.
rbind(
lsm_l_np( maxent_xyz_reclass_abierto ),
lsm_l_np( maxent_xyz_reclass_agricola ),
lsm_l_np( maxent_xyz_reclass_agua ),
lsm_l_np( maxent_xyz_reclass_construido ),
lsm_l_np( maxent_xyz_reclass_nativo ),
lsm_l_np( maxent_xyz_reclass_plantacion )
)
## # A tibble: 6 x 6
## layer level class id metric value
## <int> <chr> <int> <int> <chr> <dbl>
## 1 1 landscape NA NA np 43110
## 2 1 landscape NA NA np 43484
## 3 1 landscape NA NA np 37309
## 4 1 landscape NA NA np 16696
## 5 1 landscape NA NA np 54597
## 6 1 landscape NA NA np 58535Resumimos el índice de Shannon que indica mayor diversidad a mayor valor del índice.
rbind(
lsm_l_shdi( maxent_xyz_reclass_abierto ),
lsm_l_shdi( maxent_xyz_reclass_agricola ),
lsm_l_shdi( maxent_xyz_reclass_agua ),
lsm_l_shdi( maxent_xyz_reclass_construido ),
lsm_l_shdi( maxent_xyz_reclass_nativo ),
lsm_l_shdi( maxent_xyz_reclass_plantacion )
)
## # A tibble: 6 x 6
## layer level class id metric value
## <int> <chr> <int> <int> <chr> <dbl>
## 1 1 landscape NA NA shdi 0.616
## 2 1 landscape NA NA shdi 0.490
## 3 1 landscape NA NA shdi 0.210
## 4 1 landscape NA NA shdi 0.143
## 5 1 landscape NA NA shdi 0.369
## 6 1 landscape NA NA shdi 0.645Resumimos a nivel de porcentaje del paisaje por cada clase.
rbind(
lsm_c_pland( maxent_xyz_reclass_abierto ),
lsm_c_pland( maxent_xyz_reclass_agricola ),
lsm_c_pland( maxent_xyz_reclass_agua ),
lsm_c_pland( maxent_xyz_reclass_construido ),
lsm_c_pland( maxent_xyz_reclass_nativo ),
lsm_c_pland( maxent_xyz_reclass_plantacion )
)
## # A tibble: 12 x 6
## layer level class id metric value
## <int> <chr> <int> <int> <chr> <dbl>
## 1 1 class 0 NA pland 69.4
## 2 1 class 1 NA pland 30.6
## 3 1 class 0 NA pland 80.7
## 4 1 class 1 NA pland 19.3
## 5 1 class 0 NA pland 94.6
## 6 1 class 1 NA pland 5.39
## 7 1 class 0 NA pland 96.7
## 8 1 class 1 NA pland 3.25
## 9 1 class 0 NA pland 87.9
## 10 1 class 1 NA pland 12.1
## 11 1 class 0 NA pland 65.4
## 12 1 class 1 NA pland 34.6Resumimos a nivel de número de parches por cada clase.
rbind(
lsm_c_np( maxent_xyz_reclass_abierto ),
lsm_c_np( maxent_xyz_reclass_agricola ),
lsm_c_np( maxent_xyz_reclass_agua ),
lsm_c_np( maxent_xyz_reclass_construido ),
lsm_c_np( maxent_xyz_reclass_nativo ),
lsm_c_np( maxent_xyz_reclass_plantacion )
)
## # A tibble: 12 x 6
## layer level class id metric value
## <int> <chr> <int> <int> <chr> <dbl>
## 1 1 class 0 NA np 10295
## 2 1 class 1 NA np 32815
## 3 1 class 0 NA np 7333
## 4 1 class 1 NA np 36151
## 5 1 class 0 NA np 881
## 6 1 class 1 NA np 36428
## 7 1 class 0 NA np 832
## 8 1 class 1 NA np 15864
## 9 1 class 0 NA np 3971
## 10 1 class 1 NA np 50626
## 11 1 class 0 NA np 17374
## 12 1 class 1 NA np 41161Calcularemos algunas métricas por cada zona de la grilla generada para el estudio.
rejilla_nm <- st_read(file.path(ruta_datos,"zip/6x6_rectangle_angle.shp"),quiet=TRUE)grilla_01_xyz_reclass_abierto <- crop( maxent_xyz_reclass_abierto , rejilla_nm[1,] ) ; dsp_01_xyz_reclass_abierto <- lsm_l_shdi( grilla_01_xyz_reclass_abierto )
grilla_02_xyz_reclass_abierto <- crop( maxent_xyz_reclass_abierto , rejilla_nm[2,] ) ; dsp_02_xyz_reclass_abierto <- lsm_l_shdi( grilla_02_xyz_reclass_abierto )
grilla_03_xyz_reclass_abierto <- crop( maxent_xyz_reclass_abierto , rejilla_nm[3,] ) ; dsp_03_xyz_reclass_abierto <- lsm_l_shdi( grilla_03_xyz_reclass_abierto )
grilla_04_xyz_reclass_abierto <- crop( maxent_xyz_reclass_abierto , rejilla_nm[4,] ) ; dsp_04_xyz_reclass_abierto <- lsm_l_shdi( grilla_04_xyz_reclass_abierto )
grilla_05_xyz_reclass_abierto <- crop( maxent_xyz_reclass_abierto , rejilla_nm[5,] ) ; dsp_05_xyz_reclass_abierto <- lsm_l_shdi( grilla_05_xyz_reclass_abierto )
grilla_06_xyz_reclass_abierto <- crop( maxent_xyz_reclass_abierto , rejilla_nm[6,] ) ; dsp_06_xyz_reclass_abierto <- lsm_l_shdi( grilla_06_xyz_reclass_abierto )
grilla_07_xyz_reclass_abierto <- crop( maxent_xyz_reclass_abierto , rejilla_nm[7,] ) ; dsp_07_xyz_reclass_abierto <- lsm_l_shdi( grilla_07_xyz_reclass_abierto )
grilla_08_xyz_reclass_abierto <- crop( maxent_xyz_reclass_abierto , rejilla_nm[8,] ) ; dsp_08_xyz_reclass_abierto <- lsm_l_shdi( grilla_08_xyz_reclass_abierto )
grilla_09_xyz_reclass_abierto <- crop( maxent_xyz_reclass_abierto , rejilla_nm[9,] ) ; dsp_09_xyz_reclass_abierto <- lsm_l_shdi( grilla_09_xyz_reclass_abierto )
grilla_10_xyz_reclass_abierto <- crop( maxent_xyz_reclass_abierto , rejilla_nm[10,] ) ; dsp_10_xyz_reclass_abierto <- lsm_l_shdi( grilla_10_xyz_reclass_abierto )
grilla_11_xyz_reclass_abierto <- crop( maxent_xyz_reclass_abierto , rejilla_nm[11,] ) ; dsp_11_xyz_reclass_abierto <- lsm_l_shdi( grilla_11_xyz_reclass_abierto )
grilla_12_xyz_reclass_abierto <- crop( maxent_xyz_reclass_abierto , rejilla_nm[12,] ) ; dsp_12_xyz_reclass_abierto <- lsm_l_shdi( grilla_12_xyz_reclass_abierto )
grilla_13_xyz_reclass_abierto <- crop( maxent_xyz_reclass_abierto , rejilla_nm[13,] ) ; dsp_13_xyz_reclass_abierto <- lsm_l_shdi( grilla_13_xyz_reclass_abierto )
grilla_14_xyz_reclass_abierto <- crop( maxent_xyz_reclass_abierto , rejilla_nm[14,] ) ; dsp_14_xyz_reclass_abierto <- lsm_l_shdi( grilla_14_xyz_reclass_abierto )
grilla_15_xyz_reclass_abierto <- crop( maxent_xyz_reclass_abierto , rejilla_nm[15,] ) ; dsp_15_xyz_reclass_abierto <- lsm_l_shdi( grilla_15_xyz_reclass_abierto )
grilla_16_xyz_reclass_abierto <- crop( maxent_xyz_reclass_abierto , rejilla_nm[16,] ) ; dsp_16_xyz_reclass_abierto <- lsm_l_shdi( grilla_16_xyz_reclass_abierto )
grilla_17_xyz_reclass_abierto <- crop( maxent_xyz_reclass_abierto , rejilla_nm[17,] ) ; dsp_17_xyz_reclass_abierto <- lsm_l_shdi( grilla_17_xyz_reclass_abierto )
grilla_18_xyz_reclass_abierto <- crop( maxent_xyz_reclass_abierto , rejilla_nm[18,] ) ; dsp_18_xyz_reclass_abierto <- lsm_l_shdi( grilla_18_xyz_reclass_abierto )
grilla_19_xyz_reclass_abierto <- crop( maxent_xyz_reclass_abierto , rejilla_nm[19,] ) ; dsp_19_xyz_reclass_abierto <- lsm_l_shdi( grilla_19_xyz_reclass_abierto )
grilla_20_xyz_reclass_abierto <- crop( maxent_xyz_reclass_abierto , rejilla_nm[20,] ) ; dsp_20_xyz_reclass_abierto <- lsm_l_shdi( grilla_20_xyz_reclass_abierto )
grilla_21_xyz_reclass_abierto <- crop( maxent_xyz_reclass_abierto , rejilla_nm[21,] ) ; dsp_21_xyz_reclass_abierto <- lsm_l_shdi( grilla_21_xyz_reclass_abierto )
grilla_22_xyz_reclass_abierto <- crop( maxent_xyz_reclass_abierto , rejilla_nm[22,] ) ; dsp_22_xyz_reclass_abierto <- lsm_l_shdi( grilla_22_xyz_reclass_abierto )
grilla_23_xyz_reclass_abierto <- crop( maxent_xyz_reclass_abierto , rejilla_nm[23,] ) ; dsp_23_xyz_reclass_abierto <- lsm_l_shdi( grilla_23_xyz_reclass_abierto )
grilla_24_xyz_reclass_abierto <- crop( maxent_xyz_reclass_abierto , rejilla_nm[24,] ) ; dsp_24_xyz_reclass_abierto <- lsm_l_shdi( grilla_24_xyz_reclass_abierto )
grilla_25_xyz_reclass_abierto <- crop( maxent_xyz_reclass_abierto , rejilla_nm[25,] ) ; dsp_25_xyz_reclass_abierto <- lsm_l_shdi( grilla_25_xyz_reclass_abierto )
grilla_26_xyz_reclass_abierto <- crop( maxent_xyz_reclass_abierto , rejilla_nm[26,] ) ; dsp_26_xyz_reclass_abierto <- lsm_l_shdi( grilla_26_xyz_reclass_abierto )
grilla_27_xyz_reclass_abierto <- crop( maxent_xyz_reclass_abierto , rejilla_nm[27,] ) ; dsp_27_xyz_reclass_abierto <- lsm_l_shdi( grilla_27_xyz_reclass_abierto )
grilla_28_xyz_reclass_abierto <- crop( maxent_xyz_reclass_abierto , rejilla_nm[28,] ) ; dsp_28_xyz_reclass_abierto <- lsm_l_shdi( grilla_28_xyz_reclass_abierto )
grilla_29_xyz_reclass_abierto <- crop( maxent_xyz_reclass_abierto , rejilla_nm[29,] ) ; dsp_29_xyz_reclass_abierto <- lsm_l_shdi( grilla_29_xyz_reclass_abierto )
grilla_30_xyz_reclass_abierto <- crop( maxent_xyz_reclass_abierto , rejilla_nm[30,] ) ; dsp_30_xyz_reclass_abierto <- lsm_l_shdi( grilla_30_xyz_reclass_abierto )
grilla_31_xyz_reclass_abierto <- crop( maxent_xyz_reclass_abierto , rejilla_nm[31,] ) ; dsp_31_xyz_reclass_abierto <- lsm_l_shdi( grilla_31_xyz_reclass_abierto )
grilla_32_xyz_reclass_abierto <- crop( maxent_xyz_reclass_abierto , rejilla_nm[32,] ) ; dsp_32_xyz_reclass_abierto <- lsm_l_shdi( grilla_32_xyz_reclass_abierto )
grilla_33_xyz_reclass_abierto <- crop( maxent_xyz_reclass_abierto , rejilla_nm[33,] ) ; dsp_33_xyz_reclass_abierto <- lsm_l_shdi( grilla_33_xyz_reclass_abierto )
grilla_34_xyz_reclass_abierto <- crop( maxent_xyz_reclass_abierto , rejilla_nm[34,] ) ; dsp_34_xyz_reclass_abierto <- lsm_l_shdi( grilla_34_xyz_reclass_abierto )
grilla_35_xyz_reclass_abierto <- crop( maxent_xyz_reclass_abierto , rejilla_nm[35,] ) ; dsp_35_xyz_reclass_abierto <- lsm_l_shdi( grilla_35_xyz_reclass_abierto )
grilla_36_xyz_reclass_abierto <- crop( maxent_xyz_reclass_abierto , rejilla_nm[36,] ) ; dsp_36_xyz_reclass_abierto <- lsm_l_shdi( grilla_36_xyz_reclass_abierto )Consolidamos cada valor por rejilla en una sola capa.
shannon_xyz_reclass_abierto <- rbind(
dsp_01_xyz_reclass_abierto,
dsp_02_xyz_reclass_abierto,
dsp_03_xyz_reclass_abierto,
dsp_04_xyz_reclass_abierto,
dsp_05_xyz_reclass_abierto,
dsp_06_xyz_reclass_abierto,
dsp_07_xyz_reclass_abierto,
dsp_08_xyz_reclass_abierto,
dsp_09_xyz_reclass_abierto,
dsp_10_xyz_reclass_abierto,
dsp_11_xyz_reclass_abierto,
dsp_12_xyz_reclass_abierto,
dsp_13_xyz_reclass_abierto,
dsp_14_xyz_reclass_abierto,
dsp_15_xyz_reclass_abierto,
dsp_16_xyz_reclass_abierto,
dsp_17_xyz_reclass_abierto,
dsp_18_xyz_reclass_abierto,
dsp_19_xyz_reclass_abierto,
dsp_20_xyz_reclass_abierto,
dsp_21_xyz_reclass_abierto,
dsp_22_xyz_reclass_abierto,
dsp_23_xyz_reclass_abierto,
dsp_24_xyz_reclass_abierto,
dsp_25_xyz_reclass_abierto,
dsp_26_xyz_reclass_abierto,
dsp_27_xyz_reclass_abierto,
dsp_28_xyz_reclass_abierto,
dsp_29_xyz_reclass_abierto,
dsp_30_xyz_reclass_abierto,
dsp_31_xyz_reclass_abierto,
dsp_32_xyz_reclass_abierto,
dsp_33_xyz_reclass_abierto,
dsp_34_xyz_reclass_abierto,
dsp_35_xyz_reclass_abierto,
dsp_36_xyz_reclass_abierto)id_rejilla <- c(
paste0('A',seq(1:6)),
paste0('B',seq(1:6)),
paste0('C',seq(1:6)),
paste0('D',seq(1:6)),
paste0('E',seq(1:6)),
paste0('F',seq(1:6))
)Reordenamos las columnas para poder graficar el nuevo indicador de Shannon a nivel de cada polígono.
shannon_xyz_reclass_abierto <- cbind(NAME=id_rejilla,shannon_xyz_reclass_abierto[,6])
shannon_xyz_rejilla_abierto <- merge(rejilla_nm, shannon_xyz_reclass_abierto,by='NAME')png(file.path(ruta_datos,"figs/plot_concatenar_dsp_xyz_cobertura.png"), units="in", width=6, height=6, res=300)
plot(shannon_xyz_rejilla_abierto[,3],main="Índice Shannon")
dev.off()
## png
## 2Índice de Shannon obtenido por cada segmento.
Para completar neustras capas, vamos a rasterizar esta capa como Diversidad.
maxent_xyz_reclass_diversidad <- rasterize( shannon_xyz_rejilla_abierto ,
filename=file.path(ruta_datos,"raster_xyz/maxent_xyz_reclass_diversidad.tif"),
maxent_xyz_reclass_abierto ,
field='value' ,
silent=TRUE,
overwrite=TRUE)Vamos a cargar un raster stack que hemos preparado con las nuevas variables que usaremos para el análisis multicriterio.
stack_xyz_predict_amc <- raster::brick(file.path(ruta_datos,"raster_xyz/stack_xyz_predict_amc.tif"))
names(stack_xyz_predict_amc) <- c(
"aspect" ,
"construido",
"diversidad",
"nativo" ,
"plantacion",
"slope" )Revisamos las variables con las que vamos a trabajar en el análisis multicriterio.
variables_amc <- data.frame(variables_amc=ls(pattern="maxent_xyz_reclass_"))
variables_amc <- data.frame(variables_amc=variables_amc[c(4:9),])
variables_amc
## variables_amc
## 1 maxent_xyz_reclass_aspect
## 2 maxent_xyz_reclass_construido
## 3 maxent_xyz_reclass_diversidad
## 4 maxent_xyz_reclass_nativo
## 5 maxent_xyz_reclass_plantacion
## 6 maxent_xyz_reclass_slopePrimero veamos la escala de nuestros datos para ver la necesidad de transformarlos en indicadores compatibles. Veamos cuál es la escala de valores de nuestras variables.
¿Son compatibles/conmensurables nuestros datos? En otras palabras, ¿son operacionalmente compatibles? Por lo tanto: Lo primero dentro de un AMC es normalizar los datos de las variables en indicadores compatibles.
En este caso vamos a trabajar con las siguientes 6 variables:
|
==> Mayor nivel de construcción, Mayor densidad poblacional y probabilidad de incendio. |
|
==> Mayor nivel de bosque nativo, Mayor biomasa disponible para incendio. |
|
==> Mayor nivel de plantación forestal, Mayor biomasa disponible para incendio. |
|
==> Mayor nivel de diversidad de paisaje, Menor probabilidad de que el incendio se propague. |
|
==> Mayor nivel de Pendiente, Mayor probabilidad de vientos ascendentes y propagación de incendio. |
|
==> Aquellos lugares con exposición norte y este debiesen tener mayor radiación y temperatura. |
En este práctico normalizaremos todas nuestras variables en el rango de 0 a 1 en base a distintas reglas. Para todos nuestros indicadores, valores mayores indicarán mayor probabilidad de incendio de gran magnitud.
Revisamos las estadísticas de cada cobertura.
summa_xyz_predict_amc <-
data.frame(rbind(
stack_xyz_predict_amc@data@max ,
stack_xyz_predict_amc@data@min
))
colnames(summa_xyz_predict_amc) <-
stack_xyz_predict_amc@data@names
summa_xyz_predict_amc
## aspect construido diversidad nativo plantacion slope
## 1 359.7582 1.000000000 0.6828299 0.9176571369 0.873118997 60.65885
## 2 -1.0000 0.003941121 0.3597561 0.0008257756 0.008149054 0.00000Transformación de datos espaciales en indicadores compatibles.
CAPAS MAXENT: Las capas probabilísticas de las clases generadas en el práctico Maxent vienen en valores entre 0 a 1, por lo que no es necesario normalizar. Pero sólo como un ejemplo práctico, lo que haremos será utilizar el cuadrado del valor original para maximizar diferencias entre valores extremos.
#maxent_xyz_normals_aspect <- subset(stack_xyz_predict_amc,1)^2 # aspect
maxent_xyz_normals_construido <- subset(stack_xyz_predict_amc,2)^2 # construido
#maxent_xyz_normals_diversidad <- subset(stack_xyz_predict_amc,3)^2 # diversidad
maxent_xyz_normals_nativo <- subset(stack_xyz_predict_amc,4)^2 # nativo
maxent_xyz_normals_plantacion <- subset(stack_xyz_predict_amc,5)^2 # plantacion
#maxent_xyz_normals_slope <- subset(stack_xyz_predict_amc,6)^2 # slope
#writeRaster(maxent_xyz_normals_aspect ,file.path(ruta_datos,"raster_xyz/maxent_xyz_normals_aspect.tif" ),overwrite=TRUE)
writeRaster(maxent_xyz_normals_construido,file.path(ruta_datos,"raster_xyz/maxent_xyz_normals_construido.tif"),overwrite=TRUE)
#writeRaster(maxent_xyz_normals_diversidad,file.path(ruta_datos,"raster_xyz/maxent_xyz_normals_diversidad.tif"),overwrite=TRUE)
writeRaster(maxent_xyz_normals_nativo ,file.path(ruta_datos,"raster_xyz/maxent_xyz_normals_nativo.tif" ),overwrite=TRUE)
writeRaster(maxent_xyz_normals_plantacion,file.path(ruta_datos,"raster_xyz/maxent_xyz_normals_plantacion.tif"),overwrite=TRUE)
#writeRaster(maxent_xyz_normals_slope ,file.path(ruta_datos,"raster_xyz/maxent_xyz_normals_slope.tif" ),overwrite=TRUE)NATIVO: Veamos como cambiaron nuestros datos, antes y después de normalizar.
maxent_xyz_normals_nativo@data@min
## [1] 6.819053e-07
maxent_xyz_normals_nativo@data@max
## [1] 0.8420946maxent_xyz_normals_nativo <- raster(file.path(ruta_datos,"raster_xyz/maxent_xyz_normals_nativo.tif"))png(file.path(ruta_datos,"figs/plot_maxent_xyz_normals_nativo.png"), units="px", width=1344, height=960, pointsize=24)
plot(maxent_xyz_normals_nativo, main="Variable nativo\nnormalizada")
dev.off()
## png
## 2Variable nativo normalizada en rango 0 a 1..
png(file.path(ruta_datos,"figs/hist_minmax_xyz_normals_nativo.png"), units="px", width=1344, height=960, pointsize=24)
par(mfrow=c(1,2))
hist( maxent_xyz_predict_nativo, breaks=100, main = "Original")
## Warning in .hist1(x, maxpixels = maxpixels, main = main, plot = plot, ...): 2% of the raster cells were used. 100000 values used.
hist( maxent_xyz_normals_nativo, breaks=100, main = "Normalizado")
## Warning in .hist1(x, maxpixels = maxpixels, main = main, plot = plot, ...): 2% of the raster cells were used. 100000 values used.
dev.off()
## png
## 2Variable nativo original versus normalizada.
DIVERSIDAD PAISAJE: Utilizaremos una aproximación de reescalamiento de tipo "max-min": Y = (x-min)/(max-min).
maxent_xyz_normals_diversidad <-
(subset(stack_xyz_predict_amc,3) - summa_xyz_predict_amc[2,3]) /
(summa_xyz_predict_amc[1,3] - summa_xyz_predict_amc[2,3])
writeRaster(maxent_xyz_normals_diversidad,file.path(ruta_datos,"raster_xyz/maxent_xyz_normals_diversidad.tif"),overwrite=TRUE)Veamos si la variable diversidad quedó normalizada.
maxent_xyz_normals_diversidad@data@min
## [1] -2.920972e-15
maxent_xyz_normals_diversidad@data@max
## [1] 1maxent_xyz_normals_diversidad <- raster(file.path(ruta_datos,"raster_xyz/maxent_xyz_normals_diversidad.tif"))png(file.path(ruta_datos,"figs/plot_maxent_xyz_normals_diversidad.png"), units="px", width=1344, height=960, pointsize=24)
plot(maxent_xyz_normals_diversidad, main="Variable diversidad\nnormalizada")
dev.off()
## png
## 2Variable diversidad normalizada en rango 0 a 1..
png(file.path(ruta_datos,"figs/hist_minmax_xyz_normals_diversidad.png"), units="px", width=1344, height=960, pointsize=24)
par(mfrow=c(1,2))
hist( maxent_xyz_reclass_diversidad, breaks=100, main = "Original")
## Warning in .hist1(x, maxpixels = maxpixels, main = main, plot = plot, ...): 2% of the raster cells were used. 100000 values used.
hist( maxent_xyz_normals_diversidad, breaks=100, main = "Normalizado")
## Warning in .hist1(x, maxpixels = maxpixels, main = main, plot = plot, ...): 2% of the raster cells were used. 100000 values used.
dev.off()
## png
## 2Variable diversidad original versus normalizada.
CAPAS TERRENO: Para estas capas tomaremos dos aproximaciones diferentes para cada una.
PENDIENTE: Esta capa tiene valores entre 0 y 75. Para normalizar los datos generaremos 5 clases, con valores entre 0.5 y 1.
maxent_xyz_normals_slope <-
((subset(stack_xyz_predict_amc,6) >= 50)*1 +
(subset(stack_xyz_predict_amc,6) < 50 & subset(stack_xyz_predict_amc,6) >= 40 )*0.9 +
(subset(stack_xyz_predict_amc,6) < 40 & subset(stack_xyz_predict_amc,6) >= 30 )*0.8 +
(subset(stack_xyz_predict_amc,6) < 30 & subset(stack_xyz_predict_amc,6) >= 20 )*0.7 +
(subset(stack_xyz_predict_amc,6) < 20 & subset(stack_xyz_predict_amc,6) >= 10 )*0.6 +
(subset(stack_xyz_predict_amc,6) < 10)*0.5)
writeRaster(maxent_xyz_normals_slope ,file.path(ruta_datos,"raster_xyz/maxent_xyz_normals_slope.tif" ),overwrite=TRUE)Veamos si la variable slope quedó normalizada.
maxent_xyz_normals_slope@data@min
## [1] 0.5
maxent_xyz_normals_slope@data@max
## [1] 1maxent_xyz_normals_slope <- raster(file.path(ruta_datos,"raster_xyz/maxent_xyz_normals_slope.tif"))png(file.path(ruta_datos,"figs/plot_maxent_xyz_normals_slope.png"), units="px", width=1344, height=960, pointsize=24)
plot(maxent_xyz_normals_slope, main="Variable slope\nnormalizada")
dev.off()
## png
## 2Variable slope normalizada en rango 0 a 1..
maxent_xyz_reclass_slope <- raster(file.path(ruta_datos,"raster_xyz/maxent_xyz_reclass_slope.tif"))
maxent_xyz_normals_slope <- raster(file.path(ruta_datos,"raster_xyz/maxent_xyz_normals_slope.tif"))png(file.path(ruta_datos,"figs/hist_minmax_xyz_normals_slope.png"), units="px", width=1344, height=960, pointsize=24)
par(mfrow=c(1,2))
hist( maxent_xyz_reclass_slope, breaks=100, main = "Original")
## Warning in .hist1(x, maxpixels = maxpixels, main = main, plot = plot, ...): 2% of the raster cells were used. 100000 values used.
hist( maxent_xyz_normals_slope, breaks=100, main = "Normalizado")
## Warning in .hist1(x, maxpixels = maxpixels, main = main, plot = plot, ...): 2% of the raster cells were used. 100000 values used.
dev.off()
## png
## 2Variable slope original versus normalizada.
ASPECTO: lo normalizaremos en base a una regla cuatrinaria: Noreste = 1, Sureste = 0.75, Suroeste = 0.50, Sureste = 0.25.
maxent_xyz_normals_aspect <-
((subset(stack_xyz_predict_amc,1) >= 0 & subset(stack_xyz_predict_amc,1) < 90)*1.00 +
(subset(stack_xyz_predict_amc,1) >= 90 & subset(stack_xyz_predict_amc,1) < 180)*0.75 +
(subset(stack_xyz_predict_amc,1) >= 180 & subset(stack_xyz_predict_amc,1) < 270)*0.50 +
(subset(stack_xyz_predict_amc,1) >= 270 & subset(stack_xyz_predict_amc,1) <= 360)*0.25)
writeRaster(maxent_xyz_normals_aspect ,file.path(ruta_datos,"raster_xyz/maxent_xyz_normals_aspect.tif" ),overwrite=TRUE)Veamos si la variable aspect quedó normalizada.
maxent_xyz_normals_aspect@data@min
## [1] 0
maxent_xyz_normals_aspect@data@max
## [1] 1maxent_xyz_normals_aspect <- raster(file.path(ruta_datos,"raster_xyz/maxent_xyz_normals_aspect.tif"))png(file.path(ruta_datos,"figs/plot_maxent_xyz_normals_aspect.png"), units="px", width=1344, height=960, pointsize=24)
plot(maxent_xyz_normals_aspect, main="Variable aspect\nnormalizada")
dev.off()
## png
## 2Variable aspect normalizada en rango 0 a 1..
Veamos el resultado.
maxent_xyz_reclass_aspect <- raster(file.path(ruta_datos,"raster_xyz/maxent_xyz_reclass_aspect.tif"))
maxent_xyz_normals_aspect <- raster(file.path(ruta_datos,"raster_xyz/maxent_xyz_normals_aspect.tif"))png(file.path(ruta_datos,"figs/hist_minmax_xyz_normals_aspect.png"), units="px", width=1344, height=960, pointsize=24)
par(mfrow=c(1,2))
hist( maxent_xyz_reclass_aspect, breaks=100, main = "Original")
## Warning in .hist1(x, maxpixels = maxpixels, main = main, plot = plot, ...): 2% of the raster cells were used. 100000 values used.
hist( maxent_xyz_normals_aspect, breaks=100, main = "Normalizado")
## Warning in .hist1(x, maxpixels = maxpixels, main = main, plot = plot, ...): 2% of the raster cells were used. 100000 values used.
dev.off()
## png
## 2Variable aspect original versus normalizada.
Volvemos a grabar en disco las capas.
writeRaster(maxent_xyz_normals_aspect ,file.path(ruta_datos,"raster_xyz/maxent_xyz_normals_aspect.tif" ),overwrite=TRUE)
#writeRaster(maxent_xyz_normals_construido,file.path(ruta_datos,"raster_xyz/maxent_xyz_normals_construido.tif"),overwrite=TRUE)
writeRaster(maxent_xyz_normals_diversidad,file.path(ruta_datos,"raster_xyz/maxent_xyz_normals_diversidad.tif"),overwrite=TRUE)
#writeRaster(maxent_xyz_normals_nativo ,file.path(ruta_datos,"raster_xyz/maxent_xyz_normals_nativo.tif" ),overwrite=TRUE)
#writeRaster(maxent_xyz_normals_plantacion,file.path(ruta_datos,"raster_xyz/maxent_xyz_normals_plantacion.tif"),overwrite=TRUE)
writeRaster(maxent_xyz_normals_slope ,file.path(ruta_datos,"raster_xyz/maxent_xyz_normals_slope.tif" ),overwrite=TRUE)archivos_normals <- list.files(file.path(ruta_datos,"raster_xyz"),pattern="normals")
as.data.frame(archivos_normals)
## archivos_normals
## 1 maxent_xyz_normals_aspect.tif
## 2 maxent_xyz_normals_construido.tif
## 3 maxent_xyz_normals_diversidad.tif
## 4 maxent_xyz_normals_nativo.tif
## 5 maxent_xyz_normals_plantacion.tif
## 6 maxent_xyz_normals_slope.tif
stack_xyz_normals_amc <- raster::stack(file.path(ruta_datos,"raster_xyz",archivos_normals))Existen 2 formas básicas de integrar indicadores normalizados: Media Aritmética, o Media Geométrica.
Media Aritmética: (Ind.1 + Ind.2 + Ind.3 + ... + Ind.n)/n.
maxent_xyz_medarit_amc <-
((subset(stack_xyz_normals_amc,1))
+(subset(stack_xyz_normals_amc,2))
+(subset(stack_xyz_normals_amc,3))
+(subset(stack_xyz_normals_amc,4))
+(subset(stack_xyz_normals_amc,5))
+(subset(stack_xyz_normals_amc,6)))/6
writeRaster(maxent_xyz_medarit_amc ,file.path(ruta_datos,"raster_xyz/maxent_xyz_medarit_amc.tif" ),overwrite=TRUE)png(file.path(ruta_datos,"figs/plot_maxent_xyz_medarit_amc.png"), units="px", width=1344, height=960, pointsize=24)
par(mfrow=c(1,2))
plot(maxent_xyz_medarit_amc, main="M aritmética", col=bpy.colors(100))
hist(maxent_xyz_medarit_amc, main="M aritmética")
dev.off()
## png
## 2Mapa e histograma para media aritmética.
Media Geométrica: (Ind.1 x Ind.2 x Ind.3 x ... x Ind.n)^(1/n).
maxent_xyz_medgeom_amc <-
((subset(stack_xyz_normals_amc,1))
*(subset(stack_xyz_normals_amc,2))
*(subset(stack_xyz_normals_amc,3))
*(subset(stack_xyz_normals_amc,4))
*(subset(stack_xyz_normals_amc,5))
*(subset(stack_xyz_normals_amc,6)))^(1/6)
writeRaster(maxent_xyz_medgeom_amc ,file.path(ruta_datos,"raster_xyz/maxent_xyz_medgeom_amc.tif" ),overwrite=TRUE)png(file.path(ruta_datos,"figs/plot_maxent_xyz_medgeom_amc.png"), units="px", width=1344, height=960, pointsize=24)
par(mfrow=c(1,2))
plot(maxent_xyz_medgeom_amc, main="M geométrica", col=bpy.colors(100))
hist(maxent_xyz_medgeom_amc, main="M geométrica")
dev.off()
## png
## 2Mapa e histograma para media geométrica.
¿NOS FALTA ALGO? / ¿Son todas los indicadores igual de importantes? Para darle distinta importancia a cada variable podemos utilizar "Ponderadores". Definamos nuestro indicadores y ponderadores para hacer más simple cambiar los parámetros.
Idx_A <- raster(file.path(ruta_datos,"raster_xyz/maxent_xyz_normals_aspect.tif" ))
Idx_C <- raster(file.path(ruta_datos,"raster_xyz/maxent_xyz_normals_construido.tif" ))
Idx_B <- raster(file.path(ruta_datos,"raster_xyz/maxent_xyz_normals_diversidad.tif" ))
Idx_D <- raster(file.path(ruta_datos,"raster_xyz/maxent_xyz_normals_nativo.tif" ))
Idx_E <- raster(file.path(ruta_datos,"raster_xyz/maxent_xyz_normals_plantacion.tif" ))
Idx_F <- raster(file.path(ruta_datos,"raster_xyz/maxent_xyz_normals_slope.tif" ))Pa <- c(1) # aspect
Pc <- c(1) # construido
Pb <- c(1) # diversidad
Pd <- c(1) # nativo
Pe <- c(1) # plantacion
Pf <- c(1) # slopeCalculamos las medias y graficamos.
PND_AMC_MA_111111 <- (Idx_A*Pa + Idx_B*Pb + Idx_C*Pc + Idx_D*Pd + Idx_E*Pe + Idx_F*Pf)/(Pa+Pb+Pc+Pd+Pe+Pf)
PND_AMC_MG_111111 <- (Idx_A^Pa * Idx_B^Pb * Idx_C^Pc * Idx_D^Pd * Idx_E^Pe * Idx_F^Pf)^(1/(Pa+Pb+Pc+Pd+Pe+Pf))
writeRaster(PND_AMC_MA_111111 ,file.path(ruta_datos,"raster_xyz/PND_AMC_MA_111111.tif" ),overwrite=TRUE)
writeRaster(PND_AMC_MG_111111 ,file.path(ruta_datos,"raster_xyz/PND_AMC_MG_111111.tif" ),overwrite=TRUE)png(file.path(ruta_datos,"figs/plot_ponderacion_indicadores_0001.png"), units="px", width=1344, height=960, pointsize=24)
par(mfrow=c(1,2))
plot(PND_AMC_MA_111111, main = "MA_111111", col=bpy.colors(100))
plot(PND_AMC_MG_111111, main = "MG_111111", col=bpy.colors(100))
dev.off()
## png
## 2Medias aritmética y geométrica para fórmula 111111.
Probemos con otros valores de ponderación. Por ejemplo:
Pa <- c(1) # aspect
Pb <- c(2) # construido
Pc <- c(1) # diversidad
Pd <- c(2) # nativo
Pe <- c(3) # plantacion
Pf <- c(3) # slopeCalculamos las medias y graficamos.
PND_AMC_MA_121233 <- (Idx_A*Pa + Idx_B*Pb + Idx_C*Pc + Idx_D*Pd + Idx_E*Pe + Idx_F*Pf)/(Pa+Pb+Pc+Pd+Pe+Pf)
PND_AMC_MG_121233 <- (Idx_A^Pa * Idx_B^Pb * Idx_C^Pc * Idx_D^Pd * Idx_E^Pe * Idx_F^Pf)^(1/(Pa+Pb+Pc+Pd+Pe+Pf))
writeRaster(PND_AMC_MA_121233 ,file.path(ruta_datos,"raster_xyz/PND_AMC_MA_121233.tif" ),overwrite=TRUE)
writeRaster(PND_AMC_MG_121233 ,file.path(ruta_datos,"raster_xyz/PND_AMC_MG_121233.tif" ),overwrite=TRUE)png(file.path(ruta_datos,"figs/plot_ponderacion_indicadores_0002.png"), units="px", width=1344, height=960, pointsize=24)
par(mfrow=c(1,2))
plot(PND_AMC_MA_121233, main = "MA_121233", col=bpy.colors(100))
plot(PND_AMC_MG_121233, main = "MG_121233", col=bpy.colors(100))
dev.off()
## png
## 2Medias aritmética y geométrica para fórmula 121233.
Probemos con un último ejemplo:
Pa <- c(2) # aspect
Pb <- c(3) # construido
Pc <- c(1) # diversidad
Pd <- c(3) # nativo
Pe <- c(1) # plantacion
Pf <- c(4) # slopeCalculamos las medias y graficamos.
PND_AMC_MA_231314 <- (Idx_A*Pa + Idx_B*Pb + Idx_C*Pc + Idx_D*Pd + Idx_E*Pe + Idx_F*Pf)/(Pa+Pb+Pc+Pd+Pe+Pf)
PND_AMC_MG_231314 <- (Idx_A^Pa * Idx_B^Pb * Idx_C^Pc * Idx_D^Pd * Idx_E^Pe * Idx_F^Pf)^(1/(Pa+Pb+Pc+Pd+Pe+Pf))
writeRaster(PND_AMC_MA_231314 ,file.path(ruta_datos,"raster_xyz/PND_AMC_MA_231314.tif" ),overwrite=TRUE)
writeRaster(PND_AMC_MG_231314 ,file.path(ruta_datos,"raster_xyz/PND_AMC_MG_231314.tif" ),overwrite=TRUE)PND_AMC_MA_231314 <- raster(file.path(ruta_datos,"raster_xyz/PND_AMC_MA_231314.tif"))
PND_AMC_MG_231314 <- raster(file.path(ruta_datos,"raster_xyz/PND_AMC_MG_231314.tif"))png(file.path(ruta_datos,"figs/plot_ponderacion_indicadores_0003.png"), units="px", width=1344, height=960, pointsize=24)
par(mfrow=c(1,2))
plot(PND_AMC_MA_231314, main = "MA_231314", col=bpy.colors(100))
plot(PND_AMC_MG_231314, main = "MG_231314", col=bpy.colors(100))
dev.off()
## png
## 2Medias aritmética y geométrica para fórmula 231314.
Finalmente: Pongamos nuestros rasters en una sola capa para poder mapearlos y compararlos juntos
stack_ponderacion_indicadores_0001 <-
stack(PND_AMC_MA_111111,
PND_AMC_MA_121233,
PND_AMC_MA_231314,
PND_AMC_MG_111111,
PND_AMC_MG_121233,
PND_AMC_MG_231314)
Nombres_Capas <- c("MA_111111", "MA_121233", "MA_231314", "MG_111111", "MG_121233", "MG_231314")
names(stack_ponderacion_indicadores_0001) <- Nombres_Capas
writeRaster(stack_ponderacion_indicadores_0001 ,file.path(ruta_datos,"raster_xyz/stack_ponderacion_indicadores_0001.tif" ),overwrite=TRUE)stack_ponderacion_indicadores_0001 <- raster::stack(file.path(ruta_datos,"raster_xyz/stack_ponderacion_indicadores_0001.tif"))
Nombres_Capas <- c("MA_111111", "MA_121233", "MA_231314", "MG_111111", "MG_121233", "MG_231314")
names(stack_ponderacion_indicadores_0001) <- Nombres_Capaspng(file.path(ruta_datos,"figs/stack_ponderacion_indicadores_0001.png"), units="px", width=1344, height=960, pointsize=24)
plot(stack_ponderacion_indicadores_0001, col=bpy.colors(100))
dev.off()
## png
## 2Resumen de medias aritméticas y geométricas.
Como último paso, ahora mapearemos sólamente las áreas correspondientes al 5% de mayor prioridad. Con esta función cortamos la distribución de nuestros raster en el 5% superior.
PND_AMC_MA_111111 <- raster(file.path(ruta_datos,"raster_xyz/PND_AMC_MA_111111.tif"))
PND_AMC_MA_121233 <- raster(file.path(ruta_datos,"raster_xyz/PND_AMC_MA_121233.tif"))
PND_AMC_MA_231314 <- raster(file.path(ruta_datos,"raster_xyz/PND_AMC_MA_231314.tif"))
PND_AMC_MG_111111 <- raster(file.path(ruta_datos,"raster_xyz/PND_AMC_MG_111111.tif"))
PND_AMC_MG_121233 <- raster(file.path(ruta_datos,"raster_xyz/PND_AMC_MG_121233.tif"))
PND_AMC_MG_231314 <- raster(file.path(ruta_datos,"raster_xyz/PND_AMC_MG_231314.tif"))QNT_AMC_MA_111111_Perc_5 <- quantile(PND_AMC_MA_111111, probs = c(0.95), na.rm=TRUE)
QNT_AMC_MA_121233_Perc_5 <- quantile(PND_AMC_MA_121233, probs = c(0.95), na.rm=TRUE)
QNT_AMC_MA_231314_Perc_5 <- quantile(PND_AMC_MA_231314, probs = c(0.95), na.rm=TRUE)
QNT_AMC_MG_111111_Perc_5 <- quantile(PND_AMC_MG_111111, probs = c(0.95), na.rm=TRUE)
QNT_AMC_MG_121233_Perc_5 <- quantile(PND_AMC_MG_121233, probs = c(0.95), na.rm=TRUE)
QNT_AMC_MG_231314_Perc_5 <- quantile(PND_AMC_MG_231314, probs = c(0.95), na.rm=TRUE)funReclValPerc_5 <- function(...,strval) {
ifelse(... <= strval, 0,
ifelse(... > strval, 1, NA)) }RECL_AMC_MA_111111_Perc_5 <- calc(PND_AMC_MA_111111, function(x) { funReclValPerc_5(x, strval=QNT_AMC_MA_111111_Perc_5) }, filename=file.path(ruta_datos,"raster_xyz/RECL_AMC_MA_111111_Perc_5.tif"), overwrite=TRUE)
RECL_AMC_MA_121233_Perc_5 <- calc(PND_AMC_MA_121233, function(x) { funReclValPerc_5(x, strval=QNT_AMC_MA_121233_Perc_5) }, filename=file.path(ruta_datos,"raster_xyz/RECL_AMC_MA_121233_Perc_5.tif"), overwrite=TRUE)
RECL_AMC_MA_231314_Perc_5 <- calc(PND_AMC_MA_231314, function(x) { funReclValPerc_5(x, strval=QNT_AMC_MA_231314_Perc_5) }, filename=file.path(ruta_datos,"raster_xyz/RECL_AMC_MA_231314_Perc_5.tif"), overwrite=TRUE)
RECL_AMC_MG_111111_Perc_5 <- calc(PND_AMC_MG_111111, function(x) { funReclValPerc_5(x, strval=QNT_AMC_MG_111111_Perc_5) }, filename=file.path(ruta_datos,"raster_xyz/RECL_AMC_MG_111111_Perc_5.tif"), overwrite=TRUE)
RECL_AMC_MG_121233_Perc_5 <- calc(PND_AMC_MG_121233, function(x) { funReclValPerc_5(x, strval=QNT_AMC_MG_121233_Perc_5) }, filename=file.path(ruta_datos,"raster_xyz/RECL_AMC_MG_121233_Perc_5.tif"), overwrite=TRUE)
RECL_AMC_MG_231314_Perc_5 <- calc(PND_AMC_MG_231314, function(x) { funReclValPerc_5(x, strval=QNT_AMC_MG_231314_Perc_5) }, filename=file.path(ruta_datos,"raster_xyz/RECL_AMC_MG_231314_Perc_5.tif"), overwrite=TRUE)Ahora hacemos nuevamente un raster stack y vemos los resultados.
stack_quantile_indicadores_0001 <-
stack(RECL_AMC_MA_111111_Perc_5,
RECL_AMC_MA_121233_Perc_5,
RECL_AMC_MA_231314_Perc_5,
RECL_AMC_MG_111111_Perc_5,
RECL_AMC_MG_121233_Perc_5,
RECL_AMC_MG_231314_Perc_5)
Nombres_Capas_Perc.5 <- c("MA_111111_5%", "MA_121233_5%", "MA_231314_5%", "MG_111111_5%", "MG_121233_5%", "MG_231314_5%")
names(stack_quantile_indicadores_0001) <- Nombres_Capas_Perc.5
writeRaster(stack_quantile_indicadores_0001 ,file.path(ruta_datos,"raster_xyz/stack_quantile_indicadores_0001.tif" ),overwrite=TRUE)png(file.path(ruta_datos,"figs/plot_stack_quantile_indicadores_0001.png"), units="px", width=1344, height=960, pointsize=24)
plot(stack_quantile_indicadores_0001)
dev.off()
## png
## 2Resumen de coberturas con mayor propensión a incendios.
En este trabajo se tomó en cuenta variables explicativas como, tipos de usos de la tierra, insolación, pendientes, NDVI y altitud sobre el nivel de mar, modeladas con técnicas de Evaluación Multicriterio (ECM) en R. Dado que el concepto riesgo se refiere a una condición de probabilidad, se podría agregar para el desarrollo de mejores escenarios la capa de eventos ocurridos de incendios que se han presentado en años anteriores, como por ejemplos los datos que se pueden obtener en The Fire Information for Resource Management System (FIRMS) https://firms.modaps.eosdis.nasa.gov/
Se debe advertir que no se consideró la variable viento como factor dispersor del fuego, ya que el objetivo era determinar lugares con condición favorable para desarrollarse un incendio sin mediar los factores que contribuyen en su distribución.
El estudio ha demostrado el potencial de riesgo de incendio en la zona de estudio. Lo anterior permite analizar la bondad de ajuste, en donde se corrobora que el modelo calculado se ajusta efectivamente a los datos usados para estimarlo.
Se puede observar la coincidencia de las áreas susceptibles determinadas por el modelo desarrollado en R y los datos “hotspots” de los últimos 30 días Enero y Febrero del 2021 en el sistema The Fire Information for Resource Management System (FIRMS)
Herramienta de diagnóstico FIRMS.
El modelo presenta buenos resultados ya que existe una relación directa de incendios con las diferentes categorías de riesgo establecidas. Por ello se recomienda su uso siempre y cuando exista la información disponible para poder modelar los datos según lo establecido en la metodología.
El uso de técnicas de teledetección y Análisis espacial en R demuestra ser una herramienta muy poderosa y confiable para llevar a cabo procesos de validación y contextualizar el desempeño del modelaje de los datos, además facilita el monitoreo de áreas con susceptibilidad a presentar estos eventos.