pacman::p_load(
  rgeoboundaries,
  terra,         # For working with raster data
  exactextractr, # To extract raster data grouping it by sf polygons
  sf,
  maptiles,      # To get tile maps
  tmap,
  tidyverse,
  tidyterra) # To map raster files as they are without turning 
  # them into dataframes 

terraOptions(progress=0) # Per a no veure la barra de progrés
#=======================================
# EXTRACCIÓ DE LES DADES
#=======================================


#===========================
# 1. MUNICIPIS SF
#===========================

mun_cat <- st_read(
  "MapaMun/divisions-administratives-v2r1-municipis-1000000-20240118.shp")
## Reading layer `divisions-administratives-v2r1-municipis-1000000-20240118' from data source `C:\DataPortatil\Laboratori_R\Mapes\deforestation\MapaMun\divisions-administratives-v2r1-municipis-1000000-20240118.shp' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 947 features and 13 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: 260160.2 ymin: 4488767 xmax: 527397.6 ymax: 4747976
## Projected CRS: ETRS89 / UTM zone 31N
mun_cat <- st_transform(mun_cat, crs = 4326) # Projecció del raster

mun_emp <- mun_cat %>% 
  filter(NOMCOMAR== "Alt Empordà")

#plot(sf::st_geometry(mun_emp))

comar_cat <- st_read( # Mapes comarques de Catalunya
  "MapaComarc/shapefiles_catalunya_comarcas.shp")
## Reading layer `shapefiles_catalunya_comarcas' from data source 
##   `C:\DataPortatil\Laboratori_R\Mapes\deforestation\MapaComarc\shapefiles_catalunya_comarcas.shp' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 41 features and 5 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: 0.1594132 ymin: 40.52303 xmax: 3.332542 ymax: 42.8615
## Geodetic CRS:  WGS 84
comar_cat <- sf::st_transform(comar_cat, crs = 'EPSG:25831')


#===============================
# 2. FOREST DATA
#===============================


# ----------------
# From https://glad.umd.edu/
# https://glad.earthengine.app/view/global-forest-change#bl=off;old=off;dl=1;lon=-50.0283874235115;lat=27.905882522562944;zoom=4;
#----------------

# COBERTURA ARBRES L'ANY 2000
# https://storage.googleapis.com/earthenginepartners-hansen/GFC-2023-v1.11/Hansen_GFC-2023-v1.11_treecover2000_50N_000E.tif

# PERDUES DE COBERTURA DES DE 2000
# https://storage.googleapis.com/earthenginepartners-hansen/GFC-2023-v1.11/Hansen_GFC-2023-v1.11_lossyear_50N_000E.tif


var <- c(
  "treecover2000", "lossyear"
)

urls <- paste0(
  "https://storage.googleapis.com/earthenginepartners-hansen/GFC-2023-v1.11/Hansen_GFC-2023-v1.11_",
  var,
  "_50N_000E.tif"
)

forest_data <- lapply(
  urls, terra::rast # It loads raster files into R
)

#==============================
# 3. CROP DATA: ENCAIXAR LES DADES DEL RASTER EN LES COORDENADES DE MAPA
#    VECTORIAL DE CATALUNYA
#==============================

# Crop the forest data only for Catalonia
# terra::crop takes the raster files and crop them for the extent we choose
cat_data <- lapply(
  forest_data,
  function(x) {
    terra::crop( 
      x,
      terra::vect(mun_cat)
    )
  }
)

El Global Land Analysis and Discovery (GLAD)

El laboratori Global Land Analysis and Discovery (GLAD) del Departament de Ciències Geogràfiques de la Universitat de Maryland investiga mètodes, causes i impactes del canvi global de la superfície terrestre. Les imatges d’observació de la Terra són la font principal de dades i la cobertura terrestre els seus canvies en són el tema d’interès principal.

Global Forest Change 2000-2023

El laboratori Global Land Analysis and Discovery (GLAD) de la Universitat de Maryland, en col·laboració amb Global Forest Watch (GFW), proporciona dades de pèrdua de boscos a escala global actualitzades anualment, derivades mitjançant imatges de sèries temporals de Landsat. Aquestes dades, són un indicador relatiu de les tendències espaciotemporals de la dinàmica de pèrdua de boscos a nivell mundial.

Els responsebles de les dades alerten d’algunes inconsistències que poden contenir, degudes a canvis tecnològics que van haver-hi durant el període que en tot cas mantenen la seva validesa en la identificació de tendències duran el període.

Els arbres es defineixen com a vegetació de més de 5 m d’alçada i s’expressen com a percentatge per cel·la de la quadrícula de sortida com a “percentuale de cobertura d’arbres de l’any 2000”.

La “pèrdua de coberta forestal” es defineix com una pertorbació de substitució, o un canvi d’un estat forestal a un estat no forestal, durant el període 2001-2023.

Les dades de Global Forest Change per a Catalunya

Com ja hem fet al capítol anterior, assaigem per tant aquestes dades per al territori català generant diferents mapes temàtics.

Superfície forestal a Catalunya l’any 2000

cat_data[[1]][cat_data[[1]] < 1 ] = NA 

# aggregate() to decrease size of the raster in this case one half ('fact=2' by default)
bosc_2000 <- terra::aggregate(cat_data[[1]], fun="mean")

tmap_mode("view")

tm_shape(bosc_2000)+
  tm_raster(alpha = .7,
            n= 5,
            breaks = c(1,20,40,60,80,100),
            palette = c("grey90","darkgreen"),
            legend.format = list(text.separator= '-'),
            title = "Densitat forestal l'any 2000 (%)") +
tm_shape(comar_cat) +
  tm_polygons(id= "nom_comar",
              alpha = 0,
              popup.vars=c("Superfície comarcal (km2): "= "sup_comar"),
              popup.format = list(sup_comar= list(big.mark = ".",
                                                  decimal.mark= ",",
                                                  digits= 1)),
              border.col = "grey35",
              lwd= 2.2) +
tmap_options(basemaps = "CartoDB",
             alpha= 1)+
 tmap_options(max.raster = 1e8)

La primera dada que ens facilita aquesta font és la cobertura forestal l’any 2000. El primer mapa ubica la cobertura forestal/arbrada cuantificant-ne la densitat (en %), l’any 2000 que és el punt 0 per a determinar els canvis posteriors.

La segona dada és la ubicació de la pèrdua i l’any que es produeix. Així en el segon mapa, ubiquem la cobertura forestal de 2000, sobreposant-hi les zones on la cobertura s’ha perdut durant el període 2000-2023.

Hi hauria una tercera dada que se’ns facilita que seria les recuperacions de cobertura que s’esdevenen, però només les d’entre 2001 i 2012. No l’utilitzem per l’evident desequilibti que hi hauria amb les dades de pèrdues que cobreixen tot el període.

Visualitarem bosc inicial i pèrdues utilitzant el mode interactiu que permet apropar la imatge per identificar millor les ubicacions i valorar millor l’abast de la perdua. Si juguem amb les capes (a dalt a l’esquerra) veurem com les cel·les de les pèrdues se sobreposen a ubicacions de bosc.

Superfície forestal 2000 i pèrdues en el període 2001-2023

# 4. DEFORESTATION YEARS IN ONE GROUP (1-23)
#---------------------------------------

cat_data[[2]][cat_data[[2]] < 1 ] = NA

# aggregate() to decrease size of the raster in this case one half (fact=2)
bosc_perdut <- terra::aggregate(cat_data[[2]], fun="mean")


tmap_mode("view")



tm_shape(bosc_2000) + 
  tm_raster(
    alpha = 0.6,
    n= 2,
    breaks = c(1,100),
    palette = c("#287233"),
    labels = "Any 2000",
    legend.format = list(text.separator= '-'),
    title = "Presència de bosc"
  )+         
tm_shape(bosc_perdut)+
  tm_raster(
    alpha = 0.75,
    n= 1,
    breaks = c(1,23),
    palette = c("#fe0000"),
    labels = c("2001-2023"),
    legend.format = list(text.separator= '-'),
    title = "Pèrdues forestals"
  ) +
tm_shape(mun_cat)+
  tm_polygons(id= "NOMMUNI",
              alpha = 0,
              popup.vars=c("Comarca: "= "NOMCOMAR",
                           "Superfície municipi (km2): "= "AREAM5000"),
              popup.format = list(AREAM5000= list(big.mark = ".",
                                                  decimal.mark= ",",
                                                  digits= 1)),
              border.col = "grey70",
              lwd= .8)+
tm_shape(comar_cat)+
  tm_borders(col = "steelblue",
             lwd=1.6)

Mapes agregats per municipi de deforestació

En tot cas, tot i ser unes visualitzacions interessants, com ja hem vist en la nota tècnica anterior, si volem obtenir dades útils per a valorar indicadors agregats per municipis, hem de sumar les superfícies per unitats administratives.

Això ens permetrà obtenir dos tipus de dades: una absoluta, de la deforestació en \(km^2\) per a cada municipi i una segona, relativa, de la fracció deforestada respecte a la cobertura inicial (any 2000).

Pèrdua de superfície forestal/arbrada durant el període 2001-2023 en km2

#================================================
# extr_bosc_2000: extensió de bosc any 2000
#================================================

#extr_bosc2000 <- exactextractr::exact_extract(
#      cat_data[[1]],
#      mun_cat,
#      function(df) {
#        df |>
#          dplyr::group_by(
#            CODIMUNI
#          ) |>
#          dplyr::summarize(
#            bosc.area_km2 = sum(
#              coverage_area[!is.na(value)] / 1e6 # https://www.arcgis.com/home/item.html?id=cfcb7609de5f478eb7666240902d4d3d
#            )
#          )
#      },
#      summarize_df = T,      
#      coverage_area = T,
#      include_cols = "CODIMUNI"
#    )

#===================================================
# 1. OPCIÓ 2: RECUPERANT DADES JA GENERADES (MÉS RÀPID)
#===================================================

#writexl::write_xlsx(extr_bosc2000, "extr_bosc2000.xlsx")

extr_bosc2000 <- readxl::read_xlsx("extr_bosc2000.xlsx")


#================================================
# extr_perdues: perdues de bosc totals 2001-20023
#================================================

#extr_perdues <- exactextractr::exact_extract(
#      cat_data[[2]],
#      mun_cat,
#      function(df) {
#        df |>
#          dplyr::group_by(
#            CODIMUNI
#          ) |>
#          dplyr::summarize(
#            perdues.area_km2 = sum(
#              coverage_area[value %in% c(1:23)] / 1e6 # https://www.arcgis.com/home/item.html?id=cfcb7609de5f478eb7666240902d4d3d
#            )
#          )
#      },
#      summarize_df = T,      
#      coverage_area = T,
#      include_cols = "CODIMUNI"
#    )

#=====================================================
# 1. OPCIÓ 2: RECUPERANT DADES JA GENERADES (MÉS RÀPID)
#=====================================================

#writexl::write_xlsx(extr_perdues, "extr_perdues.xlsx")

extr_perdues <- readxl::read_xlsx("extr_perdues.xlsx")

#=====================================================
# 2. DATAFRAME DE COBERTURA FORESTAL I PÈRDUA FORESTAL
#=====================================================

perdues_bosc_df <- mun_cat %>% 
  inner_join(extr_bosc2000, by= "CODIMUNI") %>%
  inner_join(extr_perdues, by= "CODIMUNI") %>% 
  mutate(frac_perduda= ifelse(
    round(perdues.area_km2 / bosc.area_km2 * 100,1)>100, NA,
      round(perdues.area_km2 / bosc.area_km2 * 100,1)))

tmap_mode("view")

tm_shape(perdues_bosc_df)+
  tm_fill(col="perdues.area_km2",
          id="NOMMUNI",
          #style = "fixed",
          #n=5,
          #breaks = c(0,50,100,1000,2000,5000),
          palette = c("papayawhip","darkred"),
          title = "Superfície forestal/arbrada <br> perduda: anys 2000-2023 ",
          alpha= 1,
          legend.format = list(text.separator= '-'),
          textNA = 'Sense dades',
          popup.vars=c("Superfície perduda (km2)"= "perdues.area_km2",
                       "Superfície forestal any 2000 (km2): "= "bosc.area_km2",
                       "Superficie total del municipi: "= "AREAM5000"),
          popup.format = list(perdues.area_km2= list(digits= 1),
                              bosc.area_km2= list(digits= 1),
                              AREAM5000= list(digits= 1))
          )+
  tm_borders(col="grey40",lwd=0.5) +
  tmap_options(basemaps = "Esri.WorldImagery",
               basemaps.alpha = 1)

Pèrdua relàtiva de superfície forestal/arbrada durant el període 2001-2023 en %

tmap_mode("view")

tm_shape(perdues_bosc_df)+
  tm_fill(col="frac_perduda",
          id="NOMMUNI",
          #style = "fixed",
          #n=5,
          breaks = c(0,5,10,20,50,100),
          palette = c("papayawhip","darkred"),
          title = "% Superfície forestal/arbrada <br> perduda: anys 2000-2023 ",
          alpha= 1,
          legend.format = list(text.separator= '-'),
          textNA = 'Sense dades',
          popup.vars=c("Fracció superfície perduda (%): "= "frac_perduda",
                       "Superfície perduda (km2)"= "perdues.area_km2",
                       "Superfície forestal any 2000 (km2): "= "bosc.area_km2",
                       "Superficie total del municipi: "= "AREAM5000"),
          popup.format = list(frac_perduda= list(digits=2),
                              perdues.area_km2= list(digits= 1),
                              bosc.area_km2= list(digits= 1),
                              AREAM5000= list(digits= 1))
          )+
  tm_borders(col="grey40",lwd=0.5) +
  tmap_options(basemaps = "Esri.WorldImagery",
               basemaps.alpha = 1)

Conclusions

Les dades aportades són segurament significatives, fins i tot impactants, diríem. Tanmateix per a poder-les fer servir per construir un indicador vàlid, actualment presenten una incompletesa -la de no disposar de dades de reforestació del mateix periode de les de la deforestació- que comptem que en un futur pròxim es podrà obviar.