GEE:如何进行对MOD09GA数据集进行水体/云掩膜并计算NDVI将其导出至云盘?

目录

01 为什么用GEE而不是传统的下载+ENVI+ArcGIS?

02 操作详解


01 为什么用GEE而不是传统的下载+ENVI+ArcGIS?

由于地理空间数据云中缺少2015年10月份的NDVI月合成影像,于是查看了地理空间数据云的NDVI数据集处理的一些介绍如下(地理空间数据云 (gscloud.cn)):

本打算去NASA下载的,本来下载链接都已经拿到了,但是一看8个G,这还仅仅只是下载,我还需要进行裁剪拼接、NDVI计算重采样等等操作,比较繁琐,最终还只是得到一个张月合成NDVI影像,这时间和精力不成正比:

 于是打算使用GEE平台进行NDVI的计算并导出。

02 操作详解

使用的数据集:MOD09GA.061 Terra Surface Reflectance Daily Global 1km and 500m

这里为了保证精度,对影像进行了云掩膜和水体掩膜。

首先,定义了起始日期和结束日期:

// 定义日期范围
var start_date = '2015-10-01';
var end_date = '2015-10-31';

接着我们定义一个水体和云掩膜函数:

// 定义云和水体掩膜函数
function maskCloudAndWater(image) {
  var QA = image.select('QC_500m');
  // 创建一个空的mask,初始值为1(即所有像素都不被掩膜覆盖)
  var mask = ee.Image.constant(1);
  
  // 遍历每个波段的数据质量标识
  for (var i = 0; i < 2; i++) {  // 因为我选取了两个波段进行ndvi的计算
    // 计算当前波段的数据质量标识的起始位(是从2开始)
    var startBit = 2 + i * 4;
    // 提取当前波段的数据质量标识
    var bandQuality = QA.rightShift(startBit).bitwiseAnd(15);
    // 如果数据质量标识为15,说明该像素可能被云或深海覆盖,需要被掩膜覆盖
    mask = mask.min(bandQuality.neq(15));  // min取两者间小的那个值,逐像元
  }
  
  // 应用掩膜
  return image.updateMask(mask);
}

这里的水体掩膜和云掩膜与一般的数据集不太一样,这里的QC波段是针对每一个波段影像都有4位二进制数进行标识,所以是对每一个波段进行mask的求取再将所有mask求一个类似的或运算。

以下是MOD09GA数据集AC_500m波段的一个介绍(来自GEE):

 

这里主要讲讲二进制掩膜的问题。

在我们的函数里,QA是一个32位的整数,也就是说它是由32个二进制数位组成的,每一个波段都有4位的数据质量标识,这4位被放在QA中的某一位置。例如:

我们举一个简单的例子,对于一个某一个像元,它的属性(32位的二进制整数)值为:

0010 1100 1011 0011 0101 1001 0110 1011

(注意:空格是我为了方便阅读加上的)

在上述二进制整数中,每4位表示一个波段的质量部分,那么假定我们关心的是最左侧的0010部分(这就是我们称之为数据质量的部分)。

那么我们可以将其往右边移动(右移操作)28位,得到:

0000 0000 0000 0000 0000 0000 0000 0010

接着我们就可以将其与掩膜值做比较,这里需要使用到位与操作:

位与操作是对两个二进制数进行比较,只有当两个相应的二进制位都为1时,结果的相应位才为1,否则为0。

通过此前的截图我们知道,Bits2~5表示第1个波段的数据质量部分,掩膜值为15(十进制)表示深海或者云层。

而我们知道,十进制的15转化为32位二进制为:

0000 0000 0000 0000 0000 0000 0000 1111

因此二者进行位与操作之后为:

0000 0000 0000 0000 0000 0000 0000 0010

其转化为十进制不等于15,说明该像元位置不是深海或者云层。


其他的代码部分由于时间原因就不一一说明,这里贴出完整代码:

// 定义日期范围
var start_date = '2015-10-01';
var end_date = '2015-10-31';

// 定义云和水体掩膜函数
function maskCloudAndWater(image) {
  var QA = image.select('QC_500m');
  // 创建一个空的mask,初始值为1(即所有像素都不被掩膜覆盖)
  var mask = ee.Image.constant(1);
  
  // 遍历每个波段的数据质量标识
  for (var i = 0; i < 2; i++) {  // 因为我选取了两个波段进行ndvi的计算
    // 计算当前波段的数据质量标识的起始位(是从2开始)
    var startBit = 2 + i * 4;
    // 提取当前波段的数据质量标识
    var bandQuality = QA.rightShift(startBit).bitwiseAnd(15);
    // 如果数据质量标识为15,说明该像素可能被云或深海覆盖,需要被掩膜覆盖
    mask = mask.min(bandQuality.neq(15));  // min取两者间小的那个值,逐像元
  }
  
  // 应用掩膜
  return image.updateMask(mask);
}

// 定义地理空间范围(四川省)
var geom = ee.FeatureCollection('projects/ee-chaoqiezione/assets/china_admin_province')
geom = geom.filter(ee.Filter.eq('省', '四川省'));
// 加载MODIS数据根据日期和地理范围进行筛选
var modis_ndvi = ee.ImageCollection('MODIS/006/MOD09GA')
  .filterDate(start_date, end_date)
  .filterBounds(geom)
  .select(['sur_refl_b02', 'sur_refl_b01', 'QC_500m'])
  .map(function (img) {
    img = maskCloudAndWater(img);  // 水体和云掩膜
    return img.normalizedDifference(['sur_refl_b02', 'sur_refl_b01']).rename('ndvi')  // 计算ndvi
  })
  .mean().clip(geom)

// 添加到地图上以便可视化
print(modis_ndvi)  // 命令面板输出简要信息
Map.addLayer(modis_ndvi.select('ndvi'), {min: 0, max: 1, palette: ['blue', 'white', 'green']}, 'MeanNDVI');
Map.centerObject(geom, 6)

// 导出至云盘
Export.image.toDrive({
  image: modis_ndvi.select('ndvi'),
  description: 'Mean_NDVI',
  region: geom,
  scale: 500,
  maxPixels: 1e13,
  fileFormat: 'GeoTIFF'})

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

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

相关文章

什么是SpringBoot自动配置

概述&#xff1a; 现在的Java面试基本都会问到你知道什么是Springboot的自动配置。为什么面试官要问这样的问题&#xff0c;主要是在于看你有没有对Springboot的原理有没有深入的了解&#xff0c;有没有看过Springboot的源码&#xff0c;这是区别普通程序员与高级程序员最好的…

【C++】8.编译:CMake工具入门

&#x1f60f;*★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* &#x1f60f;这篇文章主要介绍CMake工具的入门使用。————————————————学其所用&#xff0c;用其所学。——梁启超————————————————— 欢迎来到我的博客&#xff0c;一起学习知识…

【前端客栈】使用CSS实现畅销书排行榜页面

&#x1f4ec;&#x1f4eb;hello&#xff0c;各位小伙伴们&#xff0c;我是小浪。大家都知道&#xff0c;我最近是在更新各大厂的软件测试开发的面试真题&#xff0c;也是得到了很大的反馈和好评&#xff0c;几位小伙伴也是成功找到了测开的实习&#xff0c;非常不错。如果能前…

Java的线程

介绍线程 线程是系统调度的最小单元&#xff0c;一个进程可以包含多个线程&#xff0c;线程是负责执行二进制指令的。 每个线程有自己的程序计数器、栈&#xff08;Stack&#xff09;、寄存器&#xff08;Register&#xff09;、本地存储&#xff08;Thread Local&#xff09…

Git常用命令rebase

Git常用命令rebase 1、git常用命令rebase rebase 会把你当前分支的 commit 放到公共分支的最后面&#xff0c;所以叫变基&#xff0c;就好像你从公共分支又重新拉出来这个 分支一样。 例如如果你从 master 拉了个 feature 分支出来&#xff0c;然后你提交了几个 commit&…

【C++】YY带你手把手掌握C++系列 (P2)未完结

前言 大家好&#xff0c;这里是YY的带你手把手掌握C系列。大部分知识点都含有【特性介绍】【使用场景】【注意要点】【易混淆点】【代码演示】【画图演示】由于C体系之庞大&#xff0c;所以该系列以分P形式更新&#xff01;本篇博客为P2&#xff01; 大家可以通过本篇博客查找C…

【鲁棒优化、机会约束】具有分布鲁棒联合机会约束的能源和储备调度研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

项目实现读写分离操作(mysql)

读写分离 1.问题说明 2.读写分离 Master&#xff08;主库&#xff09;----(数据同步)—> Slave&#xff08;从库&#xff09; Mysql主从复制 mysql主从复制 介绍 mysql主从复制是一个异步的复制过程&#xff0c;底层是基于mysql数据库自带的二进制日志功能。就是一台或多台…

算法套路十七——买卖股票问题:状态机 DP

算法套路十七——买卖股票问题&#xff1a;状态机 DP 状态机DP是一种将动态规划方法应用于有限状态机&#xff08;Finite State Machine&#xff09;的问题求解方法。 状态机DP&#xff08;State Machine DP&#xff09;是一种动态规划的思想&#xff0c;它通常用于解决一些具…

如何应用金字塔模型提高结构化表达能力

看一下结构化表达的定义&#xff1a; 结构化表达&#xff1a;是基于结构化思维&#xff0c;理清事物整理与部分之间关系、换位思考后&#xff0c;进行简洁、清晰和有信服力的表达&#xff0c;是一种让受众听得明白、记得清楚、产生认同的精益沟通方式。 结构化表达的基本原则是…

总结如何申请注册 GitHub 教师教育优惠 Benefits for Teachers 来免费使用 copilot

目录 1. GitHub 教师教育优惠有什么2. 如何申请教师教育优惠呢2.1 选择学校2.2 更改个人信息2.3 准备证明材料2.4 提交申请2.5 遇到的问题2.5.1 问题 12.5.2 问题 22.5.3 问题 3 3. 申请免费的 GitHub Copilot 学生注册不在此处赘述了&#xff0c;网上有很多教程可以参考。但是…

前端BFC

一、首先我们要先了解常见的定位方案&#xff0c;总共3种&#xff08;普通流、浮动、绝对定位&#xff09; 而BFC是属于普通流的 我们可以把BFC看作为页面的一块渲染区域&#xff0c;他有着自己的渲染规则 简单来说BFC可以看作元素的一种属性&#xff0c;当元素拥有了BFC属性…

Python os模块详解

1. 简介 os就是“operating system”的缩写&#xff0c;顾名思义&#xff0c;os模块提供的就是各种 Python 程序与操作系统进行交互的接口。通过使用os模块&#xff0c;一方面可以方便地与操作系统进行交互&#xff0c;另一方面页也可以极大增强代码的可移植性。如果该模块中相…

二叉堆讲解

二叉堆讲解 大顶堆和小顶堆 从二叉堆的结构说起&#xff0c;它是一棵二叉树&#xff0c;并且是完全二叉树&#xff0c;每个结点中存有一个元素&#xff08;或者说&#xff0c;有个权值&#xff09;。 堆性质&#xff1a;父亲的权值不小于儿子的权值&#xff08;大根堆&#x…

什么是JS事件流

什么是JS事件流? 一&#xff1a;事件冒泡 <!DOCTYPE html> <html lang"en"> <head><title>事件冒泡例子</title> </head> <body><div id"box">点击我</div> </body> </html>上述的代…

利用暴力攻击破解登陆密码

长久以来&#xff0c;入侵远程计算机系统的工具和技术并没有发生翻天覆地的变化。例如&#xff0c;在许多情况下&#xff0c;普通用户只要知道了相关密码&#xff0c;就能立刻变身为管理员。虽然这些情形听起来不够曲折&#xff0c;但在大多数情况下&#xff0c;暴力攻击是通过…

css3 flex弹性布局详解

css3 flex弹性布局详解 一、flexbox弹性盒子 2009年&#xff0c;W3C 提出了一种新的方案----Flex 布局&#xff0c;可以简便、完整、响应式地实现各种页面布局。目前&#xff0c;它已经得到了所有浏览器的支持&#xff0c;这意味着&#xff0c;现在就能很安全地使用这项功能。…

【一起啃书】《机器学习》第五章 神经网络

文章目录 第五章 神经网络5.1 神经元模型5.2 感知机与多层网络5.3 误差逆传播算法5.4 全局最小与局部极小5.5 其他常见神经网络5.6 深度学习 第五章 神经网络 5.1 神经元模型 神经网络是由具有适应性简单单元组成的广泛并行互连的网络&#xff0c;它的组织能够模拟生物神经系统…

生产流程图怎么制作?思路提供

生产流程图是一种图表&#xff0c;用来展示生产流程中的各个环节及其顺序。这种图表可以帮助企业管理者更好地了解生产过程中的各个环节&#xff0c;从而更好地进行管理和优化。生产流程图通常包括各个生产环节的名称、所需时间、参与人员、设备和工具等信息。 在制作生产流程图…

七大软件架构设计原则详解

目录 1、概述 2、七大设计原则 2.1、开闭原则 2.2、里氏替换原则 2.3、依赖倒置原则 2.4、单一职责原则 2.5、接口隔离原则 2.6、迪米特法则 2.7、合成复用原则 3、最后 VC常用功能开发汇总&#xff08;专栏文章列表&#xff0c;欢迎订阅&#xff0c;持续更新...&…