Landsat 算法

Landsat 集合结构

USGS 会为每颗卫星生成 3 个层级(类别)的数据:

  • 第 1 层级 (T1) - 数据符合几何图形和辐射质量要求
  • 第 2 层级 (T2) - 不符合第 1 层级要求的数据
  • 实时 (RT) - 尚未评估的数据(最多需要一个月的时间)。

如需了解详情,请参阅有关集合 2 层级的 USGS 文档

为了让您同时访问经过验证的 T1 数据和最新的实时数据,我们已按层级和卫星将场景划分为多个集合。Landsat 8 的示例如下:

ID 说明
LANDSAT/LC08/C02/T1_RT Landsat 8、集合 2、第 1 层级 + 实时
LANDSAT/LC08/C02/T1 Landsat 8,集合 2,仅限第 1 层级
LANDSAT/LC08/C02/T2 Landsat 8,集合 2,仅限第 2 层级

新获取的场景每天都会添加到 T1_RT 集合中。RT 场景重新处理并归类为 T1 或 T2 后,系统会将其从 T1_RT 集合中移除,并将新版本添加到相应的集合。如果您的作品对内容移除或可能的错误注册场景非常敏感,您可能需要坚持使用 T1 集合,但一般来说,新获取的场景中很少会出现足以引起注意的错误注册。

上述每个集合都包含原始数据(即经过缩放的传感器端辐射度)。 此外,对于包含 T1 或 T2 图像的每个集合,系统都会提供 TOA(大气顶部反射率)、SR(地表反射率)和 LST(地表温度)产品。下表以 Landsat 8 数据为例,介绍了 TOA 和 SR/LST 集合的集合 ID。

ID 说明
LANDSAT/LC08/C02/T1_RT_TOA Landsat 8、集合 2、第 1 层级 + 实时、TOA
LANDSAT/LC08/C02/T1_TOA Landsat 8、集合 2、仅第 1 层级、TOA
LANDSAT/LC08/C02/T1_L2 Landsat 8、集合 2、仅第 1 层级、SR 和 LST
LANDSAT/LC08/C02/T2_TOA Landsat 8、集合 2、仅第 2 层级、TOA

Landsat 4、5、7、8 和 9 均提供此类数据。将上述集合定义中的“LC08”替换为下表中的 ID,以检索各种卫星的集合。

ID 说明
LT04 Landsat 4,主题映射仪 (TM)
LT05 Landsat 5,主题映射仪 (TM)
LE07 Landsat 7,增强型主题映射仪 Plus (ETM+)
LC08 Landsat 8,Operational Land Imager (OLI)
LC09 Landsat 9、Operational Land Imager 2 (OLI-2)

Landsat 集合状态

Pre-Collection 1:不再由 USGS 生产或分发,不受 Earth Engine 支持,将于 2024 年从 Data Catalog 中移除。

Collection 1:USGS 不再生产或分发,Earth Engine 也不支持,将于 2024 年从 Data Catalog 中移除。请按照迁移指南,在 2024 年 7 月 1 日之前将您的 Earth Engine 脚本、模块和应用更新为 Collection 2,以免请求失败。

集合 2:USGS 当前生成的集合。Earth Engine 数据目录中已全面提供。

Landsat 处理方法

Earth Engine 包含各种 Landsat 专用处理方法。具体而言,有方法可计算传感器辐射度、大气顶部 (TOA) 反射率、地表反射率 (SR)、云量得分和无云合成图像。

传感器端辐射度和 TOA 反射率

Earth Engine 中的“原始”场景包含数字数字 (DN) 表示的图像,这些数字表示经过缩放的辐射度。将数字地面反射率转换为传感器端辐射度是使用存储在场景元数据中的系数进行的线性转换(Chander 等人,2009)。ee.Algorithms.Landsat.calibratedRadiance() 方法会执行此转换。将 TOA(或传感器)反射率转换为 是一种线性转换,可考虑太阳高度和季节性变化的地球-太阳距离。TOA 转换由 ee.Algorithms.Landsat.TOA() 方法处理。TOA 方法可将热带转换为亮度温度。如需详细了解如何计算 TOA 反射率或亮度温度,请参阅 Chander 等人 (2009)(或有关 Landsat 8 的此 USGS 网站)。以下示例展示了将 Landsat 8 图像的原始数据转换为辐射度和 TOA 反射率的过程:

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

如需了解 Python API 以及如何使用 geemap 进行交互式开发,请参阅 Python 环境页面。

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

表面反射率

Landsat 地表反射率 (SR) 数据在 Earth Engine 中以 USGS 集合 2 级别 2 归档的副本的形式提供。请注意,Landsat 4、5 和 7 SR 数据是使用 LEDAPS 算法生成的,而 Landsat 8 和 9 SR 数据是使用 LaSRC 算法生成的。 了解这些算法及其与 USGS 的差异

您可以访问 USGS 集合 2、第 2 级 Landsat 8 图像,如下所示:

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

如需了解 Python API 以及如何使用 geemap 进行交互式开发,请参阅 Python 环境页面。

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

Collection 2 Landsat 4 到 9 的表面反射率数据集如下:

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

如需了解 Python API 以及如何使用 geemap 进行交互式开发,请参阅 Python 环境页面。

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

简单的云端得分

为了根据相对云量为 Landsat 像素评分,Earth Engine 在 ee.Algorithms.Landsat.simpleCloudScore() 方法中提供了一种基本的云量评分算法。(如需详细了解实现方式,请参阅此 Code Editor 示例脚本)。以下示例使用云评分算法来遮盖 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');

如需了解 Python API 以及如何使用 geemap 进行交互式开发,请参阅 Python 环境页面。

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

如果您在代码编辑器中运行此示例,请尝试切换 TOA 图层的可见性,比较经过遮罩和未经过遮罩的图像之间的差异。(如需了解如何执行此操作,请参阅代码编辑器文档的图层管理器部分)。请注意,simpleCloudScore() 的输入是单个 Landsat TOA 场景。另请注意,simpleCloudScore() 会向输入图片添加一个名为 'cloud' 的波段。云带包含云量得分,范围为 0(不含云)到 100(最浓云)。前面的示例对云层得分使用了任意阈值 (20) 来遮盖多云像素。如需将此算法应用于 Landsat 场景的 Earth Engine 拼接图,请设置 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');

如需了解 Python API 以及如何使用 geemap 进行交互式开发,请参阅 Python 环境页面。

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 是单个图片的属性。当 Earth Engine 将多张图片拼接成一个图片时,它必须舍弃各个图片的元数据,包括 SENSOR_ID 属性。为了为拼接图像评分云,Earth Engine 会查找该属性,但找不到该属性,因此会导致错误。请手动设置该属性以避免出现这种情况。Landsat 5、7 和 8(9) 的传感器 ID 分别为“TM”“ETM”和“OLI_TIRS”。

简单复合

如需创建简单的无云 Landsat 合成图,Earth Engine 提供了 ee.Algorithms.Landsat.simpleComposite() 方法。此方法会选择每个地点的一组场景,转换为 TOA 反射率,应用简单的云量评分,并取云量最小的像素的中位数。此示例使用默认参数创建一个简单的复合指标,并将其与使用自定义参数(针对云端得分阈值和百分位数)的复合指标进行比较:

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

如需了解 Python API 以及如何使用 geemap 进行交互式开发,请参阅 Python 环境页面。

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

请注意,简单合成的输入是一组原始图像。另请注意,默认情况下,反射波段输出是将反射率缩放为 8 位,热波段输出是开氏度减 100,以适应 8 位范围。您可以通过将 asFloat 参数设置为 true 来更改此行为,以获取未缩放、未移位的浮点输出。