NDVI, mapeamento de uma função em uma coleção, mosaico de qualidade

Anteriormente, você aprendeu a acessar cenas individuais do Landsat fazendo algo como isto, em que l8 e point são importações que representam a coleção TOA do Landsat 8 e uma geometria de área de interesse:

Editor de código (JavaScript)

// Define a point of interest. Use the UI Drawing Tools to import a point
// geometry and name it "point" or set the point coordinates with the
// ee.Geometry.Point() function as demonstrated here.
var point = ee.Geometry.Point([-122.292, 37.9018]);

// Import the Landsat 8 TOA image collection.
var l8 = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA');

// Get the least cloudy image in 2015.
var image = ee.Image(
  l8.filterBounds(point)
    .filterDate('2015-01-01', '2015-12-31')
    .sort('CLOUD_COVER')
    .first()
);

Agora, suponha que você queira calcular uma imagem do Índice de Vegetação por Diferença Normalizada (NDVI, na sigla em inglês) com base na imagem do Landsat. A vegetação reflete a luz na parte do infravermelho próximo (NIR, na sigla em inglês) do espectro eletromagnético e absorve a luz na parte vermelha (saiba mais sobre a reflectância NIR da vegetação). O NDVI usa isso para criar um valor único que reflete aproximadamente a atividade fotossintética que ocorre em um pixel. O cálculo é (NIR - vermelho) / (NIR + vermelho). Isso resulta em um número entre 1 e -1, em que os pixels com alta atividade fotossintética têm um NDVI alto. Esta é uma maneira de calcular o NDVI no Earth Engine:

Editor de código (JavaScript)

// Compute the Normalized Difference Vegetation Index (NDVI).
var nir = image.select('B5');
var red = image.select('B4');
var ndvi = nir.subtract(red).divide(nir.add(red)).rename('NDVI');

// Display the result.
Map.centerObject(image, 9);
var ndviParams = {min: -1, max: 1, palette: ['blue', 'white', 'green']};
Map.addLayer(ndvi, ndviParams, 'NDVI image');

O resultado será parecido com a Figura 8. Observe que usamos a função select(), que você aprendeu na seção anterior sobre mascaramento, para obter as bandas NIR e vermelha e, em seguida, calcular o NDVI usando operadores matemáticos de imagem que você também já viu na seção sobre matemática do Image. Por fim, mostre a imagem com uma paleta. Aqui, usamos nomes de cores em vez de strings hexadecimais na paleta. Consulte esta referência externa sobre cores CSS para mais detalhes.

Tutorial_api_08_ndvi.png
Figura 8. NDVI para uma única cena do Landsat. Azul é baixo e verde é alto NDVI.

A operação de diferença normalizada é tão comum no sensoriamento remoto que há uma função de atalho em um ee.Image que é útil para simplificar o código no exemplo anterior:

Editor de código (JavaScript)

var ndvi = image.normalizedDifference(['B5', 'B4']).rename('NDVI');

Como mapear uma função em uma coleção

Agora, suponha que você queira adicionar o NDVI a todas as imagens de uma coleção. A maneira de fazer isso no Earth Engine é map() uma função na coleção. Não confunda map() com o objeto Map. O primeiro é um método em uma coleção e usa map no sentido de computação paralela de aplicar uma função a cada elemento em uma coleção. A função define as operações que serão aplicadas a cada elemento na coleção. Você já viu uma função simples no tutorial de JavaScript, mas agora vamos criar uma função que inclui a funcionalidade do Earth Engine. Por exemplo, copie o código NDVI anterior para uma função que retorna a imagem de entrada com uma banda NDVI:

Editor de código (JavaScript)

var addNDVI = function(image) {
  var ndvi = image.normalizedDifference(['B5', 'B4']).rename('NDVI');
  return image.addBands(ndvi);
};

// Test the addNDVI function on a single image.
var ndvi = addNDVI(image).select('NDVI');

Esse código pode não ser tão eficiente para calcular o NDVI de uma única imagem, mas essa função pode ser usada como um argumento para map() para adicionar uma banda de NDVI a cada imagem na coleção. Muitas vezes, é útil testar primeiro uma função em uma única imagem para garantir que ela esteja se comportando como esperado. Depois de testar a função em uma imagem individual e determinar que ela faz o que você quer, é possível mapeá-la na coleção:

Editor de código (JavaScript)

var withNDVI = l8.map(addNDVI);

Para verificar se isso realmente está colocando uma banda NDVI em cada imagem dessa coleção, adicione a coleção withNDVI ao mapa e consulte um local aleatório com a guia Inspector. Cada imagem na coleção agora tem uma banda chamada NDVI.

Criar um composto de pixel mais verde

Agora que você criou uma coleção de imagens em que cada imagem tem uma banda NDVI, podemos explorar uma nova maneira de criar compostos: qualityMosaic(). Você deve ter notado descontinuidades entre os caminhos do Landsat, mesmo na composição de pixel mediano. Parte do motivo para isso pode ser devido a diferenças na fenologia como resultado de imagens em caminhos adjacentes sendo coletadas em momentos diferentes (especificamente, com 8 dias de diferença). Uma maneira de minimizar isso é tentar definir valores de pixel no composto do mesmo estágio fenológico, por exemplo, o momento de máxima verdura das plantas (quando as folhas estão presentes e fotossinteticamente ativas). Se definirmos o máximo de verdor pelo NDVI máximo, podemos usar qualityMosaic() para criar um composto em que cada pixel contém o pixel de NDVI máximo da coleção. Agora você pode usar a banda NDVI adicionada na coleção withNDVI:

Editor de código (JavaScript)

// Make a "greenest" pixel composite.
var greenest = withNDVI.qualityMosaic('NDVI');

// Display the result.
var visParams = {bands: ['B4', 'B3', 'B2'], max: 0.3};
Map.addLayer(greenest, visParams, 'Greenest pixel composite');

O resultado desse código será parecido com a Figura 9. Ao comparar a Figura 9 com o composto mediano mostrado na Figura 6, observe que o composto de pixel mais verde é, de fato, muito mais verde. No entanto, uma análise mais detalhada dos corpos d'água revela um problema diferente. Especificamente, os corpos d'água agora aparecem turvos. Isso ocorre devido à forma como o método qualityMosaic() funciona: em cada local, toda a série temporal é examinada, e o pixel com o valor máximo na banda NDVI é definido como o valor composto. Como o NDVI é maior sobre as nuvens do que sobre a água, as áreas de água recebem pixels nublados, enquanto as áreas com vegetação aparecem verdes, porque o NDVI é mais alto quando a vegetação no pixel é fotossinteticamente ativa.

Tutorial_api_09_greenest.png
Figura 9. Composição de pixel mais verde do Landsat 8.

Agora você já conhece várias maneiras de criar imagens compostas e mosaicos no Earth Engine. É possível criar composições de valor recente, mediana ou pixel mais verde com base em imagens filtradas por horário e local ou em todas as imagens da coleção. Você aprendeu a fazer cálculos nas imagens e extrair informações. A próxima página aborda maneiras de extrair informações do Earth Engine, por exemplo, como um gráfico ou um conjunto de dados exportado para sua pasta do Google Drive.