本文记录了农作物长势监测的原理和在GEE上实现的代码,记录了最简单的长势监测算法(更复杂的算法可以根据例子中的方法灵活转换)
详细代码:完整代码
https://code.earthengine.google.com/240f8c95f0f8e904cf362b48fca318f5?noload=true
长势监测原理如下图所示
1,距平模型
2,极值模型
第一部分:计算2015-2020年(每年8月份合成)的NDVI均值
首先建立一个空的列表用来存储影像
var col=ee.List([]);
筛选2015-2020年五年的影像集(每年选择8月份的影像合成)
for(var i=2015;i<2020;i++){
var img=s2.filterDate(i+'-08-01',i+'-08-31').filterBounds(Ca);
var ndvi_list=img.map(
function(image){
var image_mask=image.updateMask(mypaddies.mask());
var ndvi = image_mask.normalizedDifference(['B8', 'B4']).rename('NDVI');
return image_mask.addBands(ndvi)
}
)
var img_mean=ndvi_list.select("NDVI").mean();
//将计算的均值影像作为一个波段添加到col影像集里面
col=col.add(img_mean);
}
//mypaddies指的是计算出来的NDVI图层,本文不做记录,读者可以先计算NDVI再试试。
现在将col列表转换为影像集,并且打印出来,发现col里储存的是2015-2020年的NDVI影像
col=ee.ImageCollection(col);
print(col);
var image_mean=col.mean();
print(image_mean)
然后求每个像素的5年的影像集的均值
var img_mean=ndvi_list.select("NDVI").mean();
第二部分:计算2020年(8月份合成)的NDVI均值
var s2_2020=s2.filterDate('2020-08-01','2020-08-31').filterBounds(Ca);
var ndvi_2020=img.map(
function(image){
var image_mask=image.updateMask(mypaddies.mask());
var ndvi = image_mask.normalizedDifference(['B8', 'B4']).rename('NDVI');
return image_mask.addBands(ndvi)
}
)
将2020年8月份几幅影像求NDVI的均值,并且打印出来
var img_mean_2020=ndvi_2020.select("NDVI").mean();
print(img_mean_2020)
第三部分:用2020年的均值与2015-2020年的均值做数学运算
两个影像做数学运算 (可以做的运算在最后面)
var compare=img_mean_2020.divide(image_mean)
将处理后的影像可视化显示出来
//定义可视化参数
var ndvi_vis={
palette:['red','green']}
Map.addLayer(compare,ndvi_vis)
附加:一种简单的计算多年均值的方法
直接使用mean()函数,但是每一年并不是每天的数据都需要,所以有时候要筛选生长季节或者其他季节来做分析。
var l8toa = ee.ImageCollection("LANDSAT/LC8_L1T_TOA")
.filterDate('2013-01-01', '2020-12-31')
.filterBounds(table);
var meanL=l8toa.mean().clip(table);
print(meanL);
Map.addLayer(table);
Map.addLayer(meanL);
备注:1,针对影像集的每个像素的计算方法
求和、最大值、最小值、均值
2,两幅影响之间可以进行的运算
add() A影像加B影像(括号里面可以填数字)
/subtract() A影像减B影像
/multiply() A影像乘以B影像
/divide() A影像除以B影像
/max()
/min()
/mod()
/pow()
/hypot()
/first()
/and()
/first_nonzero()