一、引言
在遥感领域,获取大量的卫星影像数据是进行研究和分析的基础。Google Earth Engine(GEE)提供了一个强大的平台,能够方便地访问和处理海量的遥感数据。本文将详细介绍如何使用 GEE 批量下载 Landsat 8 和 Landsat 9 的遥感影像数据,以满足不同的研究需求。
二、代码解析
以下是实现批量下载 Landsat 影像的 GEE 代码及其详细解释:
1. 定义研究区边界
// 定义研究区边界(东经118°10′-119°54′,北纬31°14′-32°43′)
var roi = ee.Geometry.Rectangle(
[118.1667, 31.2333, 119.9, 32.7167],
'EPSG:4326',
true
);
这里使用ee.Geometry.Rectangle
函数定义了一个矩形区域作为研究区,参数分别为矩形的左下角和右上角的经纬度坐标,坐标系统为EPSG:4326
(即 WGS84),最后一个参数true
表示坐标顺序为[lon, lat]
。
2. 定义下载年份范围
// 定义下载年份范围(根据实际数据存在性修改)
var startYear = 2020;
var endYear = 2025; // 截至2023年数据,可修改为2024等最新年份
var years = ee.List.sequence(startYear, endYear);
通过设置startYear
和endYear
来确定需要下载影像的年份范围,然后使用ee.List.sequence
函数生成一个包含这些年份的列表。
3. 加载 Landsat 8/9 数据集
// 加载Landsat 8/9数据集
var l8 = ee.ImageCollection('LANDSAT/LC08/C02/T1_L2');
var l9 = ee.ImageCollection('LANDSAT/LC09/C02/T1_L2');
var merged = l8.merge(l9);
分别加载 Landsat 8 和 Landsat 9 的数据集,然后使用merge
函数将两个数据集合并为一个。
4. 云掩膜函数
// 云掩膜函数
function maskClouds(image) {
var qa = image.select('QA_PIXEL');
var cloudBit = 1 << 3;
var cloudShadowBit = 1 << 4;
var mask = qa.bitwiseAnd(cloudBit).eq(0)
.and(qa.bitwiseAnd(cloudShadowBit).eq(0));
return image.updateMask(mask);
}
这个函数用于从影像的质量评估波段(QA_PIXEL
)中提取云及其阴影的信息,并生成一个掩膜,将云及其阴影区域屏蔽掉,以得到更清晰的影像数据。
5. 按年处理函数
// 按年处理函数
function processYear(year) {
// 生成年度时间范围
var startDate = ee.Date.fromYMD(year, 1, 1);
var endDate = ee.Date.fromYMD(year, 12, 31);
// 筛选和合成
var annualComposite = merged
.filterBounds(roi)
.filterDate(startDate, endDate)
.map(maskClouds)
.median();
// 设置导出参数
Export.image.toDrive({
image: annualComposite,
description: 'Landsat_' + year + '_Export',
folder: 'GEE_Exports',
fileNamePrefix: 'Landsat_' + year,
region: roi,
scale: 30,
maxPixels: 1e13,
crs: 'EPSG:4326',
fileFormat: 'GeoTIFF'
});
// 打印年度信息
print('Processed year:', year);
}
该函数用于处理每一年的数据。首先,根据年份生成年度时间范围;然后,从合并的数据集中筛选出在研究区内且在该年度时间范围内的影像,并应用云掩膜函数,最后使用median
函数合成年度影像。接着,设置导出参数,将合成的年度影像导出到 Google Drive 的指定文件夹中,格式为 GeoTIFF。最后,打印处理的年份信息。
6. 执行批量处理
// 执行批量处理
years.evaluate(function(yearsList) {
yearsList.forEach(processYear);
});
使用evaluate
函数将 GEE 中的年份列表转换为 JavaScript 中的列表,然后使用forEach
方法对每个年份调用processYear
函数,实现批量处理和下载。
7. 显示区域和提示信息
// 显示区域
Map.centerObject(roi, 8);
Map.addLayer(roi, {color: 'red'}, 'ROI');
// 提示信息
print('请在Tasks面板中逐个启动导出任务!');
print('建议先用print(annualComposite)验证数据有效性');
将研究区在地图上显示出来,并添加提示信息,提醒用户在 GEE 的任务面板中手动启动导出任务,并建议在导出前验证数据的有效性。
结果展示:
8. 完整代码:
// 定义研究区边界(东经118°10′-119°54′,北纬31°14′-32°43′)
var roi = ee.Geometry.Rectangle(
[118.1667, 31.2333, 119.9, 32.7167],
'EPSG:4326',
true
);
// 定义下载年份范围(根据实际数据存在性修改)
var startYear = 2020;
var endYear = 2025; // 截至2023年数据,可修改为2024等最新年份
var years = ee.List.sequence(startYear, endYear);
// 加载Landsat 8/9数据集
var l8 = ee.ImageCollection('LANDSAT/LC08/C02/T1_L2');
var l9 = ee.ImageCollection('LANDSAT/LC09/C02/T1_L2');
var merged = l8.merge(l9);
// 云掩膜函数
function maskClouds(image) {
var qa = image.select('QA_PIXEL');
var cloudBit = 1 << 3;
var cloudShadowBit = 1 << 4;
var mask = qa.bitwiseAnd(cloudBit).eq(0)
.and(qa.bitwiseAnd(cloudShadowBit).eq(0));
return image.updateMask(mask);
}
// 按年处理函数
function processYear(year) {
// 生成年度时间范围
var startDate = ee.Date.fromYMD(year, 1, 1);
var endDate = ee.Date.fromYMD(year, 12, 31);
// 筛选和合成
var annualComposite = merged
.filterBounds(roi)
.filterDate(startDate, endDate)
.map(maskClouds)
.median();
// 设置导出参数
Export.image.toDrive({
image: annualComposite,
description: 'Landsat_' + year + '_Export',
folder: 'GEE_Exports',
fileNamePrefix: 'Landsat_' + year,
region: roi,
scale: 30,
maxPixels: 1e13,
crs: 'EPSG:4326',
fileFormat: 'GeoTIFF'
});
// 打印年度信息
print('Processed year:', year);
}
// 执行批量处理
years.evaluate(function(yearsList) {
yearsList.forEach(processYear);
});
// 显示区域
Map.centerObject(roi, 8);
Map.addLayer(roi, {color: 'red'}, 'ROI');
// 提示信息
print('请在Tasks面板中逐个启动导出任务!');
print('建议先用print(annualComposite)验证数据有效性');
三、注意事项
- 数据范围和年份:根据实际研究需求和数据可用性,合理设置研究区边界和下载年份范围。
- 云掩膜效果:云掩膜函数可能无法完全去除所有的云及其阴影,需要根据具体情况进行调整和验证。
- 导出任务管理:由于批量下载任务可能较多,建议在 GEE 的任务面板中合理管理和监控导出任务,避免任务失败或重复。
- 数据验证:在正式下载数据之前,使用
print
函数验证合成的年度影像数据的有效性,确保数据符合研究要求。
- 欢迎关注我的公众号:遥感AI实战,会定期同步更新!