前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PIE-engine 教程 ——影像集合的使用for循环函数(北京市NDVI计算)

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

作者头像
此星光明
发布2024-02-02 08:25:54
2150
发布2024-02-02 08:25:54
举报

上一次我们通过对北京市影像集合完成了对其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影像波段值

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-02-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档