Quantificare i cambiamenti forestali

Iniziamo con il calcolo necessario per creare una banda che mostri i pixel in cui i dati di Hansen et al. mostrano sia perdita che guadagno.

Il set di dati Hansen et al. ha una banda i cui pixel sono 1 in caso di perdita e 0 altrimenti (loss) e una banda che è 1 in caso di guadagno e 0 altrimenti (gain). Per creare una banda in cui i pixel di entrambe le bande loss e gain hanno un valore pari a 1, puoi utilizzare il metodo logico and() sulle immagini. Il metodo and() viene chiamato come image1.and(image2) e restituisce un'immagine in cui i pixel sono 1 dove sia image1 che image2 sono 1 e 0 altrove:

Editor di codice (JavaScript)

// Load the data and select the bands of interest.
var gfc2014 = ee.Image('UMD/hansen/global_forest_change_2015');
var lossImage = gfc2014.select(['loss']);
var gainImage = gfc2014.select(['gain']);

// Use the and() method to create the lossAndGain image.
var gainAndLoss = gainImage.and(lossImage);

// Show the loss and gain image.
Map.addLayer(gainAndLoss.updateMask(gainAndLoss),
    {palette: 'FF00FF'}, 'Gain and Loss');

Il risultato, con lo zoom sull'Arkansas e la visualizzazione satellitare, dovrebbe essere simile alla Figura 1.

Loss Arkansas
Figura 1. Pixel con perdita e aumento di foreste in Arkansas.

Combinando questo esempio con il risultato della sezione precedente, ora è possibile ricreare la figura dell'inizio del tutorial:

Editor di codice (JavaScript)

// Displaying forest, loss, gain, and pixels where both loss and gain occur.
var gfc2014 = ee.Image('UMD/hansen/global_forest_change_2015');
var lossImage = gfc2014.select(['loss']);
var gainImage = gfc2014.select(['gain']);
var treeCover = gfc2014.select(['treecover2000']);

// Use the and() method to create the lossAndGain image.
var gainAndLoss = gainImage.and(lossImage);

// Add the tree cover layer in green.
Map.addLayer(treeCover.updateMask(treeCover),
    {palette: ['000000', '00FF00'], max: 100}, 'Forest Cover');

// Add the loss layer in red.
Map.addLayer(lossImage.updateMask(lossImage),
    {palette: ['FF0000']}, 'Loss');

// Add the gain layer in blue.
Map.addLayer(gainImage.updateMask(gainImage),
    {palette: ['0000FF']}, 'Gain');

// Show the loss and gain image.
Map.addLayer(gainAndLoss.updateMask(gainAndLoss),
    {palette: 'FF00FF'}, 'Gain and Loss');

Quantificare il cambiamento della foresta in una regione di interesse

Ora che hai più familiarità con le bande nel set di dati di Hansen et al., possiamo utilizzare i concetti appresi finora per calcolare le statistiche sul guadagno e sulla perdita di foreste in una regione di interesse. Per questo, dovremo utilizzare dati vettoriali (punti, linee e poligoni). Un set di dati vettoriali è rappresentato come un FeatureCollection in Earth Engine. (Scopri di più sulle raccolte di funzionalità e su come importare dati vettoriali.)

In questa sezione, confronteremo la quantità totale di perdita di foreste che si è verificata nella Repubblica del Congo nel 2012 con la quantità di perdita di foreste che si è verificata nelle aree protette del paese nello stesso periodo.

Come hai appreso nel tutorial sull'API Earth Engine, il metodo chiave per calcolare le statistiche in una regione di un'immagine è reduceRegion(). (Scopri di più sulla riduzione delle regioni delle immagini.) Ad esempio, supponiamo di voler calcolare il numero di pixel stimati per rappresentare la perdita di foreste durante il periodo di studio. A questo scopo, considera il seguente codice:

Editor di codice (JavaScript)

// Load country features from Large Scale International Boundary (LSIB) dataset.
var countries = ee.FeatureCollection('USDOS/LSIB_SIMPLE/2017');

// Subset the Congo Republic feature from countries.
var congo = countries.filter(ee.Filter.eq('country_na', 'Rep of the Congo'));

// Get the forest loss image.
var gfc2014 = ee.Image('UMD/hansen/global_forest_change_2015');
var lossImage = gfc2014.select(['loss']);

// Sum the values of forest loss pixels in the Congo Republic.
var stats = lossImage.reduceRegion({
  reducer: ee.Reducer.sum(),
  geometry: congo,
  scale: 30
});
print(stats);

Questo esempio utilizza il riduttore ee.Reducer.sum() per sommare i valori dei pixel in lossImage all'interno della caratteristica congo. Poiché lossImage è costituito da pixel con valore 1 o 0 (rispettivamente per perdita o non perdita), la somma di questi valori equivale al numero di pixel di perdita nella regione.

Purtroppo, l'esecuzione dello script così com'è genera un errore simile a questo:

Il numero massimo predefinito di pixel in reduceRegion() è 10 milioni. Questo messaggio di errore indica che la Repubblica del Congo copre circa 383 milioni di pixel Landsat. Fortunatamente, reduceRegion() accetta molti parametri, uno dei quali (maxPixels) consente di controllare il numero di pixel utilizzati nel calcolo. La specifica di questo parametro consente il completamento del calcolo:

Editor di codice (JavaScript)

// Load country features from Large Scale International Boundary (LSIB) dataset.
var countries = ee.FeatureCollection('USDOS/LSIB_SIMPLE/2017');

// Subset the Congo Republic feature from countries.
var congo = countries.filter(ee.Filter.eq('country_na', 'Rep of the Congo'));

// Get the forest loss image.
var gfc2014 = ee.Image('UMD/hansen/global_forest_change_2015');
var lossImage = gfc2014.select(['loss']);

// Sum the values of forest loss pixels in the Congo Republic.
var stats = lossImage.reduceRegion({
  reducer: ee.Reducer.sum(),
  geometry: congo,
  scale: 30,
  maxPixels: 1e9
});
print(stats);

Espandendo l'oggetto stampato nella console, osserva che il risultato è 4897933 pixel di foresta persi. Puoi pulire un po' la stampa nella console etichettando l'output e ottenendo il risultato di interesse dal dizionario restituito da reduceRegion():

Editor di codice (JavaScript)

print('pixels representing loss: ', stats.get('loss'));

Calcolo delle aree dei pixel

Stai per rispondere alla domanda su quanta superficie è stata persa nella Repubblica del Congo e quanta di questa si trovava in aree protette. La parte rimanente consiste nel convertire i pixel in area effettiva. Questa conversione è importante perché non conosciamo necessariamente le dimensioni dei pixel inseriti in reduceRegion(). Per facilitare il calcolo delle aree, Earth Engine dispone del metodo ee.Image.pixelArea(), che genera un'immagine in cui il valore di ogni pixel è l'area del pixel in metri quadrati. Moltiplicando l'immagine della perdita per questa immagine dell'area e poi sommando il risultato, otteniamo una misura dell'area:

Editor di codice (JavaScript)

// Load country features from Large Scale International Boundary (LSIB) dataset.
var countries = ee.FeatureCollection('USDOS/LSIB_SIMPLE/2017');

// Subset the Congo Republic feature from countries.
var congo = countries.filter(ee.Filter.eq('country_na', 'Rep of the Congo'));

// Get the forest loss image.
var gfc2014 = ee.Image('UMD/hansen/global_forest_change_2015');
var lossImage = gfc2014.select(['loss']);
var areaImage = lossImage.multiply(ee.Image.pixelArea());

// Sum the values of forest loss pixels in the Congo Republic.
var stats = areaImage.reduceRegion({
  reducer: ee.Reducer.sum(),
  geometry: congo,
  scale: 30,
  maxPixels: 1e9
});
print('pixels representing loss: ', stats.get('loss'), 'square meters');

Ora il risultato è di 4.372.575.052 metri quadrati persi nel periodo di studio.

Ora puoi rispondere alla domanda all'inizio di questa sezione: quanti ettari di foresta sono stati persi nella Repubblica del Congo nel 2012 e quanti si trovavano in aree protette?

Editor di codice (JavaScript)

// Load country features from Large Scale International Boundary (LSIB) dataset.
var countries = ee.FeatureCollection('USDOS/LSIB_SIMPLE/2017');

// Subset the Congo Republic feature from countries.
var congo = ee.Feature(
  countries
    .filter(ee.Filter.eq('country_na', 'Rep of the Congo'))
    .first()
);

// Subset protected areas to the bounds of the congo feature
// and other criteria. Clip to the intersection with congo.
var protectedAreas = ee.FeatureCollection('WCMC/WDPA/current/polygons')
  .filter(ee.Filter.and(
    ee.Filter.bounds(congo.geometry()),
    ee.Filter.neq('IUCN_CAT', 'VI'),
    ee.Filter.neq('STATUS', 'proposed'),
    ee.Filter.lt('STATUS_YR', 2010)
  ))
  .map(function(feat){
    return congo.intersection(feat);
  });

// Get the loss image.
var gfc2014 = ee.Image('UMD/hansen/global_forest_change_2015');
var lossIn2012 = gfc2014.select(['lossyear']).eq(12);
var areaImage = lossIn2012.multiply(ee.Image.pixelArea());

// Calculate the area of loss pixels in the Congo Republic.
var stats = areaImage.reduceRegion({
  reducer: ee.Reducer.sum(),
  geometry: congo.geometry(),
  scale: 30,
  maxPixels: 1e9
});
print(
  'Area lost in the Congo Republic:',
  stats.get('lossyear'),
  'square meters'
);

// Calculate the area of loss pixels in the protected areas.
var stats = areaImage.reduceRegion({
  reducer: ee.Reducer.sum(),
  geometry: protectedAreas.geometry(),
  scale: 30,
  maxPixels: 1e9
});
print(
  'Area lost in protected areas:',
  stats.get('lossyear'),
  'square meters'
);

L'output indica che dei 348.036.295 metri quadrati di foresta persi nella Repubblica del Congo nel 2012, 11.880.976 si trovavano in aree protette, come rappresentato nella tabella del World Database on Protected Areas.

Le uniche modifiche tra questo script e quello precedente sono l'aggiunta delle informazioni sull'area protetta e la modifica dello script, che non prende più in considerazione la perdita complessiva, ma la perdita nel 2012. Per questo sono state necessarie due modifiche. Innanzitutto, c'è una nuova immagine lossIn2012 che ha un valore pari a 1 dove è stata registrata una perdita nel 2012 e 0 altrimenti. In secondo luogo, poiché il nome della band è diverso (lossyear anziché loss), il nome della proprietà è dovuto cambiare nell'istruzione di stampa.

Nella sezione successiva, esploreremo alcuni metodi avanzati per calcolare e rappresentare graficamente la perdita di foreste per ogni anno, anziché per un solo anno come abbiamo fatto in questa sezione.