Google Earth Engine谷歌地球引擎计算多年中某两个时间点之间遥感数据差值的平均值

  本文介绍在谷歌地球引擎GEE中,提取、计算某一种遥感影像产品在连续的多年中,2不同时相数据差值多年平均值,并将计算得到的这一景差值的结果图像导出的方法。

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

  首先,我们来看一下本文需要实现的需求。现在我们希望计算某一个地区中,在2013年到2020年的这8年中,第257天与249天的这2个时间节点上,NDVI数据的差值的平均值;换句话说,我们希望在2013年到2020年的这8年中,计算每一年里第257天与249天的NDVI数据的差值(也就是获得了8个差值),然后对这8个差值计算平均值,最终得到一景结果栅格图像。随后,我们还希望将这一景结果图像导出到本地。

  知道了需求,我们即可开始代码的撰写。本文需要用到的代码如下。

var ndvi = ee.ImageCollection("MODIS/MYD09GA_006_NDVI")
  .filterDate('2013-01-01', '2023-01-01')
  .select(["NDVI"]);
  
var filterByDay = function(date) {
  var start = ee.Date(date).advance(249, 'day');
  var end = start.advance(1, 'day');
  return ndvi.filterDate(start, end).mosaic();
};
var filterByDay_2 = function(date) {
  var start = ee.Date(date).advance(257, 'day');
  var end = start.advance(1, 'day');
  return ndvi.filterDate(start, end).mosaic();
};

var images = ee.List.sequence(2013, 2020)
  .map(function(year) {
    var date = ee.Date.fromYMD(year, 1, 1);
    return filterByDay(date);
  });
var images_2 = ee.List.sequence(2013, 2020)
  .map(function(year) {
    var date = ee.Date.fromYMD(year, 1, 1);
    return filterByDay_2(date);
  });

var result = ee.ImageCollection.fromImages(images);
var result_2 = ee.ImageCollection.fromImages(images_2);

// var chinaBoundary = ee.Geometry.Rectangle(73, 8, 136, 54);
var chinaBoundary = ee.Geometry.Rectangle(97, 26, 109, 35);

var ndvi_china = result.map(function(image) {
  return image.clip(chinaBoundary);
});
var ndvi_china_2 = result_2.map(function(image) {
  return image.clip(chinaBoundary);
});

var ndvi_history = ndvi_china.reduce(ee.Reducer.mean());
var ndvi_history_2 = ndvi_china_2.reduce(ee.Reducer.mean());

var ndvi_dif_history = ndvi_history_2.subtract(ndvi_history);

Map.addLayer(ndvi_dif_history, {}, 'NDVI_History');
Map.centerObject(ndvi_dif_history, 2);

var exportParams = {
  image: ndvi_dif_history,
  description: 'ndvi_dif_history',
  scale: 500,
  region: chinaBoundary,
  maxPixels: 10000000000000
};

Export.image.toDrive(exportParams);

  上述代码的具体含义如下。

  首先,加载MODIS/MYD09GA_006_NDVI产品,也就是MODISNDVI产品;随后,使用.filterDate()方法筛选出日期范围为2013-01-012023-01-01的图像(本文只需要计算2013年到2020年的这8年数据,所以这里的截止时间设置为2020-12-31之后的任意时间均可),并使用.select(["NDVI"])方法仅选择NDVI波段。

  随后,var filterByDay = function(date) { ... };var filterByDay_2 = function(date) { ... };这两个函数分别定义了2个不同天数(第257天与249天)的不同的筛选方式。filterByDay函数通过将日期向后推移249天来获取每年的第249天的NDVI图像,而filterByDay_2函数通过将日期向后推移257天来获取每年的第257天的NDVI图像。

  其次,var images = ee.List.sequence(2013, 2020).map(function(year) { ... });等两个部分使用ee.List.sequence() 函数生成从2013年到2020年的年份序列,随后通过.map()方法对每个年份应用相应的函数。images变量包含了每年的第249天的的NDVI图像,而images_2变量包含了每年的第257天的NDVI图像。这个函数和前面的函数相结合,就可以提取出从2013年到2020年中每一年的第257天与249天的数据。

  接下来,var result = ee.ImageCollection.fromImages(images);等两行代码将imagesimages_2转换为ee.ImageCollection对象,以便进行后续的图像处理;var ndvi_china = result.map(function(image) { ... });等两个部分使用.map()方法对resultresult_2中的每个图像应用函数,即将图像裁剪为我们需要的边界范围内的区域。

  随后,var ndvi_history = ndvi_china.reduce(ee.Reducer.mean());等两行代码对ndvi_chinandvi_china_2中的图像集合应用ee.Reducer.mean()函数进行降维,计算每个像素点在时间范围内的平均的NDVI图像值,也就是获得了2013年到2020年的这8年中,第257天与249天的这2个时间节点上,NDVI数据各自的平均值。随后的这行代码,就是计算ndvi_history_2ndvi_history之间的差异,相当于就是获得了NDVI数据平均值的差值

  接下来的两行代码,则将ndvi_dif_history图像添加到地图中,并将地图中心设置为该视图的范围。

  最后,var exportParams = { ... };Export.image.toDrive(exportParams);这两段代码为设置导出参数,并使用Export.image.toDrive()ndvi_dif_history图像导出到Google Drive中。之后,我们就可以到Google Drive中下载这一景导出的数据了。

  执行上述代码,如下图所示。首先可以在下方的地图中看到我们计算得到的结果图像,其次可以在右侧看到Tasks中生成的任务。

  在上图中,点击右侧的“Run”,如下图所示。在其中配置好相关的信息,即可开始结果文件的下载。

  随后,就可以在Google Drive中指定的位置看到我们的结果图像文件了;如下图所示。之后,我们就可以将这一景栅格图像文件下载到本地了。

  至此,大功告成。

欢迎关注:疯狂学习GIS

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

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

相关文章

[二分查找]LeetCode2040:两个有序数组的第 K 小乘积

本文涉及的基础知识点 二分查找算法合集 题目 给你两个 从小到大排好序 且下标从 0 开始的整数数组 nums1 和 nums2 以及一个整数 k &#xff0c;请你返回第 k &#xff08;从 1 开始编号&#xff09;小的 nums1[i] * nums2[j] 的乘积&#xff0c;其中 0 < i < nums1.…

【Cell Signaling + 神经递质(neurotransmitter) ; 神经肽 】

Neuroscience EndocytosisExcitatory synapse pathwayGlutamatergic synapseInflammatory PainInhibitors of axonal regenerationNeurotrophin signaling pathwaySecreted Extracellular VesiclesSynaptic vesicle cycle

一个完整的手工构建的cuda动态链接库工程 03记

1&#xff0c; 源代码 仅仅是加入了模板函数和对应的 .cuh文件&#xff0c;当前的目录结构如下&#xff1a; icmm/gpu/add.cu #include <stdio.h> #include <cuda_runtime.h>#include "inc/add.cuh"// different name in this level for different type…

java企业财务管理系统springboot+jsp

1、基本内容 &#xff08;1&#xff09;搭建基础环境&#xff0c;下载JDK、开发工具eclipse/idea。 &#xff08;2&#xff09;通过HTML/CSS/JS搭建前端框架。 &#xff08;3&#xff09;下载MySql数据库&#xff0c;设计数据库表&#xff0c;用于存储系统数据。 &#xff08;4…

LongAddr

目录 1. 引言 2. AtomicInteger的局限性 3. AtomicInteger与LongAdder 的性能差异 4.LongAdder 的结构 LongAddr架构 Striped64中重要的属性 Striped64中一些变量或者方法的定义 Cell类 5. 分散热点的原理 具体流程图 6. 在实际项目中的应用 7. 总结 1. 引言 在这一…

【risc-v】易灵思efinix FPGA riscv 时钟配置的一些总结

系列文章目录 分享一些fpga内使用riscv软核的经验&#xff0c;共大家参考。后续内容比较多&#xff0c;会做成一个系列。 本系列会覆盖以下FPGA厂商 易灵思 efinix 赛灵思 xilinx 阿尔特拉 Altera 本文内容隶属于【易灵思efinix】系列。 文章目录 系列文章目录前言一、pan…

【算法】单调栈题单(矩阵系列、字典序最小、贡献法)⭐

文章目录 题单来源经典题单496. 下一个更大元素 I&#xff08;单调栈模板题&#xff09;503. 下一个更大元素 II&#xff08;单调栈循环数组&#xff09;2454. 下一个更大元素 IV&#xff08;第二个更大的元素&#xff1a;两个单调栈&#xff09;456. 132 模式&#xff08;单调…

java学习part19接口

113-面向对象(高级)-接口的使用_哔哩哔哩_bilibili 1.接口概念 个人认为是一种能力&#xff0c;某个类是否具有某种能力。一个类实现了一个接口就相当于学会了某些功能。 2.使用 接口里的属性都是全局常量public static final&#xff0c;即便不写也会自动加上。 3.多实现 4.接…

Python---函数递归---练习:斐波那契数列(本文以递归算法为主)

编程思想&#xff1a; 如何利用数学模型&#xff0c;来解决对应的需求问题&#xff1b;然后利用代码实现对应的数据模型。 算法&#xff1a;使用代码实现对应的数学模型&#xff0c;从而解决对应的业务问题 程序 算法 数据结构 在经常使用的算法中&#xff0c;有两种非常…

OGG实现Oracle19C到postgreSQL14的实时同步

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

如何从 Jira 成功迁移到极狐GitLab,看这个就够了!

内容来源&#xff1a;https://about.gitlab.com/blog 作者&#xff1a;Melissa Ushakov Atlassian 之前表示&#xff0c;到 2024 年 2 月会全面终止对于其服务器端产品的支持。 随着 Jira Server 的生命周期即将结束&#xff0c;众多组织都在考虑将其敏捷项目管理工具从Jira 迁…

51单片机应用从零开始(十)·指针

指针 C语言指针是一种保存变量地址的数据类型。它可以让程序直接访问内存中的数据&#xff0c;而不需要通过变量名来访问。指针变量存储的是一个地址&#xff0c;这个地址指向内存中的某个位置&#xff0c;该位置存储了一个值。 在C语言中&#xff0c;可以使用&运算符取得一…

网络安全现状

威胁不断演变&#xff1a; 攻击者不断变化和改进攻击方法&#xff0c;采用更复杂、更隐秘的技术&#xff0c;以逃避检测和追踪。这包括新型的勒索软件、零日漏洞利用和社交工程攻击等。 供应链攻击&#xff1a; 攻击者越来越关注供应链的弱点&#xff0c;通过在供应链中植入恶…

5_企业架构LNMP高可用负载均衡服务器

企业架构LNMP高可用负载均衡服务器之Nginx 学习目标和内容 1、能够描述负载均衡的作用 2、能够了解负载均衡常见实现方式 3、能够使用Nginx实现负载均衡 4、能够描述Nginx的常见负载均衡算法 一、背景描述及其方案设计 1、业务背景描述 时间&#xff1a;2011.6.-2013.9 发布产…

移动平均滤波的原理和C代码

移动平均滤波是一种简单有效的平滑信号的方法&#xff0c;它通过计算一系列数据点的平均值来减小信号中的波动。基本的移动平均滤波方法有两种&#xff1a;简单移动平均&#xff08;SMA&#xff09;和指数加权移动平均&#xff08;EWMA&#xff09;。 简单移动平均滤波&#xf…

Stream API 方法使用总结

文章目录 1.1、Stream介绍1.2、Stream创建对象&#xff08;1&#xff09;empty()方法&#xff08;2&#xff09;of()方法&#xff08;3&#xff09;Arrays.stream()方法&#xff08;4&#xff09;list.stream()方法 1.3、Stream中间方法&#xff08;1&#xff09;filter()方法&…

SpringBoot之自定义Starter

目录 一、自己的理解 1. 理解一 2. 理解二 二、自定义starter&#xff08;重点&#xff09; 三、以mybatis-spring-boot-starter为例进行分析 1. 写好自己的自动配置类逻辑 2. 创建自己的starter项目并引入自动配置类项目的依赖 3. 在其它项目中使用自定义的starter 一…

如何开启Windows Server 2016 远端桌面

使用GUI 设定 服务器管理器–> 本地服务器–> 远端桌面 启用远端桌面 远端–> 允许远端连线至此电脑 会提示防火墙设定跟电源设定 防火墙之前已经关闭了 完成

设计基于STM32的温度传感器实时数据采集和显示系统

温度传感器作为常见的传感器之一&#xff0c;被广泛应用于各种领域&#xff0c;如工业自动化、家电控制等。为了实时监测和控制温度&#xff0c;设计一个基于STM32的温度传感器实时数据采集和显示系统是很有必要的。本文将详细介绍如何设计这样一个系统&#xff0c;并提供相应的…

nodejs微信小程序+python+PHP健身房信息管理系统的设计与实现-计算机毕业设计推荐

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…