GEE:使用Sentinel-2数据做基于NDVI的长势监测(求5年影像集的NDVI均值,和当前年份的NDVI,两个影像做数学运算)

本文记录了农作物长势监测的原理和在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()

猜你喜欢

转载自blog.csdn.net/qq_35591253/article/details/109086869