Algoritmos de Landsat

Estructura de la colección de Landsat

El USGS produce datos en 3 niveles (categorías) para cada satélite:

  • Nivel 1 (N1): Datos que cumplen con los requisitos de calidad geométrica y radiométrica
  • Nivel 2 (N2): Datos que no cumplen con los requisitos del nivel 1
  • En tiempo real (RT): Datos que aún no se evaluaron (esto puede tardar hasta un mes).

Consulta la documentación del USGS sobre los niveles de la colección 2 para obtener más información.

Para permitir el acceso a los datos de T1 validados y a los datos en tiempo real más recientes, agrupamos las escenas en colecciones por nivel y satélite. Los ejemplos de Landsat 8 son los siguientes:

ID Descripción
LANDSAT/LC08/C02/T1_RT Landsat 8, Colección 2, Nivel 1 y tiempo real
LANDSAT/LC08/C02/T1 Solo Landsat 8, colección 2, nivel 1
LANDSAT/LC08/C02/T2 Landsat 8, Colección 2, solo nivel 2

Las escenas recién adquiridas se agregan a la colección T1_RT a diario. Una vez que una escena de RT se vuelva a procesar y se categorice como T1 o T2, se quitará de la colección T1_RT y la versión nueva se agregará a las colecciones correspondientes. Si tu trabajo es sensible a las eliminaciones o a las escenas que podrían estar mal registradas, te recomendamos que te ciñas a la colección T1. Sin embargo, en general, es muy poco común que un registro incorrecto sea lo suficientemente grande como para notarlo en las escenas recién adquiridas.

Cada una de las colecciones anteriores contiene los datos sin procesar (es decir, la radiación a escala en el sensor). Además, para cada colección que contiene imágenes de T1 o T2, se ofrecen productos de TOA (reflectancia en la parte superior de la atmósfera), SR (reflectancia superficial) y LST (temperatura de la superficie terrestre). En la siguiente tabla, se describe el ID de la colección para las colecciones de TOA y SR/LST con datos de Landsat 8 como ejemplo.

ID Descripción
LANDSAT/LC08/C02/T1_RT_TOA Landsat 8, Collection 2, Nivel 1 + tiempo real, TOA
LANDSAT/LC08/C02/T1_TOA Landsat 8, Colección 2, solo Nivel 1, TOA
LANDSAT/LC08/C02/T1_L2 Landsat 8, Collection 2, solo nivel 1, SR y LST
LANDSAT/LC08/C02/T2_TOA Landsat 8, Colección 2, solo nivel 2, TOA

Estos datos existen para Landsat 4, 5, 7, 8 y 9. Reemplaza "LC08" en las definiciones de la colección anterior con los IDs de la siguiente tabla para recuperar colecciones de los diversos satélites.

ID Descripción
LT04 Landsat 4, Thematic Mapper (TM)
LT05 Landsat 5, Thematic Mapper (TM)
LE07 Landsat 7, Enhanced Thematic Mapper Plus (ETM+)
LC08 Landsat 8, Operational Land Imager (OLI)
LC09 Landsat 9, Operational Land Imager 2 (OLI-2)

Estado de la colección de Landsat

Pre-Collection 1: El USGS ya no los produce ni distribuye, y Earth Engine no los admite. Se quitarán de Data Catalog en 2024.

Colección 1: El USGS ya no la produce ni distribuye, y Earth Engine no la admite. Se quitará de Data Catalog en 2024. Usa la guía de migración para actualizar tus secuencias de comandos, módulos y apps de Earth Engine a la Colección 2 antes del 1 de julio de 2024 para evitar solicitudes fallidas.

Colección 2: Es la colección actual que produce el USGS. Disponibilidad completa en el Catálogo de datos de Earth Engine.

Métodos de procesamiento de Landsat

Earth Engine contiene una variedad de métodos de procesamiento específicos de Landsat. Específicamente, existen métodos para calcular la irradiancia en el sensor, la reflectancia de la parte superior de la atmósfera (TOA), la reflectancia de la superficie (SR), la puntuación de nubes y los compuestos sin nubes.

Radiancia en el sensor y reflectancia en la TOA

Las escenas "sin procesar" de Earth Engine contienen imágenes con números digitales (DN) que representan la radiancia a escala. La conversión de DN a radiación en el sensor es una transformación lineal que usa coeficientes almacenados en los metadatos de la escena (Chander et al. 2009). El método ee.Algorithms.Landsat.calibratedRadiance() realiza esta conversión. La conversión a la reflectancia TOA (o en el sensor) es una transformación lineal que tiene en cuenta la elevación solar y la distancia variable según la estación entre la Tierra y el Sol. El método ee.Algorithms.Landsat.TOA() controla la conversión de TOA. El método TOA convierte las bandas térmicas en temperatura de brillo. Consulta Chander et al. (2009) (o este sitio del USGS para Landsat 8) para obtener más información sobre el cálculo de la reflectancia de la TOA o la temperatura de brillo. En el siguiente ejemplo, se muestra la conversión de datos sin procesar a brillo y reflectancia de la TOA para una imagen de Landsat 8:

// Load a raw Landsat scene and display it.
var raw = ee.Image('LANDSAT/LC08/C02/T1/LC08_044034_20140318');
Map.centerObject(raw, 10);
Map.addLayer(raw, {bands: ['B4', 'B3', 'B2'], min: 6000, max: 12000}, 'raw');

// Convert the raw data to radiance.
var radiance = ee.Algorithms.Landsat.calibratedRadiance(raw);
Map.addLayer(radiance, {bands: ['B4', 'B3', 'B2'], max: 90}, 'radiance');

// Convert the raw data to top-of-atmosphere reflectance.
var toa = ee.Algorithms.Landsat.TOA(raw);

Map.addLayer(toa, {bands: ['B4', 'B3', 'B2'], max: 0.2}, 'toa reflectance');

Consulta la página Entorno de Python para obtener información sobre la API de Python y el uso de geemap para el desarrollo interactivo.

import ee
import geemap.core as geemap
# Load a raw Landsat scene and display it.
raw = ee.Image('LANDSAT/LC08/C02/T1/LC08_044034_20140318')
m = geemap.Map()
m.center_object(raw, 10)
m.add_layer(
    raw, {'bands': ['B4', 'B3', 'B2'], 'min': 6000, 'max': 12000}, 'raw'
)

# Convert the raw data to radiance.
radiance = ee.Algorithms.Landsat.calibratedRadiance(raw)
m.add_layer(radiance, {'bands': ['B4', 'B3', 'B2'], 'max': 90}, 'radiance')

# Convert the raw data to top-of-atmosphere reflectance.
toa = ee.Algorithms.Landsat.TOA(raw)

m.add_layer(toa, {'bands': ['B4', 'B3', 'B2'], 'max': 0.2}, 'toa reflectance')
m

Reflectancia superficial

Los datos de reflectancia superficial (SR) de Landsat están disponibles en Earth Engine como una copia del archivo de nivel 2 de la colección 2 del USGS. Ten en cuenta que los datos de SR de Landsat 4, 5 y 7 se generan con el algoritmo LEDAPS, mientras que los datos de SR de Landsat 8 y 9 se generan con el algoritmo LaSRC. Obtén información sobre estos algoritmos y sus diferencias con el USGS.

Puedes acceder a una imagen de Landsat 8 de la colección 2, nivel 2 del USGS de la siguiente manera:

var srImage = ee.Image('LANDSAT/LC08/C02/T1_L2/LC08_044034_20201028');

Consulta la página Entorno de Python para obtener información sobre la API de Python y el uso de geemap para el desarrollo interactivo.

import ee
import geemap.core as geemap
sr_image = ee.Image('LANDSAT/LC08/C02/T1_L2/LC08_044034_20201028')

Los conjuntos de datos de reflectancia superficial de la colección 2 de Landsat del 4 al 9 son los siguientes:

var surfaceReflectanceL4 = ee.ImageCollection('LANDSAT/LT04/C02/T1_L2');
var surfaceReflectanceL5 = ee.ImageCollection('LANDSAT/LT05/C02/T1_L2');
var surfaceReflectanceL7 = ee.ImageCollection('LANDSAT/LE07/C02/T1_L2');
var surfaceReflectanceL8 = ee.ImageCollection('LANDSAT/LC08/C02/T1_L2');
var surfaceReflectanceL9 = ee.ImageCollection('LANDSAT/LC09/C02/T1_L2');

Consulta la página Entorno de Python para obtener información sobre la API de Python y el uso de geemap para el desarrollo interactivo.

import ee
import geemap.core as geemap
surface_reflectance_l4 = ee.ImageCollection('LANDSAT/LT04/C02/T1_L2')
surface_reflectance_l5 = ee.ImageCollection('LANDSAT/LT05/C02/T1_L2')
surface_reflectance_l7 = ee.ImageCollection('LANDSAT/LE07/C02/T1_L2')
surface_reflectance_l8 = ee.ImageCollection('LANDSAT/LC08/C02/T1_L2')
surface_reflectance_l9 = ee.ImageCollection('LANDSAT/LC09/C02/T1_L2')

Puntuación de nube simple

Para asignar puntuaciones a los píxeles de Landsat según su nubosidad relativa, Earth Engine proporciona un algoritmo rudimentario de puntuación de nubes en el método ee.Algorithms.Landsat.simpleCloudScore(). (Para obtener detalles sobre la implementación, consulta esta secuencia de comandos de ejemplo del editor de código). En el siguiente ejemplo, se usa el algoritmo de puntuación de nubes para enmascarar las nubes en una imagen de Landsat 8:

// Load a cloudy Landsat scene and display it.
var cloudy_scene = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140926');
Map.centerObject(cloudy_scene);
Map.addLayer(cloudy_scene, {bands: ['B4', 'B3', 'B2'], max: 0.4}, 'TOA', false);

// Add a cloud score band.  It is automatically called 'cloud'.
var scored = ee.Algorithms.Landsat.simpleCloudScore(cloudy_scene);

// Create a mask from the cloud score and combine it with the image mask.
var mask = scored.select(['cloud']).lte(20);

// Apply the mask to the image and display the result.
var masked = cloudy_scene.updateMask(mask);
Map.addLayer(masked, {bands: ['B4', 'B3', 'B2'], max: 0.4}, 'masked');

Consulta la página Entorno de Python para obtener información sobre la API de Python y el uso de geemap para el desarrollo interactivo.

import ee
import geemap.core as geemap
# Load a cloudy Landsat scene and display it.
cloudy_scene = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140926')
m = geemap.Map()
m.center_object(cloudy_scene)
m.add_layer(
    cloudy_scene, {'bands': ['B4', 'B3', 'B2'], 'max': 0.4}, 'TOA', False
)

# Add a cloud score band.  It is automatically called 'cloud'.
scored = ee.Algorithms.Landsat.simpleCloudScore(cloudy_scene)

# Create a mask from the cloud score and combine it with the image mask.
mask = scored.select(['cloud']).lte(20)

# Apply the mask to the image and display the result.
masked = cloudy_scene.updateMask(mask)
m.add_layer(masked, {'bands': ['B4', 'B3', 'B2'], 'max': 0.4}, 'masked')
m

Si ejecutas este ejemplo en el editor de código, intenta activar o desactivar la visibilidad de las capas de TOA para comparar la diferencia entre las imágenes con máscara y sin máscara. (consulta la sección Layer Manager de la documentación del editor de código para obtener instrucciones). Observa que la entrada a simpleCloudScore() es una sola escena de TOA de Landsat. También ten en cuenta que simpleCloudScore() agrega una banda llamada 'cloud' a la imagen de entrada. La banda de nubes contiene la puntuación de nubes de 0 (sin nubes) a 100 (mayormente nublado). En el ejemplo anterior, se usa un umbral arbitrario (20) en la puntuación de nubes para enmascarar los píxeles nublados. Para aplicar este algoritmo a un mosaico de Earth Engine de escenas de Landsat, configura la propiedad SENSOR_ID:

// Load a Landsat 8 TOA collection, make 15-day mosaic, set SENSOR_ID property.
var mosaic = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA')
  .filterDate('2019-06-01', '2019-06-16').mosaic()
  .set('SENSOR_ID', 'OLI_TIRS');

// Cloud score the mosaic and display the result.
var scored_mosaic = ee.Algorithms.Landsat.simpleCloudScore(mosaic);
Map.addLayer(scored_mosaic, {bands: ['B4', 'B3', 'B2'], max: 0.4},
    'TOA mosaic');

Consulta la página Entorno de Python para obtener información sobre la API de Python y el uso de geemap para el desarrollo interactivo.

import ee
import geemap.core as geemap
# Load a Landsat 8 TOA collection, make 15-day mosaic, set SENSOR_ID property.
mosaic = (
    ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA')
    .filterDate('2019-06-01', '2019-06-16')
    .mosaic()
    .set('SENSOR_ID', 'OLI_TIRS')
)

# Cloud score the mosaic and display the result.
scored_mosaic = ee.Algorithms.Landsat.simpleCloudScore(mosaic)
m = geemap.Map()
m.add_layer(
    scored_mosaic,
    {'bands': ['B4', 'B3', 'B2'], 'max': 0.4},
    'TOA mosaic',
)
m

SENSOR_ID es una propiedad de imágenes individuales. Cuando Earth Engine crea un mosaico de muchas imágenes, debe descartar los metadatos de imágenes individuales, incluida la propiedad SENSOR_ID. Para asignar una puntuación a la nube en un mosaico, Earth Engine busca esa propiedad y no la encuentra, lo que genera un error. Establece la propiedad manualmente para evitarlo. Los IDs de los sensores de Landsat 5, 7 y 8(9) son "TM", "ETM" y "OLI_TIRS", respectivamente.

Compuesto simple

Para crear mosaicos simples de Landsat sin nubes, Earth Engine proporciona el método ee.Algorithms.Landsat.simpleComposite(). Este método selecciona un subconjunto de escenas en cada ubicación, las convierte en reflectancia TOA, aplica la puntuación de nubes simple y toma la mediana de los píxeles menos nublados. En este ejemplo, se crea un compuesto simple con parámetros predeterminados y se compara con un compuesto que usa parámetros personalizados para el umbral de puntuación de la nube y el percentil:

// Load a raw Landsat 5 ImageCollection for a single year.
var collection = ee.ImageCollection('LANDSAT/LT05/C02/T1')
    .filterDate('2010-01-01', '2010-12-31');

// Create a cloud-free composite with default parameters.
var composite = ee.Algorithms.Landsat.simpleComposite(collection);

// Create a cloud-free composite with custom parameters for
// cloud score threshold and percentile.
var customComposite = ee.Algorithms.Landsat.simpleComposite({
  collection: collection,
  percentile: 75,
  cloudScoreRange: 5
});

// Display the composites.
Map.setCenter(-122.3578, 37.7726, 10);
Map.addLayer(composite, {bands: ['B4', 'B3', 'B2'], max: 128}, 'TOA composite');
Map.addLayer(customComposite, {bands: ['B4', 'B3', 'B2'], max: 128},
    'Custom TOA composite');

Consulta la página Entorno de Python para obtener información sobre la API de Python y el uso de geemap para el desarrollo interactivo.

import ee
import geemap.core as geemap
# Load a raw Landsat 5 ImageCollection for a single year.
collection = ee.ImageCollection('LANDSAT/LT05/C02/T1').filterDate(
    '2010-01-01', '2010-12-31'
)

# Create a cloud-free composite with default parameters.
composite = ee.Algorithms.Landsat.simpleComposite(collection)

# Create a cloud-free composite with custom parameters for
# cloud score threshold and percentile.
custom_composite = ee.Algorithms.Landsat.simpleComposite(
    collection=collection, percentile=75, cloudScoreRange=5
)

# Display the composites.
m = geemap.Map()
m.set_center(-122.3578, 37.7726, 10)
m.add_layer(
    composite, {'bands': ['B4', 'B3', 'B2'], 'max': 128}, 'TOA composite'
)
m.add_layer(
    custom_composite,
    {'bands': ['B4', 'B3', 'B2'], 'max': 128},
    'Custom TOA composite',
)
m

Ten en cuenta que la entrada del compuesto simple es una colección de imágenes sin procesar. También ten en cuenta que, de forma predeterminada, la salida de la banda reflectante es la reflectancia ajustada a 8 bits y la salida de la banda térmica es Kelvin menos 100 para adaptarse al rango de 8 bits. Puedes cambiar este comportamiento si configuras el parámetro asFloat como verdadero para obtener un resultado de número de punto flotante sin escalar ni desplazar.