上一次我们通过对北京市影像集合完成了对其NDVI的计算,这次我们同样换一个for循环的形式来实现NDVI的计算,大家可以找找差异,以下是上一篇文章的链接:
(931条消息) PIE-engine 教程 ——影像集合的使用map()映射函数(北京市NDVI计算)_此星光明的博客-CSDN博客
这里函数就不在介绍了,NDVI的计算公式就是:
NDVI——归一化植被指数:NDVI=(NIR-R)/(NIR+R),或两个波段反射率的计算。
1、NDVI的应用:检测植被生长状态、植被覆盖度和消除部分辐射误差等;
2、-1可见光高反射;0表示有岩石或裸土等,NIR和R近似相等;正值,表示有植被覆盖,且随覆盖度增大而增大;
3、NDVI的局限性表现在,用非线性拉伸的方式增强了NIR和R的反射率的对比度。对于同一幅图象,分别求RVI和NDVI时会发现,RVI值增加的速度高于NDVI增加速度,即NDVI对高植被区具有较低的灵敏度;
4、NDVI能反映出植物冠层的背景影响,如土壤、潮湿地面、雪、枯叶、粗糙度等,且与植被覆盖有关;
大家还记得之前发布for和map的区别吗?for循环需要准确知道我们要运行的次数,所以我们必须知道这个影像集合中有多少张影像需要我们遍历,我们用到的函数:
size()
获得影像集合中Image的个数。
方法参数:
- imageCollection(ImageCollection)
ImageCollection实例。
返回值:Number
mosaic()当我们要输出影像的时候(单张/景影像除外),必须要合成就会用到此函数
将影像集合融合成为一张影像Image,融合规则保留是这个影像集合中最新的有效像素值。
方法参数:
- imageCollection(ImageCollection)
ImageCollection实例。
返回值:Image
clip(geometry)
按照指定的矢量边界裁剪影像。除了未被几何覆盖的数据被掩盖之外,裁剪前后的影像波段完全对应。裁剪后影像保留裁剪前的元数据。
方法参数:
- image(Image)
Image实例。
- geometry(Feature|Geometry|Object)
裁剪使用的矢量边界。
返回值:Image
代码:
/** * @File : map-07-ImageCollection循环计算_使用for循环 * @Time : 2022/3/1 * @Author : piesat * @Version : 1.0 * @Contact : 400-890-0662 * @License : (C)Copyright 航天宏图信息技术股份有限公司 * @Desc : 取ImageCollection中的每个元素计算NDVI,采用for循环 */ //加载北京市边界 var roi = pie.FeatureCollection("NGCC/CHINA_PROVINCE_BOUNDARY") .filter(pie.Filter.eq("name", "北京市")) .first() .geometry(); Map.centerObject(roi, 6); Map.addLayer(roi, { color: "ff0000", fillColor: "00000000", width: 3 }, "北京市"); //按区域、时间筛选影像 var imgCol = pie.ImageCollection("LC08/01/T1") .filterBounds(roi) .filterDate("2019-8-01", "2019-8-30"); print("imgCol", imgCol); Map.addLayer(imgCol.select(["B2", "B3", "B4"]).mosaic().clip(roi), { min: 0, max: 2500, bands: ["B4", "B3", "B2"] }, "imgCol", false); //获取影像数量 var count = imgCol.size(); print(count); //循环计算每景影像NDVI植被指数 var newCol = []; for (i = 0; i <= 7; i++) { var image = imgCol.getAt(i); var nir = image.select("B5"); var red = image.select("B4"); var imgCol_NDVI = nir.subtract(red).divide(nir.add(red)).rename("NDVI"); image = image.addBands(imgCol_NDVI); newCol.push(image); } var imgCol_new = pie.ImageCollection().fromImages(newCol); print("imgCol_new", imgCol_new); //NDVI绘制样式 var visParamNDVI = { min: -0.2, max: 0.8, palette: ['FFFFFF', 'CE7E45', 'DF923D', 'F1B555', 'FCD163', '99B718', '74A901', '66A000', '529400', '3E8601', '207401', '056201', '004C00', '023B01', '012E01', '011D01', '011301'] }; //加载北京市NDVI植被指数 var NDVI = imgCol_new.select("NDVI").mosaic().clip(roi); Map.addLayer(NDVI, visParamNDVI, "NDVI");
大家始终记住一点,就是当我们在使用for循环的时候,如果要遍历,必须首先要获取影像或者矢量的id序列号,这时就会用到getAt这个功能。
getAt(index)
获得影像集合中指定编号的Image对象。
方法参数:
- imageCollection(ImageCollection)
ImageCollection实例。
- index(Number)
Image的编号
返回值:Image
我们获得影像数量
新增的NDVI影像波段值