如何去除Landsat影像云覆盖并解决simpleComposite映射报错
问题分析与解决方案
错误原因
ee.Algorithms.Landsat.simpleComposite函数的返回值是单张合成影像(ee.Image),而非影像集合(ee.ImageCollection)。你将其赋值给filtered变量后,filtered不再是集合类型,因此调用filtered.map()会报错“map is not a function”。
解决方案
根据你的需求(保留云量低于10%的影像,计算年平均MSAVI2),有两种正确实现方式:
方式一:筛选低云量影像后逐景计算MSAVI2再求平均
此方式严格保留云量<10%的单景影像,分别计算每景的MSAVI2后取中位数(或均值)作为年平均结果。
var LS7 = ee.ImageCollection("LANDSAT/LE07/C02/T1"); // 筛选日期+云量低于10%的影像集合 var filtered = LS7.filterDate('2016-01-01', '2016-12-31') .filter(ee.Filter.lt('CLOUD_COVER', 10)); // 利用影像属性筛选云量 // 遍历集合计算每景影像的MSAVI2 var MSAVI2_collection = filtered.map(function (image) { return image.expression( '(2 * NIR + 1 - sqrt(pow((2 * NIR + 1), 2) - 8 * (NIR - RED)) ) / 2', { 'NIR': image.select('B4'), 'RED': image.select('B3') } ).rename('MSAVI2'); // 给结果波段命名,方便后续处理 }); // 计算所有MSAVI2影像的中位数(或用.mean()求均值) var MSAVI2 = MSAVI2_collection.median(); // 添加图层到地图 Map.addLayer(MSAVI2, {min: -0.15, max: 0.15}, 'MSAVI2 Annual Median');
方式二:使用simpleComposite生成低云合成影像后计算MSAVI2
如果你希望生成一张云量最少的合成影像(而非保留单景),可以直接对合成影像计算MSAVI2:
var LS7 = ee.ImageCollection("LANDSAT/LE07/C02/T1"); // 筛选日期后生成低云合成影像 var composite = LS7.filterDate('2016-01-01', '2016-12-31') .map(function(image) { // 对C02数据应用云掩膜(可选,增强合成效果) var qa = image.select('QA_PIXEL'); var cloudMask = qa.bitwiseAnd(1 << 3).eq(0) // 云掩码 .and(qa.bitwiseAnd(1 << 4).eq(0)); // 云阴影掩码 return image.updateMask(cloudMask); }) .simpleComposite({asFloat: true}); // 对合成影像计算MSAVI2 var MSAVI2 = composite.expression( '(2 * NIR + 1 - sqrt(pow((2 * NIR + 1), 2) - 8 * (NIR - RED)) ) / 2', { 'NIR': composite.select('B4'), 'RED': composite.select('B3') } ); // 添加图层到地图 Map.addLayer(MSAVI2, {min: -0.15, max: 0.15}, 'MSAVI2 Composite');
关键说明
- Landsat C02数据的云量属性为
CLOUD_COVER,范围0-100,可直接用于集合筛选。 - 若使用
simpleComposite,建议先对影像进行云掩膜处理,提升合成影像的质量。 - 年平均可选择
median()(中位数,抗异常值能力更强)或mean()(算术均值),根据需求调整。
内容的提问来源于stack exchange,提问作者Jason Edelkind
相关产品推荐
相关产品推荐

