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

Antes, você aprendeu a receber cenas individuais do Landsat fazendo algo como isto, em que l8 e point são importações que representam a coleção de 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()
);

Suponha agora que você queira calcular uma imagem do Índice de Vegetação por Diferença Normalizada (NDVI) com base na imagem da Landsat. A vegetação reflete a luz na parte infravermelha próxima (NIR) do espectro eletromagnético e absorve a luz na parte vermelha. Saiba mais sobre a refletância NIR da vegetação. O NDVI usa isso para criar um único valor 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 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. Usamos a função select(), que você aprendeu na seção anterior sobre mascaramento, para receber as bandas NIR e vermelha e calcular o NDVI usando operadores matemáticos de imagem que você também viu antes na seção sobre matemática 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 da Landsat. Azul é NDVI baixo e verde é NDVI alto.

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');

Mapear uma função em uma coleção

Suponha agora que você queira adicionar o NDVI a todas as imagens em uma coleção de imagens. Para 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 todos os elementos de uma coleção. A função define as operações que serão aplicadas a cada elemento da 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 em uma função que retorne 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() e adicionar uma banda de NDVI a todas as imagens da coleção. Muitas vezes, é útil testar 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 coloca uma banda de NDVI em todas as imagens da 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 uma composição de pixels mais verdes

Agora que você criou uma coleção de imagens em que cada uma tem uma banda NDVI, podemos explorar uma nova maneira de fazer composições: qualityMosaic(). Você pode ter notado descontinuidades entre os caminhos do Landsat, mesmo no composto de pixels medianos. Isso pode acontecer devido a diferenças na fenologia, já que as imagens em caminhos adjacentes são coletadas em momentos diferentes (especificamente, com oito dias de diferença). Uma maneira de minimizar isso é tentar definir valores de pixel no composto aproximadamente na mesma fase fenológica, por exemplo, a época de maior verdor das plantas (quando as folhas estão presentes e fotossinteticamente ativas). Se definirmos o máximo de verdor como o NDVI máximo, poderemos usar qualityMosaic() para criar um mosaico em que cada pixel contém o pixel de NDVI máximo da coleção. Agora você pode usar a banda NDVI adicionada na sua 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. Comparando a Figura 9 com a composição mediana mostrada na Figura 6, observe que a composição de pixels mais verde é muito mais verde. No entanto, uma análise mais detalhada dos corpos d'água pode revelar um problema diferente. Especificamente, os corpos d'água agora aparecem nublados. Isso acontece 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 nuvens do que sobre água, as áreas de água recebem pixels nublados, enquanto as áreas vegetadas aparecem verdes porque o NDVI é maior quando a vegetação no pixel está fotossinteticamente ativa.

Tutorial_api_09_greenest.png
Figura 9. Composição de pixels mais verdes do Landsat 8.

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