按月份提取遥感数据特征,可以比较好地反映数据的变化趋势,同时又由于数据缺失、成像质量等因素,每个月份的可用数据量可能比较小,那么合成得到的数据结果仍有可能具有一些异常值,而多年的数据,不考虑年份,只按照所属月份进行提取合成,可以较好地解决这一问题。
这里以Sentinel-2数据为例。
首先加载Sentinel-2数据,后面会对数据进行去云,因此在对数据筛选的时候,没有对影像含云量进行过滤。
//哨兵2 光学数据集
var dataset_s2 = ee.ImageCollection('COPERNICUS/S2')
.filterBounds(roi_cm).filter(ee.Filter.date(startDate, endDate))
.filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 100))
Sentinel-2影像去云函数。QA60波段按位存储像元含云量信息,根据该波段可去掉有云像元。
// /*---------------去云函数---------------*\
function rmCloudByQA(image) {
var qa = image.select('QA60');
var cloudBitMask = 1 << 10;
var cirrusBitMask = 1 << 11;
var mask = qa.bitwiseAnd(cloudBitMask).eq(0)
.and(qa.bitwiseAnd(cirrusBitMask).eq(0));
return image.updateMask(mask);
}
Sentinel-2影像添加变量波段函数。根据研究需要,对数据添加计算得到的NDVI等特征。
var addVariables = function(image) {
return image
// Add an NDVI band.
.addBands(image.normalizedDifference(['B8', 'B4']).rename('NDVI')).float()
// //Add an NDBI band.
.addBands(image.normalizedDifference(['B6', 'B4']).rename('NDBI')).float()
//Add an MNDWI band.
.addBands(image.normalizedDifference(['B3', 'B8']).rename('MNDWI')).float()
};
Sentinel-2数据调用去云函数与添加变量波段函数,先去云再计算特征变量。
var imgCol_s2=dataset_s2.map(rmCloudByQA).map(addVariables);
以NDVI特征为例,进行按月均值合成。
var NDVI=imgCol_s2.select('NDVI');
var MonthlyDataCol = NDVI.filter(ee.Filter.calendarRange(1, 1,'month'))
.mean().rename('NDVI1');
var MonthlyDataColNDVI=MonthlyDataCol;
for(var j=2;j<=12;j++){
var data_collection = NDVI.filter(ee.Filter.calendarRange(j, j,'month')).mean().clip(roi_cm);
var StringBandName='NDVI'+j.toString();
var monthlydata=data_collection.select('NDVI').rename(StringBandName);
MonthlyDataColNDVI=ee.Image.cat([MonthlyDataColNDVI,monthlydata.select(StringBandName)]);
}
print(MonthlyDataColNDVI.getInfo());
这里比较关键的是用到了ee.Filter.calender(start,end,field)函数,函数解释如下,根据field对时间进行筛选,如果field为’month’,就是按照起止月份筛选,想要筛选一月份的数据,就是ee.Filter.calender(1,1,‘month’),添加循环自动计算一月份、二月份…十二月份的数据,提取数据后按照需求进行均值、最值等不同处理方式合成即可。
完整代码链接:GEE-各月份NDVI均值合成
https://code.earthengine.google.com/24b69d45a2df14c6915ad231cd6c4336