NDVI, Mapping a Function over a Collection, Quality Mosaicking

Anteriormente, aprendiste a obtener escenas individuales de Landsat con un código como este, en el que l8 y point son importaciones que representan la colección de TOA de Landsat 8 y una geometría de área de interés:

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

Supongamos ahora que deseas calcular una imagen del índice de vegetación de diferencia normalizada (NDVI) a partir de la imagen de Landsat. La vegetación refleja la luz en la parte del infrarrojo cercano (NIR) del espectro electromagnético y absorbe la luz en la parte roja (obtén más información sobre la reflectancia NIR de la vegetación). El NDVI usa esto para crear un valor único que refleje aproximadamente la actividad fotosintética que se produce en un píxel. El cálculo es (NIR - rojo) / (NIR + rojo). Esto da como resultado un número entre 1 y -1, en el que los píxeles con una alta actividad fotosintética tienen un NDVI alto. Esta es una forma de calcular el NDVI en 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');

El resultado debería ser similar al de la Figura 8. Ten en cuenta que usamos la función select() que aprendiste en la sección anterior sobre enmascaramiento para obtener las bandas NIR y roja, y, luego, calcular el NDVI con operadores matemáticos de imágenes que también viste antes en la sección sobre operaciones matemáticas de Image. Por último, muestra la imagen con una paleta. Aquí, usamos nombres de colores en lugar de cadenas hexadecimales en la paleta. (Consulta esta referencia externa sobre el color de CSS para obtener más detalles).

Tutorial_api_08_ndvi.png
Figura 8: NDVI para una sola escena de Landsat. El azul indica un NDVI bajo y el verde, un NDVI alto.

La operación de diferencia normalizada es tan común en la teledetección que existe una función de acceso directo en un ee.Image que es útil para simplificar el código del ejemplo anterior:

Editor de código (JavaScript)

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

Asigna una función a una colección

Supongamos ahora que quieres agregar el NDVI a cada imagen de una colección de imágenes. La forma de hacerlo en Earth Engine es map() una función sobre la colección. No confundas map() con el objeto Map. El primero es un método en una colección y usa map en el sentido de la computación paralela de aplicar una función a cada elemento de una colección. La función define las operaciones que se aplicarán a cada elemento de la colección. Ya viste una función simple en el instructivo de JavaScript, pero ahora crearemos una función que incluya la funcionalidad de Earth Engine. Por ejemplo, copia el código de NDVI anterior en una función que devuelva la imagen de entrada con una banda de 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');

Es posible que este código no sea tan eficiente para calcular el NDVI de una sola imagen, pero esta función se puede usar como argumento para map() con el objetivo de agregar una banda de NDVI a cada imagen de la colección. A menudo, es útil probar primero una función en una sola imagen para asegurarte de que se comporte como esperas. Una vez que hayas probado la función en una imagen individual y hayas determinado que hace lo que quieres, puedes asignarla a la colección:

Editor de código (JavaScript)

var withNDVI = l8.map(addNDVI);

Para verificar que esto realmente agrega una banda de NDVI a cada imagen de esta colección, puedes agregar la colección withNDVI al mapa y consultar una ubicación aleatoria con la pestaña Inspector. Deberías notar que cada imagen de la colección ahora tiene una banda llamada NDVI.

Crea una composición de píxeles más verdes

Ahora que creaste una colección de imágenes en la que cada imagen tiene una banda de NDVI, podemos explorar una nueva forma de crear compuestos: qualityMosaic(). Es posible que hayas notado discontinuidades entre las rutas de Landsat, incluso en la composición de píxeles de la mediana. Parte de la razón de esto puede deberse a diferencias en la fenología como resultado de que las imágenes en rutas adyacentes se recopilan en diferentes momentos (específicamente, con 8 días de diferencia). Una forma de minimizar esto es intentar establecer valores de píxeles en el compuesto de aproximadamente la misma etapa fenológica, por ejemplo, el momento de máxima verdor de las plantas (cuando las hojas están presentes y fotosintéticamente activas). Si dejamos que el verdor máximo se defina por el NDVI máximo, podemos usar qualityMosaic() para crear una composición en la que cada píxel contenga el píxel de NDVI máximo de la colección. Ahora puedes usar la banda de NDVI agregada en tu colección 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');

El resultado de este código debería ser similar al de la Figura 9. Si comparas la figura 9 con la composición de la mediana que se muestra en la figura 6, observa que la composición de píxeles más verdes es, de hecho, mucho más verde. Sin embargo, un examen minucioso de los cuerpos de agua debería revelar un problema diferente. Específicamente, los cuerpos de agua ahora aparecen nublados. Esto se debe a la forma en que funciona el método qualityMosaic(): en cada ubicación, se examina toda la serie temporal y el píxel con el valor máximo en la banda de NDVI se establece como el valor compuesto. Como el NDVI es más alto sobre las nubes que sobre el agua, las áreas de agua obtienen píxeles nublados, mientras que las áreas con vegetación aparecen verdes porque el NDVI es más alto cuando la vegetación en el píxel es fotosintéticamente activa.

Tutorial_api_09_greenest.png
Figura 9. Compuesto de píxeles más verdes de Landsat 8.

Ya viste varias formas de componer y crear mosaicos de imágenes en Earth Engine. Puedes crear composiciones de valor reciente, mediana o de píxeles más verdes a partir de imágenes filtradas por hora y lugar, o de todas las imágenes de la colección. Aprendiste a realizar cálculos en las imágenes y extraer información. En la siguiente página, se explican las formas de obtener información de Earth Engine, por ejemplo, como un gráfico o un conjunto de datos exportado a tu carpeta de Google Drive.