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


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

    代码:

    1. /**
    2. * @File : map-07-ImageCollection循环计算_使用for循环
    3. * @Time : 2022/3/1
    4. * @Author : piesat
    5. * @Version : 1.0
    6. * @Contact : 400-890-0662
    7. * @License : (C)Copyright 航天宏图信息技术股份有限公司
    8. * @Desc : 取ImageCollection中的每个元素计算NDVI,采用for循环
    9. */
    10. //加载北京市边界
    11. var roi = pie.FeatureCollection("NGCC/CHINA_PROVINCE_BOUNDARY")
    12. .filter(pie.Filter.eq("name", "北京市"))
    13. .first()
    14. .geometry();
    15. Map.centerObject(roi, 6);
    16. Map.addLayer(roi, { color: "ff0000", fillColor: "00000000", width: 3 }, "北京市");
    17. //按区域、时间筛选影像
    18. var imgCol = pie.ImageCollection("LC08/01/T1")
    19. .filterBounds(roi)
    20. .filterDate("2019-8-01", "2019-8-30");
    21. print("imgCol", imgCol);
    22. Map.addLayer(imgCol.select(["B2", "B3", "B4"]).mosaic().clip(roi), { min: 0, max: 2500, bands: ["B4", "B3", "B2"] }, "imgCol", false);
    23. //获取影像数量
    24. var count = imgCol.size();
    25. print(count);
    26. //循环计算每景影像NDVI植被指数
    27. var newCol = [];
    28. for (i = 0; i <= 7; i++) {
    29. var image = imgCol.getAt(i);
    30. var nir = image.select("B5");
    31. var red = image.select("B4");
    32. var imgCol_NDVI = nir.subtract(red).divide(nir.add(red)).rename("NDVI");
    33. image = image.addBands(imgCol_NDVI);
    34. newCol.push(image);
    35. }
    36. var imgCol_new = pie.ImageCollection().fromImages(newCol);
    37. print("imgCol_new", imgCol_new);
    38. //NDVI绘制样式
    39. var visParamNDVI = {
    40. min: -0.2,
    41. max: 0.8,
    42. palette: ['FFFFFF', 'CE7E45', 'DF923D', 'F1B555', 'FCD163', '99B718', '74A901',
    43. '66A000', '529400', '3E8601', '207401', '056201', '004C00', '023B01',
    44. '012E01', '011D01', '011301']
    45. };
    46. //加载北京市NDVI植被指数
    47. var NDVI = imgCol_new.select("NDVI").mosaic().clip(roi);
    48. Map.addLayer(NDVI, visParamNDVI, "NDVI");

     大家始终记住一点,就是当我们在使用for循环的时候,如果要遍历,必须首先要获取影像或者矢量的id序列号,这时就会用到getAt这个功能。

    getAt(index)

    获得影像集合中指定编号的Image对象。

    方法参数:

    - imageCollection(ImageCollection)

    ImageCollection实例。

    - index(Number)

    Image的编号

    返回值:Image

     我们获得影像数量

     新增的NDVI影像波段值

     

  • 相关阅读:
    MySQL进阶——视图
    vue+echarts项目十:使用webSocket优化项目:前后端代码改造
    【设计模式】Java 语言不同的编程范式-第1章
    通过PWM实现呼吸灯
    kafka的Java客户端-offset
    吴恩达深度学习笔记——序列模型与循环神经网络(Sequence Models)
    神经网络模型结果怎么看,图像识别神经网络模型
    二叉搜索树
    Vue框架--收集表单数据
    在VMware Workstation Pro安装win7
  • 原文地址:https://blog.csdn.net/qq_31988139/article/details/126924758