目录
1 完整代码
2 运行结果
// 导入研究小区的集合
Map.centerObject(roi);
Map.addLayer(roi, { 'color': 'grey' }, 'roi');
// 应用缩放因子
function applyScaleFactors(image) {
var opticalBands = image.select('SR_B.').multiply(0.0000275).add(-0.2);
var thermalBands = image.select('ST_B.*').multiply(0.00341802).add(149.0);
return image.addBands(opticalBands, null, true)
.addBands(thermalBands, null, true);
}
// 云处理函数
var cloudMaskL457 = function(image) {
var qa = image.select('QA_PIXEL');
// 如果云位(5)被设置且云置信度(7)高
// 或者云阴影位被设置(3),则为坏像素
var cloud = qa.bitwiseAnd(1 << 5)
.and(qa.bitwiseAnd(1 << 7))
.or(qa.bitwiseAnd(1 << 3));
// 删除所有波段中不出现的边缘像素
var mask2 = image.mask().reduce(ee.Reducer.min());
return image.updateMask(cloud.not()).updateMask(mask2);
};
// 另一个云处理函数
function rmCloudNew(image) {
var cloudShadowBitMask = (1 << 4);
var cloudsBitMask = (1 << 3);
var qa = image.select('QA_PIXEL');
var mask = qa.bitwiseAnd(cloudShadowBitMask).eq(0)
.and(qa.bitwiseAnd(cloudsBitMask).eq(0));
return image.updateMask(mask)
.copyProperties(image)
.copyProperties(image, ["system:time_start"]);
}
// 计算NDVI的函数
var get_NDVI = function(image) {
var NDVI = image.normalizedDifference(['nir', 'red']).rename(['NDVI']);
image = image.addBands(NDVI);
return image.select("NDVI");
};
// 筛选Landsat 8影像集合
var L8 = ee.ImageCollection('LANDSAT/LC08/C02/T1_L2')
.filterBounds(roi)
.filter(ee.Filter.calendarRange(2023, 2023, 'year'))
.filter(ee.Filter.calendarRange(1, 12, 'month'))
.map(applyScaleFactors)
.select(['SR_B4', 'SR_B5', 'QA_PIXEL'], ['red', 'nir', 'QA_PIXEL'])
.map(rmCloudNew)
.map(get_NDVI);
// NDVI可视化参数
var precipitationVis = {
min: -1,
max: 1,
palette: ["FFFFFF", "CE7E45", "DF923D", "F1B555", "FCD163",
"99B718", "74A901", "66A000", "529400", "3E8601",
"207401", "056201", "004C00", "023B01", "012E01",
"011D01", "011301"]
};
// 遍历年份
for (var i = 2023; i <= 2023; i++) {
var ndvi_year = L8.filterDate(i + '-6-01', i + '-7-31').select('NDVI');
var ndvi_mean = L8.mean().clip(roi);
}
print(i, ndvi_mean);
Map.addLayer(ndvi_mean, precipitationVis, i + '_ndvi_mean', false);
// 计算百分位数
var num = ndvi_mean.reduceRegion({
reducer: ee.Reducer.percentile([5, 95]),
geometry: roi,
scale: 30,
maxPixels: 1e13
});
// 获取第5%和第95%位置的NDVI值
var min = ee.Number(num.get("NDVI_p5"));
var max = ee.Number(num.get("NDVI_p95"));
print("min", min); // 将值打印到控制台
print("max", max);
// 区分不同部分的NDVI
var greaterPart = ndvi_mean.gt(max);
var lessPart = ndvi_mean.lt(min);
var middlePart = ee.Image(1).subtract(greaterPart).subtract(lessPart);
// 计算FVC
var tempf1 = ndvi_mean.subtract(min).divide(max.subtract(min));
var FVC = ee.Image(1)
.multiply(greaterPart)
.add(ee.Image(0).multiply(lessPart))
.add(tempf1.multiply(middlePart))
.toFloat();
Map.addLayer(FVC, {}, "FVC");
// 导出NDVI均值图像到Drive
Export.image.toDrive({
image: ndvi_mean,
description: i + 'year_mean',
region: roi,
scale: 30,
maxPixels: 1e13,
folder: 'NDVI_year'
});