在Google Earth Engine(GEE)中处理影像集合(Image Collections)是遥感数据分析的核心操作。以下是详细的步骤和示例代码,涵盖影像集合的常见操作:
1. 影像集合基础
影像集合是GEE中存储多幅影像的数据结构,例如Landsat、Sentinel等卫星数据。所有数据集均可在GEE数据目录中查找。
加载影像集合
// 加载Landsat 8地表反射率数据集
var landsat = ee.ImageCollection('LANDSAT/LC08/C02/T1_L2');
// 加载Sentinel-2 TOA反射率数据
var sentinel2 = ee.ImageCollection('COPERNICUS/S2_HARMONIZED');
2. 过滤影像集合
通过时间、空间或属性过滤缩小数据集范围。
时间过滤
var filteredByDate = landsat.filterDate('2020-01-01', '2020-12-31');
空间过滤
var roi = ee.Geometry.Point([-122.09, 37.42]); // 旧金山坐标
var filteredByROI = landsat.filterBounds(roi);
属性过滤
例如筛选云量低于10%的影像:
var filteredByClouds = sentinel2.filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 10));
3. 对影像集合中的每幅影像进行处理(map()
)
对集合中每个影像应用函数,例如计算NDVI:
// 定义NDVI计算函数
var addNDVI = function(image) {
var ndvi = image.normalizedDifference(['SR_B5', 'SR_B4']).rename('NDVI');
return image.addBands(ndvi);
};
// 应用函数到每个影像
var landsatWithNDVI = filteredByDate.map(addNDVI);
4. 影像合成
将时间序列影像合成为单幅影像,如中值、最大值等。
中值合成(去云常用)
var medianComposite = landsatWithNDVI.median();
最大值合成(突出植被生长峰值)
var maxNDVI = landsatWithNDVI.select('NDVI').max();
5. 时间序列分析
按时间粒度(月、年)生成合成影像。
生成月度合成影像
var monthlyComposites = ee.ImageCollection.fromImages(
ee.List.sequence(1, 12).map(function(month) {
return landsatWithNDVI
.filter(ee.Filter.calendarRange(month, month, 'month'))
.median()
.set('month', month);
})
);
6. 统计计算(reduce()
)
计算整个时间序列的统计值,如平均NDVI:
var meanNDVI = landsatWithNDVI.select('NDVI').mean();
7. 质量控制与云掩膜
使用QA波段去除云覆盖区域。
Landsat 8云掩膜示例
var maskClouds = function(image) {
var qa = image.select('QA_PIXEL');
var cloudMask = qa.bitwiseAnd(1 << 3).eq(0); // 第3位为云置信度
return image.updateMask(cloudMask);
};
var landsatMasked = landsat.map(maskClouds);
8. 可视化与导出
在地图上显示影像
Map.centerObject(roi, 10);
Map.addLayer(medianComposite, {bands: ['SR_B4', 'SR_B3', 'SR_B2'], min: 0, max: 0.3}, 'Median Composite');
导出数据到Google Drive
Export.image.toDrive({
image: meanNDVI,
description: 'Annual_Mean_NDVI',
scale: 30,
region: roi.buffer(1000).bounds()
});
9. 最佳实践
- 分块处理大区域:使用
tileScale
参数避免内存溢出。 - 链式操作:GEE的延迟执行机制支持链式调用,提升代码可读性:
var result = ee.ImageCollection('ID') .filterDate(...) .filterBounds(...) .map(...) .median();
- 调试:使用
print()
和console.log()
查看集合属性,如:print('Number of images:', filteredByDate.size());
完整示例:计算并可视化年度NDVI
// 加载并预处理数据
var landsat = ee.ImageCollection('LANDSAT/LC08/C02/T1_L2')
.filterDate('2020-01-01', '2020-12-31')
.filterBounds(roi);
// 计算NDVI
var withNDVI = landsat.map(function(image) {
return image.addBands(image.normalizedDifference(['SR_B5', 'SR_B4']).rename('NDVI'));
});
// 生成年度最大NDVI
var maxNDVI = withNDVI.select('NDVI').max();
// 可视化
Map.addLayer(maxNDVI, {min: 0, max: 1, palette: ['white', 'green']}, 'Max NDVI 2020');
通过上述步骤,你可以高效处理GEE中的影像集合,进行从数据加载到高级分析的完整流程。更多示例可参考GEE官方示例库和文档。