Quantificando a mudança na floresta

Vamos começar com o cálculo necessário para criar uma faixa que mostre pixels em que os dados de Hansen et al. mostram perda e ganho.

O conjunto de dados de Hansen et al. tem uma banda em que os pixels são 1 quando há perda e 0 caso contrário (loss) e outra banda em que os pixels são 1 quando há ganho e 0 caso contrário (gain). Para criar uma banda em que os pixels nas bandas loss e gain sejam 1, use o método lógico and() em imagens. O método and() é chamado como image1.and(image2) e retorna uma imagem em que os pixels são 1 quando image1 e image2 são 1, e 0 em outros casos:

Editor de código (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');

O resultado, com zoom no Arkansas e na visualização de satélite, será parecido com a Figura 1.

Perda de Arkansas
Figura 1. Pixels com perda e ganho de floresta no Arkansas.

Combinando este exemplo com o resultado da seção anterior, agora é possível recriar a figura do início do tutorial:

Editor de código (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');

Quantificar a mudança na floresta em uma região de interesse

Agora que você conhece melhor as bandas no conjunto de dados de Hansen et al., podemos usar os conceitos aprendidos até agora para calcular estatísticas sobre o ganho e a perda de florestas em uma região de interesse. Para isso, vamos usar dados vetoriais (pontos, linhas e polígonos). Um conjunto de dados vetoriais é representado como um FeatureCollection no Earth Engine. Saiba mais sobre coleções de recursos e como importar dados de vetores.

Nesta seção, vamos comparar a quantidade total de perda de floresta que ocorreu na República do Congo em 2012 com a quantidade de perda de floresta que ocorreu nas áreas protegidas do país ao mesmo tempo.

Como você aprendeu no tutorial da API Earth Engine, o método principal para calcular estatísticas em uma região de imagem é reduceRegion(). (Saiba mais sobre como reduzir regiões de imagem.) Por exemplo, suponha que queremos calcular o número de pixels estimados para representar a perda de floresta durante o período do estudo. Para isso, considere o seguinte código:

Editor de código (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);

Este exemplo usa o redutor ee.Reducer.sum() para somar os valores dos pixels em lossImage no recurso congo. Como lossImage consiste em pixels com valor 1 ou 0 (para perda ou não perda, respectivamente), a soma desses valores é equivalente ao número de pixels de perda na região.

Infelizmente, executar o script como ele está resulta em um erro como:

O número máximo padrão de pixels em reduceRegion() é de 10 milhões. Essa mensagem de erro indica que a República do Congo cobre cerca de 383 milhões de pixels do Landsat. Felizmente, o reduceRegion() usa muitos parâmetros, um deles (maxPixels) permite controlar quantos pixels são usados no cálculo. Especificar esse parâmetro permite que o cálculo seja concluído:

Editor de código (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);

Ao expandir o objeto impresso no console, observe que o resultado é de 4.897.933 pixels de floresta perdidos. É possível limpar um pouco a impressão no console rotulando a saída e recebendo o resultado de interesse do dicionário retornado por reduceRegion():

Editor de código (JavaScript)

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

Como calcular áreas de pixels

Você está quase pronto para responder à pergunta sobre a quantidade de área perdida na República do Congo e quanto disso estava em áreas protegidas. A parte restante é converter pixels em área real. Essa conversão é importante porque não sabemos necessariamente o tamanho dos pixels inseridos em reduceRegion(). Para ajudar a calcular áreas, o Earth Engine tem o método ee.Image.pixelArea(), que gera uma imagem em que o valor de cada pixel é a área do pixel em metros quadrados. Multiplicar a imagem de perda pela imagem de área e somar o resultado nos dá uma medida de área:

Editor de código (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');

Agora, o resultado é de 4.372.575.052 metros quadrados perdidos durante o período do estudo.

Agora você já pode responder à pergunta no início desta seção: qual foi a área de floresta perdida na República do Congo em 2012 e quanto disso estava em áreas protegidas?

Editor de código (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'
);

A saída indica que, dos 348.036.295 metros quadrados de floresta perdidos na República do Congo em 2012, 11.880.976 estavam em áreas protegidas, conforme representado na tabela do Banco de Dados Mundial de Áreas Protegidas.

As únicas mudanças entre este script e o anterior são a adição das informações da área protegida e a mudança do script para analisar a perda em 2012 em vez da perda geral. Isso exigiu duas mudanças. Primeiro, há uma nova imagem lossIn2012 com um 1 onde a perda foi registrada em 2012 e 0 caso contrário. Segundo, como o nome da banda é diferente (lossyear em vez de loss), o nome da propriedade precisou mudar na instrução de impressão.

Na próxima seção, vamos conhecer alguns métodos avançados para calcular e representar a perda de floresta a cada ano, em vez de apenas um ano, como fizemos nesta seção.