谷歌地球引擎GEE计算NDVI与NDWI的年平均值的方法

  本文介绍在谷歌地球引擎(Google Earth Engine,GEE)中,基于哨兵2号遥感影像数据,计算某一指定区域NDVINDWI等指标的年平均值的方法。

  本文是谷歌地球引擎(Google Earth Engine,GEE)系列教学文章的第25篇,更多GEE文章请参考专栏:GEE学习与应用(https://blog.csdn.net/zhebushibiaoshifu/category_11081040.html)。

  首先,明确一下本文的需求。我们现在希望,基于哨兵2号遥感影像数据,计算上海市2024年期间,NDVINDWI2个指数的平均值;相当于最终希望得到2个结果遥感影像,分别表示上述2个指数的平均。

  也很显然,通过本文的代码,我们可以实现基于任意遥感影像产品,计算任意时间与空间范围任意波段指数任意统计值——当然,这些都是建立在这些遥感影像数据在GEE中有(或者是我们手动将本地的数据上传到GEE中)的前提下。

  本文所用代码如下。

var shanghai_coords = ee.Geometry.Rectangle([120.91, 30.67, 122.20, 31.86]);

var s2 = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED')
    .filterBounds(shanghai_coords)
    .filterDate('2024-01-01', '2024-12-31')
    .map(function(image) {
      var qa = image.select('QA60');
      var cloudBitMask = 1 << 10;
      var cirrusBitMask = 1 << 11;
      var mask = qa.bitwiseAnd(cloudBitMask).eq(0)
                 .and(qa.bitwiseAnd(cirrusBitMask).eq(0));
      return image.updateMask(mask);
    });

function addIndices(image) {
  var ndvi = image.normalizedDifference(['B8', 'B4']).rename('NDVI');
  var ndwi = image.normalizedDifference(['B3', 'B8']).rename('NDWI');
  return image.addBands(ndvi).addBands(ndwi);
}

var s2_with_indices = s2.map(addIndices);

var mean_ndvi = s2_with_indices.select('NDVI').mean().rename('mean_NDVI_2024');
var mean_ndwi = s2_with_indices.select('NDWI').mean().rename('mean_NDWI_2024');

Map.centerObject(shanghai_coords, 10);
Map.addLayer(mean_ndvi, {min: -1, max: 1, palette: ['blue', 'white', 'green']}, 'Mean NDVI 2024');
Map.addLayer(mean_ndwi, {min: -1, max: 1, palette: ['red', 'yellow', 'blue']}, 'Mean NDWI 2024');

Export.image.toDrive({
  image: mean_ndvi,
  description: 'mean_NDVI_2024',
  scale: 10,
  region: shanghai_coords,
  maxPixels: 1e13
});
Export.image.toDrive({
  image: mean_ndwi,
  description: 'mean_NDWI_2024',
  scale: 10,
  region: shanghai_coords,
  maxPixels: 1e13
});

  其中,我们首先创建一个表示研究区域的几何对象,用于后续的图像筛选;在这里,我的研究区域是上海市,且为了方便,就直接构建了一个矩形来表示上海地区。

  随后,ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED')加载Sentinel-2的地表反射率图像集合,并利用.filterBounds(shanghai_coords)获取覆盖上海地区的图像,并基于.filterDate('2024-01-01', '2024-12-31')选择2024年全年内的图像——虽然在写这个代码时,2024年还没有过完,但是代码这么写是没有问题的。

  同时,这里用.map(...)进一步对每个图像进行处理——也就是去云。其中,qa = image.select('QA60')表示选择质量评估波段 QA60cloudBitMask = 1 << 10cirrusBitMask = 1 << 11定义云和卷云的二进制掩码位;mask = ...创建一个掩码,确保图像中没有云和卷云,并基于image.updateMask(mask)应用掩码更新图像,去除受云和卷云影响的像素。

  在这里,之所以选用质量评估波段 QA60的第10位和第11位,是因为在Sentinel-2的地表反射率图像产品中,这两位就是分别表示有无云和卷云的比特位;如下图所示,在GEE的产品介绍中,就会有对其波段含义的详细介绍。如果大家用了其他的遥感影像产品,并且也需要做云掩膜,那就参考自己所用产品的介绍即可。

  紧接着,通过addIndices函数为每张图像计算NDVINDWI指数。其中,normalizedDifference(['B8', 'B4'])表示使用近红外(B8)和红光(B4)波段计算NDVI,而normalizedDifference(['B3', 'B8'])表示使用绿光(B3)和近红外(B8)波段计算NDWI。随后,addBands表示将新计算的指数作为额外波段添加到原始图像中,s2_with_indices则表示应用addIndices函数到所有图像,生成带有NDVINDWI的图像集合。

  在这里,具体遥感影像的哪一个波段分别表示哪一个波长,我们也可以在GEE的产品介绍中找到,如下图所示。

  随后,通过select('NDVI')select('NDWI')选择图像中的NDVINDWI波段,并计算选定波段的年度平均值;通过rename(...)重命名输出图像,以便更容易识别。

  再接下来,Map.centerObject(shanghai_coords, 10)表示将地图中心定位到上海地区,缩放级别为10,并通过Map.addLayer(...)在地图上添加图层,显示NDVINDWI的年度平均值。这里的{min: -1, max: 1, palette: [...]}是设置颜色调色板,以可视化不同的指数值。可视化结果如下图所示。

  最后,通过Export.image.toDrive(...)将图像导出到Google Drive。其中,image表示要导出的图像,description是导出文件的描述名称,scale则是输出图像的空间分辨率,region表示导出的地理区域,最后的maxPixels则表示允许的最大像素数,确保导出过程不会因过多像素而消耗太多资源(这个值建议大家设置大一些,就用我这个设置即可)。

  随后,运行上述代码,可以看到Tasks列表中,已经有了我们的平均值下载任务了;如下图所示。

  随后,执行这2个任务,即可开始将结果文件导出至Google Drive,如下图所示。

  导出完毕后,就可以在Google Drive的对应路径下,看到我们刚刚导出到这里的结果图像文件,如下图所示。

  随后,在文件上右键,选择“Download”即可开始下载文件,如下图所示。

  等到文件下载完毕,我们就可以在本地打开这些结果图像文件了。

  至此,大功告成。

欢迎关注:疯狂学习GIS

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/944144.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《机器视觉:开启智能新时代》

《机器视觉&#xff1a;开启智能新时代》 一、机器视觉&#xff1a;工业之眼的崛起二、核心组件&#xff1a;构建精准视觉系统&#xff08;一&#xff09;光源&#xff1a;照亮视界的画笔&#xff08;二&#xff09;镜头&#xff1a;聚焦精准的慧眼&#xff08;三&#xff09;相…

RPA系列-uipath 学习笔记4

使用Uipath 处理hover的问题 备注&#xff1a;使用uipath stversion&#xff1a;2024.10.6,所有学习来源自uipath Academy 首先&#xff0c;打开uipath给我们提供的一个网站 ACME,这个网站呢&#xff0c;需要提前注册一下的哈。 今天呢&#xff0c;就是记录一下&#xff0c;怎…

Excel将混乱的多行做成1列

目标是将数据按从左到右&#xff0c;再从上到下排成一列。 公式法 首先用textjoin函数将文本包起来&#xff0c;做成一个超长文本。 然后用公式 截取文本 Mid(m1,n,3)&#xff0c;意思就是对m1单元格&#xff0c;从第n个字符开始&#xff0c;截取3个字符出来。 这个公式如何自…

期权懂|期权入门知识:如何选择期权合约?

锦鲤三三每日分享期权知识&#xff0c;帮助期权新手及时有效地掌握即市趋势与新资讯&#xff01; 期权入门知识&#xff1a;如何选择期权合约&#xff1f; 一、选择月份&#xff1a; 通常情况下&#xff0c;月份的选择与期货合约的选择类似&#xff0c;主要关注主力合约。主力…

ADC(三):注入组的使用

有关ADC的基础知识请参考标准库入门教程 ADC&#xff08;三&#xff09;&#xff1a;注入组的使用 1、规则组软件触发注入组自动注入2、规则组外部触发注入组自动注入3、规则组软件触发注入组外部触发&#xff08;TIM2_CC1&#xff09;4、规则组软件触发注入组外部触发&#xf…

springboot整合log4j2日志框架1

一 log4j基本知识 1.1 log4j的日志级别 Log4j定义了8个级别的log&#xff08;除去OFF和ALL&#xff0c;可以说分为6个级别&#xff09;&#xff0c;优先级从低到高依次为&#xff1a;All&#xff0c;trace&#xff0c;debug&#xff0c;info&#xff0c;warn&#xff0c;err…

Java - 日志体系_Simple Logging Facade for Java (SLF4J)日志门面_SLF4J集成JUL 及 原理分析

文章目录 官网集成Jdk_logging步骤POM依赖使用 原理分析SLF4J 与 JUL 的集成获取 ILoggerFactory 的过程根据 ILoggerFactory 获取 Logger 实例的过程 小结 官网 https://slf4j.org/ Simple Logging Facade for Java &#xff08;SLF4J&#xff09; 用作各种日志记录框架&…

爆肝1个月:DDR4 的信号完整性(万字长文SI)

前言&#xff1a; 大学里面&#xff0c;总有很多课程&#xff0c;很浪费时间&#xff0c;学了没点用处&#xff0c;问过老师&#xff0c;为什么信号完整性&#xff0c;示波器使用等课程不开呢&#xff0c;这种是对工作真实有帮助的&#xff1f; 老师&#xff1a;因为老师…

一文详解MacOS+CLion——构建libtorch机器学习开发环境

对于希望在本地环境中进行深度学习开发的开发者来说&#xff0c;配置合适的工具链是至关重要的一步。本文旨在帮助您在 macOS 操作系统上&#xff0c;利用 CLion IDE 和 PyTorch 的 C依赖库——libtorch&#xff0c;快速搭建起一个高效的开发环境。这里我们将一步步地讲解如何下…

pg数据库postgis扩展相关技术简介

postgis-note pg数据库postgis扩展相关技术简介 简介 PostGIS是在对象关系型数据库PostgreSQL上增加了存储管理空间数据的能力的开源GIS数据库。依托于PostgreSQL的两个重要特性&#xff1a;Geometry对象、Gist索引。 webgis技术路线 Geometry对象 Geometry&#xff08;几…

Html——10 关键字和描述

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>淘宝网</title><meta name"keywords" content"我要自学网,自学HTML,自学CSS"/><meta name"description" content"要设置…

【原创学习笔记】近期项目中使用的西门子V20变频器总结(上篇)

现场V20 22kW变频器如图所示 进线分别为L1,L2,L3,PE线&#xff0c;出现分别为U,V,W接电机 在西门子官网查询手册后&#xff0c;查询可知可以通过多种方式控制变频器&#xff0c;比如&#xff1a;面板&#xff08;BOP&#xff09;控制&#xff0c;端子&#xff08;NPN/PNP&…

Exchange ProxyShell 攻击链利用详解

目录 ProxyShell CVE-2021-34473 SSRF ProxyShell 详细复现 ProxyShell 一键利用脚本 攻击者利用 ProxyShell 漏洞可绕过相关权限验证,进而配合其他漏洞可执行任意代码,控制Microsoft Exchange Server。 ProxyShell攻击链利用使用了以下漏洞: CVE-2021-34473 一个 SSR…

算法练习——模拟题

前言&#xff1a;模拟题的特点在于没有什么固定的技巧&#xff0c;完全考验自己的代码能力&#xff0c;因此有助于提升自己的代码水平。如果说一定有什么技巧的话&#xff0c;那就是有的模拟题能够通过找规律来简化算法。 一&#xff1a;替换所有问号 题目要求&#xff1a; 解…

ES 磁盘使用率检查及处理方法

文章目录 1. 检查原因2. 检查方法3. 处理方法3.1 清理数据3.2 再次检查磁盘使用率 1. 检查原因 磁盘使用率在 85%以下&#xff0c;ES 可正常运行&#xff0c;达到 85%及以上会影响 PEIM 数据存储。 在 ES 磁盘分配分片控制策略中&#xff0c;为了保护数据节点的安全&#xff0…

leetcode 面试经典 150 题:螺旋矩阵

链接螺旋矩阵题序号54题型二维数组&#xff08;矩阵&#xff09;解题方法模拟路径法难度中等熟练度✅✅✅ 题目 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3…

汽车CAN通信逻辑与LabVIEW开发

CAN通信的核心概念 CAN&#xff08;Controller Area Network&#xff09;是一种多主通信协议&#xff0c;广泛应用于汽车电子系统中&#xff0c;用于控制单元之间的高效通信。 ​ 消息优先级&#xff1a;每个CAN帧包含唯一的标识符&#xff08;ID&#xff09;&#xff0c;ID的…

CI/CD是什么?

CI/CD 定义 CI/CD 代表持续集成和持续部署&#xff08;或持续交付&#xff09;。它是一套实践和工具&#xff0c;旨在通过自动化构建、测试和部署来改进软件开发流程&#xff0c;使您能够更快、更可靠地交付代码更改。 持续集成 (CI)&#xff1a;在共享存储库中自动构建、测试…

Kubernetes之NodeSelector与NodeName实战

目录 目标 版本 官网 概述 实战 NodeName实战 NodeSelector实战 目标 通过配置NodeSelector与NodeName实现Pod运行&#xff08;或优先运行&#xff09;在我们期望的节点之上。了解这两种实现方法的区别。 版本 Kubernets v1.25.0 官网 将Pod分配给节点https://kubernet…

如何构建有效的AI Agents:从复杂到简约——深度解读Claude实践总结《Building effective agents》(上)

在人工智能技术日新月异的今天&#xff0c;大语言模型(LLM)已经成为技术创新的热点。 然而&#xff0c;在追逐技术前沿的热潮中&#xff0c;我们是否忽视了工程设计的本质&#xff1f; 作为全球人工智能领域的领军企业之一&#xff0c;Anthropic以其在AI安全和伦理方面的深入…