我就在 cmets 中发布的代码回答了这个问题,希望问题会随着 cmets 中发布的代码更新。
过滤:好的。
只是评论,我不会用名称 img 命名图像集合变量,这让我很困惑,但变量名称取决于您。
var mf = ee.Filter.calendarRange(10, 12, 'month');
var img1 = ee.ImageCollection(l5
.filterDate('1984-01-01','1999-12-31')
.filterBounds(roi)
.filter(mf));
var img2 = ee.ImageCollection(l7
.filterDate('2000-01-01','2018-12-31')
.filterBounds(roi)
.filter(mf));
添加 NDWI:这是您的代码:
var addNDWI = function(image){
var ndwi = image.normalizedDifference(['B2', 'B4']).rename('NDWI');
var ndwiMask = ndwi.gte(0.3);
return image.addBands(ndwi);
};
var image1 = img1.map(addNDWI);
var image2 = img2.map(addNDWI);
您没有保存ndwiMask,因此您将无法在此功能之外使用它。同样,我不会将它们命名为 image,因为它们不是图像而是图像集合。
海拔遮罩:您必须选择elevation 波段:
var elevMask = elevation.select('elevation').gt(1500)
此蒙版图像将具有高程大于 1500 的图像,而没有高程的则为零。
应用掩码:在这部分你必须记住 Earth Engine 使用函数式编程,所以对象是不可变的,这意味着你不能使用方法更新对象的状态,你有捕获您正在调用的方法的输出。这里需要ndwi掩码,所以必须用NDWI波段计算。
var mask = function(image){
var ndwiMask = image.select('NDWI').gt(0.3)
var ndwi_masked = image.updateMask(ndwiMask);
return ndwi_masked.updateMask(elevMask);
};
var maskedImg = image1.map(mask); // ImageCollection!
var maskedImg2 = image2.map(mask); // ImageCollection!
可视化:由于结果是ImageCollection,当您将其添加到地图时,EE 会生成马赛克,这就是您所看到的。请记住这一点,以便进一步处理。
var ndwiViz = {bands: ['NDWI'], min: 0.5, max: 1, palette: ['00FFFF', '0000FF']};
Map.addLayer(maskedImg, ndwiViz, 'Landsat 5 masked collection');