在GEE中,时间序列分析经常用到,有时根据研究需要,会统计在每个pixel上时间序列最大值所对应的日期或时间,这一操作,这一操作的算法思想与取一个列表中最大值所对应的索引有异曲同工之处。
废话不多说直接上代码
var wuhan = ee.FeatureCollection("users/yp7454982/wuhan");
var dataset=ee.ImageCollection("MODIS/006/MOD13Q1")
.filterDate('2019-01-01','2019-12-31')
.select("NDVI")
print(dataset)
这里以MOD13Q1的16天产品2019年时间序列为例,选择对应的NDVI波段时间序列。
function get_max_value_date(time_series){
var first_date=time_series.first().date();
var max_value=time_series.max();
var eq_max_col=time_series.map(function (image){
var eq_0_1=image.eq(max_value);
var img_doy=image.date().difference(first_date,'day')
return ee.Image(img_doy).toFloat().multiply(eq_0_1)
})
return eq_max_col.sum()
}
var max_value_date=get_max_value_date(dataset)
print(max_value_date)
算法核心思想:
取影像集中第一个影像的成像时间作为初始时间,并对影像集进行最大值合成,因此max_value图层每个pixel都是时间序列上的最大值,在对原始时间序列进行遍历,逐一与max_value进行eq比较,产生二值逻辑图像,等于1的pixel则为对应最大值对应的pixel,将其乘上对应的影像时间差,最终将eq_max_col来进行逐像素时间序列合成即可得到对应图像。
var chart=ui.Chart.image.histogram({
image:max_value_date.clip(wuhan),
region:wuhan,
scale:250,
//maxPixels:1e13
})
print(chart)
var vis={
min:0,
max:360,
palette: [
'FFFFFF', 'CE7E45', 'DF923D', 'F1B555', 'FCD163', '99B718', '74A901',
'66A000',
]
}
Map.centerObject(wuhan,8)
Map.addLayer(max_value_date.clip(wuhan),vis,'day')
Export.image.toDrive({
image: max_value_date.clip(wuhan),
description: "wuhan_ndvi_2019_max_value_date",
scale: 250,
region: wuhan.geometry(),
maxPixels: 1e13
});