GEE学习part4—NDVI植被指数(landsat和哨兵为例)

其实呢,求NDVI,对于不同的影像,总体思路就是改改参数

例如:landsat8,红和近红波段分别为4、5;而哨兵系列,红和近红波段分别为4、8;

只需要我们把影像的数据地址、波段、所需的时间、去云函数等进行更改,其他的,使用同一个模版和函数就可以哒(下面代码中,我会把需要更改的地方进行标注!)

结果展示:

landsat5代码:(代码注释的部分的有一点点乱,这也是我自己不断尝试,不断修改报错的结果)


//landsat  NDVI Demo

//方法一:普通方式,通过将数学公式翻译为代码直接计算
// function NDVI_V1(img) {
// var nir = img.select("B5");
// var red = img.select("B4");
// var ndvi = nir.subtract(red).divide(nir.add(red));
// return ndvi;
// }

//方法二:将计算公式直接带入,通过解析字符串实现计算。这种方式更加灵活,在某些特殊情况下非常好用,而且非常直观。
// function NDVI_V2(img) {
// var nir = img.select("B5");
// var red = img.select("B4");
// var ndvi = img.expression(
//   "(B5 - B4)/(B5 + B4)",
//   {
//     "B5": nir,
//     "B4": red
//   }
// );
// return ndvi;
// }


//方法三:GEE将计算公式封装为一个方法可以直接调用
function NDVI_V3(img) {
 var ndvi = img.normalizedDifference(["SR_B4","SR_B3"]);
 return ndvi;
}

//landsat5 and roi 我们这里使用的2010年全部的Landsat5影像 
var l8_col = ee.ImageCollection("LANDSAT/LT05/C02/T1_L2");
// var roi = ee.Geometry.Point([117.0703125,39.09133660751176]);
var roi = ee.Geometry.Polygon(
        [[[116.83822631835938, 39.58654768359213],
          [116.83822631835938, 38.88024924949176],
          [118.77182006835938, 38.88024924949176],
          [118.77182006835938, 39.58654768359213]]], null, false);
var img = ee.Image(l8_col.filterBounds(roi)
                       .filterDate("2010-05-01", "2010-09-24")
                       .first());
// var ndvi1 = NDVI_V1(img);
// var ndvi2 = NDVI_V2(img);
var ndvi3 = NDVI_V3(img);
//NDVI显示配置,NDVI值范围是-1到1
var visParam = {
 min: -0.2,
 max: 0.8,
 palette: 'FFFFFF, CE7E45, DF923D, F1B555, FCD163, 99B718, 74A901, 66A000, 529400,' +
   '3E8601, 207401, 056201, 004C00, 023B01, 012E01, 011D01, 011301'
};
//原始影像真彩色
Map.addLayer(img, {bands:["SR_B3", "SR_B2", "SR_B1"], max:0.3}, "raw_img");
// Map.addLayer(ndvi1, visParam, "ndvi_1");
// Map.addLayer(ndvi2, visParam, "ndvi_2");
Map.addLayer(ndvi3, visParam, "ndvi_3");
Map.centerObject(roi, 7);

//上面只是展示了图像,我们在分析的时候还需要查看我们所筛选的影像NDVI值
var ndvi_list = l8_col.filterDate("2010-05-01", "2010-09-24")
   .map(function(image) {
   //通过云筛选landsat,也可以在左侧示例中换成其他影像的去云函数
  // var cloud = ee.Algorithms.Landsat.simpleCloudScore(image).select("cloud");
  // var mask = cloud.lte(20);
  
  var qa = image.select('pixel_qa');
  // If the cloud bit (5) is set and the cloud confidence (7) is high
  // or the cloud shadow bit is set (3), then it's a bad pixel.
  var cloud = qa.bitwiseAnd(1 << 5)
          .and(qa.bitwiseAnd(1 << 7))
          .or(qa.bitwiseAnd(1 << 3))
  //删除所有波段中不出现的边缘像素
  var mask = image.mask().reduce(ee.Reducer.min());

// Display the results in a cloudy place.
// Map.setCenter(-6.2622, 53.3473, 12);
// Map.addLayer(composite, {bands: ['B3', 'B2', 'B1'], min: 0, max: 3000});
  
  var ndvi = image.normalizedDifference(['SR_B4', 'SR_B3']).rename('NDVI');
   return image.addBands(ndvi).updateMask(mask);
});
// 将函数映射到集合上并取中位数。
// var collection = ee.ImageCollection('LANDSAT/LT05/C02/T1_L2')
//     .filterDate('2010-05-01", "2010-09-24')
 
// var composite = collection
//     .map(ndvi_list)
//     .median();
 

哨兵2号代码:



//sentinel2 NDVI Demo
//方法一:普通方式,通过将数学公式翻译为代码直接计算
// function NDVI_V1(img) {
// var nir = img.select("B8");
// var red = img.select("B4");
// var ndvi = nir.subtract(red).divide(nir.add(red));
// return ndvi;
// }

//方法二:将计算公式直接带入,通过解析字符串实现计算。这种方式更加灵活,在某些特殊情况下非常好用,而且非常直观。
// function NDVI_V2(img) {
// var nir = img.select("B8");
// var red = img.select("B4");
// var ndvi = img.expression(
//   "(B5 - B4)/(B5 + B4)",
//   {
//     "B5": nir,
//     "B4": red
//   }
// );
// return ndvi;
// }


//方法三:GEE将计算公式封装为一个方法可以直接调用
function NDVI_V3(img) {
 var ndvi = img.normalizedDifference(["B8","B4"]);
 return ndvi;
}


//sentinel2 and roi
var s2_col = ee.ImageCollection("COPERNICUS/S2");
var roi = ee.Geometry.Point([117.0703125,38.09133660751176]);
var img = ee.Image(s2_col.filterBounds(roi)
                       .filterDate("2018-05-01", "2018-09-24")
                       .first());
// var ndvi1 = NDVI_V1(img);
// var ndvi2 = NDVI_V2(img);
var ndvi3 = NDVI_V3(img);
var visParam = {
 min: -0.2,
 max: 0.8,
 palette: 'FFFFFF, CE7E45, DF923D, F1B555, FCD163, 99B718, 74A901, 66A000, 529400,' +
   '3E8601, 207401, 056201, 004C00, 023B01, 012E01, 011D01, 011301'
};
Map.addLayer(img, {bands:["B8", "B4", "B3"], max:3048}, "raw_img");
// Map.addLayer(ndvi1, visParam, "ndvi_1");
// Map.addLayer(ndvi2, visParam, "ndvi_2");
Map.addLayer(ndvi3, visParam, "ndvi_3");
Map.centerObject(roi, 9);

//show charts
var ndvi_list = s2_col.filterDate("2018-05-01", "2018-09-24")
   .map(function(image) {
   var ndvi = image.normalizedDifference(['B8', 'B4']).rename('NDVI');
   return image.addBands(ndvi);
});

//展示每一张影像NDVI值 
var chart1 = ui.Chart.image.series({
 //影像集合
 imageCollection: ndvi_list.select('NDVI'),
 //关心区域
 region: roi,
 //关心区域计算方式,这里采用的是均值。也就是比如roi是一个矩形,
 //那么在图表中这个点的值就是矩形内所有像素值求平均。
 reducer: ee.Reducer.mean(),
 //分辨率
 scale: 30
}).setOptions({title: 'NDVI IMAGE SERIES'});
print(chart1);

//展示每一天所关心区域的NDVI值
var chart2 = ui.Chart.image.doySeries({
 imageCollection: ndvi_list.select('NDVI'),
 region:roi,
 regionReducer: ee.Reducer.mean(),
 scale:30
}).setOptions({title: "ROI NDVI EACH DAY SERIES"})
print(chart2)

原版代码参考来自:

知乎大佬:https://zhuanlan.zhihu.com/p/29620366,讲的很详细哦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值