PIE-engine 教程 ——影像集合的使用for循环函数(北京市NDVI计算)

上一次我们通过对北京市影像集合完成了对其NDVI的计算,这次我们同样换一个for循环的形式来实现NDVI的计算,大家可以找找差异,以下是上一篇文章的链接:

这里函数就不在介绍了,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

代码:

代码语言:javascript
复制
/**
 * @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影像波段值