获取MODIS的NDVI/EVI产品

news2025/1/16 1:02:23

目录

  • 简介
  • 源代码
  • 运行流程
  • 参考博文

简介

本项目是使用MODIS的NDVI产品(MOD13Q1),可获取从2000年至今的所有数据,更新频率为16天
MOD13Q1 V6.1产品以每像素为基础提供植被指数(VI)值。这里有两个主要的植被层。第一种是归一化植被指数(NDVI),即现有美国国家海洋和大气管理局先进甚高分辨率辐射计(NOAA-AVHRR)衍生的NDVI的连续性指数。第二层植被层是增强型植被指数(Enhanced vegetation Index, EVI),它最大限度地减少了冠层背景变化,并在茂密植被条件下保持了敏感性。EVI还使用蓝带去除由烟雾和亚像素薄云引起的残留大气污染。MODIS NDVI和EVI产品是根据经过大气校正的双向表面反射率计算得出的,这些反射率被水、云、重气溶胶和云影遮蔽。
在这里插入图片描述

源代码

var panel = ui.Panel();//新建面板
// 设置面板的宽度,以及默认字体(字体等设置会在之后被覆盖)
panel.style().set({width: '20%',fontSize: '1vw',fontWeight: 'bold'});
// 在UI中插入这个面板
ui.root.insert(1, panel);

// *introduction面板
var intro_panel = ui.Panel([
  // *标题(Label)
  ui.Label({
      // 标题想写啥:
      value: 'Global NDVI Mapping',
      
      // 设置字体
      // 注:字体大小的vw(Viewport Width)、vh(Viewport Height)是基于视图窗口的单位,是css3的一部分,基于视图窗口的单位
      // vw:1vw 等于视口宽度的1%
      // Vh:1vh 等于视口高度的1%
      style: {
                fontSize: '1.5vw',//字体大小,vw会随着视窗大小而缩放
                fontWeight: 'bold',//字体粗细
                color: 'blue',//字体颜色
                textAlign: 'center'//放置位置(居中)
            },
        }),
  // *解释本APP的说明(Label)
  ui.Label({
      // 说明想说些啥:
      value: //一行写不下去,就用+
            'You can set the desired time range and spatial extent by drawing any shape on the map.'+
            ' This will allow you to obtain an average Normalized Difference Vegetation Index (NDVI) map for that region and time period. ' ,
      style: {
                fontSize: '1.0vw',
                fontWeight: 'normal',
                textAlign: 'left'//放置位置(居左)
            },
        }),
  // *时间调节的标题(Label)
  ui.Label({
      value: 'Define Date Range:',
      style: {
              fontWeight: 'bold', //字体
              fontSize: '1.0vw',//字号
              padding: '0px', //边距
              stretch: 'horizontal', 
              textAlign: 'left'//文本居左
      }
      }),  
]);

// 将该部分放置于panel
panel.add(intro_panel);
// 预设初始日期和结束日期
var startDate = ee.Date("2023-05-01");
var endDate = ee.Date("2023-08-01");


// 初始日标题(Label),,注释同上
var Label_DateStart = ui.Label({
  value: 'Start Date (yyyy-mm-dd):',
  style: {
    fontWeight: 'bold', 
    fontSize: '1.0vw',
    //padding填充:顺序为 上 右 下 左 ,详见下面的padding和margin说明图
    padding: '0px 0px 0px 3px', 
    stretch: 'horizontal',   
    textAlign: 'left'}
});

// 结束日标题(Label)
var Label_DateEnd = ui.Label({
  value: 'End Date (yyyy-mm-dd):',
  style: {
    fontWeight: 'bold', 
    fontSize: '1.0vw',
    padding: '0px 0px 0px 3px', 
    stretch: 'horizontal',   
    textAlign: 'left'}
});

// 初始日输入框(Textbox)
var Textbox__DateStart = ui.Textbox({
    placeholder: "2023-05-01",//在未有任何输入前,在该文本框的数值
    // onchange 事件会在域的内容改变时发生。
    onChange: function(value) {
      //当文本框中的内容发生变化时,startDate的值会改变
      startDate = ee.Date(value);
    },
    // 设置输入框的宽度
    style: {width: '50%', stretch: 'horizontal',padding:'0px 0px 0px 0px'}
  });
  
// 结束日的输入框,,注释同上
var Textbox__DateEnd = ui.Textbox({
    placeholder: "2023-08-01",
    onChange: function(value) {
      endDate = ee.Date(value);
      print('endDate',endDate)
    },
    style: {width: '50%', stretch: 'horizontal',padding:'0px 0px 0px 0px'}
  });

// 将文本和输入框水平放置,即设置放置属性为'horizontal'
panel.add(ui.Panel([Label_DateStart, Textbox__DateStart], ui.Panel.Layout.flow('horizontal')));
panel.add(ui.Panel([Label_DateEnd, Textbox__DateEnd], ui.Panel.Layout.flow('horizontal')));
// 地图中间的提示词
var map_center_panel = ui.Panel({//设置面板的属性
    layout: ui.Panel.Layout.flow('vertical'),
    style: {
        position: 'top-center',//面板位于中间顶部
        // width: '30%'
    }
});
var roi_label =  ui.Label({//设置label属性
    value: 'Please Draw Any Shape on the Map',
    style: {
        fontSize: '1.3vw',
        color: '#9400D3',
        fontWeight: 'bold',
        textAlign: 'center',
        margin: '0px 0px 0px 0px'
    },
})
map_center_panel.add(roi_label)//将label放置于panel
Map.add(map_center_panel);//将提示词panel放置于地图

Map.style().set('cursor', 'crosshair');//将鼠标指针形式变为十字,便于绘制

var roi_extend = ee.FeatureCollection([null]);//初始化一个FeatureCollection,用于存储绘制的空间范围

var drawingTools = Map.drawingTools(); // 初始化绘图构建
drawingTools.setLinked(false); //setLinked是控制:是否将你绘制的图形加载到(GEE JS版本的)导入区域(imports panel) 
drawingTools.setDrawModes(["polygon"]); //设置绘图类型,有point, line, polygon, and rectangle可供选择  
drawingTools.addLayer([], "poly", "#9400D3"); //设置所绘制的图形的名称及颜色  
drawingTools.setShape("polygon"); //设置绘制模式,有point, line, polygon, and rectangle可选   
drawingTools.draw(); //进入绘制状态

//debounce是允许对重复触发的每个调用序列最多调用一次,只要它们的触发间隔小于指定的间隔(以毫秒为单位)。
var getManual_poly = ui.util.debounce(function(layer) { 
  roi_extend = ee.FeatureCollection(layer);//将绘制的图形写入roi_extend
  Map.centerObject(roi_extend);//调节地图中心
  Map.addLayer(ee.Image().toByte().paint(layer, 3, 5),{},'roi_boundary')//绘制图形边缘
}, 500); //触发间隔需要小于500毫秒

drawingTools.onEdit(getManual_poly); // 当图形编辑后,触发的回调函数
drawingTools.onDraw(getManual_poly); // 当图形绘制后,触发的回调函数
drawingTools.onErase(getManual_poly); // 当图形移除后,触发的回调函数
// 放置多日均值NDVI绘制的按钮
var NDVI_btn = ui.Button({
    label: "Generate NDVI mapping",//按钮上的字
    style: {  stretch:'horizontal'//水平放置
}});
panel.add(NDVI_btn);// 在panel中放置这个按钮
NDVI_btn.onClick(get_NDVI_mean); //设定点击按钮后触发的函数

// 放置擦除的按钮,注释同上
var clear_btn = ui.Button({
    label: "Clear Layers",
    style: {  stretch:'horizontal'},
    onClick: get_clear //这是onClick的另一种使用方式
  });
panel.add(clear_btn);// 在panel中放置这个按钮

// NDVI出图配色
var ndviVis = {
  min: 0,
  max: 8000,
  palette: [
    'ffffff', 'ce7e45', 'df923d', 'f1b555', 'fcd163', '99b718', '74a901',
    '66a000', '529400', '3e8601', '207401', '056201', '004c00', '023b01',
    '012e01', '011d01', '011301'
  ],
};
// NDVI多日均值计算
function get_NDVI_mean(){
  clear_drawTool();// 移除绘制的polygen,不然会挡在图层上影响美观
  var NDVI_mean = ee.ImageCollection('MODIS/061/MOD13Q1')
                  .filterDate(startDate,endDate)//时间过滤,使用上面输入的初始日和结束日
                  .select('NDVI')
                  .mean()
                  .clip(roi_extend);//裁剪,使用用户绘制的图形
  Map.addLayer(NDVI_mean,ndviVis,'NDVI_mean')//绘制
}
// 函数:清除地图所有图层
function get_clear(){
  Map.clear()//清除地图所有图层
  // 将基础配置重新加载
  // Map.addLayer(continent_bound_image, {palette: "red"}, 'continent bound')
  Map.add(map_center_panel);//将提示词panel放置于地图
  clear_drawTool()
}
// 清除绘图组件,注释同上
function clear_drawTool(){
  drawingTools.clear(); 
  drawingTools.setLinked(false); 
  drawingTools.setDrawModes(["polygon"]); 
  drawingTools.addLayer([], "poly", "#9400D3"); 
  drawingTools.setShape("polygon"); 
  drawingTools.draw(); 
  drawingTools.onEdit(getManual_poly); 
  drawingTools.onDraw(getManual_poly);   
  drawingTools.onErase(getManual_poly); 
}

运行流程

首先要绘制一个区域范围
在这里插入图片描述
在地图上任意连线,首尾点重合则绘制完成。
在这里插入图片描述
输入日期范围,然后生成NDVI,得到的NDVI是长时间的一个平均值
在这里插入图片描述

参考博文

GEE APP 开发-第一弹!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeedCode刷题---滑动窗口问题(二)

顾得泉:个人主页 个人专栏:《Linux操作系统》 《C/C》 《LeedCode刷题》 键盘敲烂,年薪百万! 一、将X减到0的最小操作数 题目链接:将 x 减到 0 的最小操作数 题目描述 给你一个整数数组 nums 和一个整数 x 。每一…

MetaAI语音翻译大模型Seamless登场,主打AI无缝同声传译

论文题目: Seamless: Multilingual Expressive and Streaming Speech Translation 论文链接: https://ai.meta.com/research/publications/seamless-multilingual-expressive-and-streaming-speech-translation/ 代码链接: GitHub - facebook…

2024年转行软件测试,报培训班3个月出来就是高薪工作,真的靠谱吗?

作为一个已在IT行业工作8年,分享一下我的经验,供大家参考。 讲真,现在想通过培训班培训几个月就进入IT行业,越来越来难了;如果是在2018年以前,还有机会,一方面,那个时候IT行业还不算…

Linux系统log日志简单清理

系统空间告急 清理log日志 找出当前目录中文件最大的10个文件: cd /var/log du -s ./* | sort -nr | head 系统日志log文件: ll -h /var/log/journal 只保留100MB的日志 journalctl --vacuum-size100M 系统暴力爆破SSH日志: ll -h /var/lo…

Flask基本用法:一个HelloWorld,搭建服务、发起请求

目录 1、简介 2、安装 3、Flask使用示例 参考 1、简介 官网文档 Flask是一个轻量的web服务框架,我们可以利用它快速搭建一个服务,对外提供接口,其他人可以轻松调用我们的服务。这对算法工程师来说比较关键,我们通常不擅长搞开发…

【精选】计算机网络教程(第2章网络层)

目录 前言 第2章网络层 1、编码与调制 2、传输方式 前言 总结计算机网络教程课程期末必记知识点。 第2章网络层 1、编码与调制 信道可以分成传送模拟信号的模拟信道和传送数字信号的数字信道两大类。通常人们将数字数据转换成数字信号的过程称为编码,而将数字…

leetcode刷题日志-383赎金信

思路:分别用两个map记录ransomNote和magazine中的字符以及出现的次数。最后遍历记录ransomNote的map,如果ransomNote的map中出现的magazine的map中没有出现或者出现的次数小于ransomNote的map则返回false,否则返回true; class So…

基于VGG-16+Android+Python的智能车辆驾驶行为分析—深度学习算法应用(含全部工程源码)+数据集+模型(一)

目录 前言总体设计系统整体结构图系统流程图 运行环境Python环境TensorFlow 环境Pycharm 环境Android环境 相关其它博客工程源代码下载其它资料下载 前言 本项目采用VGG-16网络模型,使用Kaggle开源数据集,旨在提取图片中的用户特征,最终在移…

我们来谈谈葡萄酒泡泡吧

香槟是任何庆祝场合的最佳搭配。从婚礼和生日到单身派对和典型的周五晚上,这款气泡饮料是生活中特别聚会的受欢迎伴侣。 来自云仓酒庄品牌雷盛红酒分享你知道吗,你喜欢喝的那瓶香槟酒可能根本不是香槟,而是汽酒?你不是唯一一个认为…

UE虚幻引擎项目更改名字怎么操作?

首先找到项目目录,直接更改项目程序的名字,其次点击项目程序右击使用文本打开,然后将Modules模块中的内容删除即可,然后运行程序就好啦!

如何将数据库导入MySQL的办法

在电脑cmd终端进行导入 首先找到MySQL中bin的位置 第一步:找到MySQL 第二步:进入MySQL 第三步:打开bin 第四步:输入cmd进入终端 第五步: 输入mysql -uroot -p 然后会弹出enter password: 输入你的密码…

libevent服务GET/POST的简单使用

目录 1、前言2、测试demo2.1、目录结构2.2、 测试源码2.2.1、http_server.cpp2.2.2、 http_server.h 2.3、 编译2.4、 运行结果2.4.1、测试POST2.4.2 、测试GET请求 1、前言 项目开发中经常需要使用到私有协议和Qt,Android等GUI前端通信,比较常用的使用POST和GET方式…

CesiumLab地理信息基础数据处理平台 各类数据类型介绍、发布数据介绍

目录 0 引言1 CesiumLab2 数据处理模块2.1 输出格式:切片文件格式2.2 输入格式2.2.1 传统GIS数据2.2.2 人工模型2.2.3 BIM模型2.2.4 倾斜实景数据2.2.5 点云数据 3 发布服务功能3.1 拓展:其他平台发布服务功能 🙋‍♂️ 作者:海码…

http状态码(一)400报错

一 400报错汇总 ① 综述 一、4xx状态码报错说明: 客户端行为导致的报错二、通用的4xxHTTP报错1) 4002) 4013) 4034) 4045) 405 --> 不允许方法,可能跨域或者nginx限制请求方法6) 4087) 4138) 419三、ngin自身定义的4xx报错495、496、497、498、4…

【JAVA-Day65】Java内部类深度解析

Java内部类深度解析 《Java内部类深度解析》摘要引言一、理解内部类1. 内部类的基本概念和语法1.1 什么是内部类?1.2 内部类的语法结构1.3 内部类的基本概念 2. 不同类型的内部类详解2.1 成员内部类2.2 静态内部类2.3 局部内部类2.4 匿名内部类 二、内部类与普通类的…

K - 近邻算法

1、算法介绍 KNN(K Near Neighbor):k个最近的邻居,即每个样本都可以用它最接近的k个邻居来代表。KNN算法属于监督学习方式的分类算法,我的理解就是计算某给点到每个点的距离作为相似度的反馈。 简单来讲,KN…

算法-----全排列

目录 前言 代码 思路 我的其他博客 前言 全排列是一种组合数学的概念,它表示将一组元素按照一定顺序进行排列的所有可能情况。在计算机编程中,通常使用递归来实现全排列。以下是使用Java语言实现全排列的详细解释: 代码 public class Pe…

YOLOv8改进:ASF-YOLO助力小目标,提取多尺度特征| 2023年12月最新成果

🚀🚀🚀本文改进: ASF-YOLO一种新的特征融合网络架构,该网络由两个主要的组件网络组成,可以为小目标分割提供互补的信息:(1)SSFF模块,它结合了来自多尺度图像的全局或高级语义信息;(2)TFE模块,它可以捕获小目标的局部精细细节等 🚀🚀🚀YOLOv8改进专栏:http://…

邮件服务下载安装详细步骤、汉化、配置

Foxmail for Mac 下载地址:Download - hMailServer - Free open source email server for Microsoft Windows 教程地址 hMailServer安装使用教程 - 诸子流 - 博客园 (cnblogs.com) 设置密码为:dzqdb123 设置好端口 添加账号密码 (9条消息) hMailServer 配置DKIM…

软件测试找了两个月了,简历投了10万多次,找不到工作怎么办?

是行情不好吗?我觉得不是,为什么别人可以找到,而你找了两个月还找不到。 只能说明一个原因,你学的东西和企业需要有些差距。 现在,软件测试已经不是过去那样只会点点点就可以找到一个合适的工作。 首先因为大环境原…