GEE19:基于Landsat8的常见的植被指数逐年获取
植被指数逐年获取
- 1. 常见的植被指数
- 1.1 比值植被指数(Ratio vegetation index,RVI)
- 1.2 归一化植被指数(Normalized Difference Vegetation Index,NDVI)
- 1.3 增强植被指数(Enhanced Vegetation Index,EVI)
- 1.4 土壤调节植被指数(Soil Adjusted Vegetation Index,SAVI)
- 1.5 差值植被指数(Difference Vegetation Index,DVI)
- 1.6 计算公式
- 1.7 补充:Landsat的优点
- 2. GEE code
- 3. 参考
1. 常见的植被指数
1.1 比值植被指数(Ratio vegetation index,RVI)
RVI值的范围:0-30+,一般绿色植被区的范围是2-8,无植被覆盖的地面(裸土、人工建筑、水体、植被枯死或严重虫害)的RVI在1附近。
RVI是绿色植物的敏感参数,可以及时反映出作物 LAI 的变化。植被覆盖度影响 RVI,当植被覆盖度较高时,RVI 对植被十分敏感;当植被覆盖度<50%时,这种敏感性显著降低。
1.2 归一化植被指数(Normalized Difference Vegetation Index,NDVI)
NDVI可以消除大部分与仪器定标、太阳角、地形、云阴影和大气条件相关辐射照度变化的影响,常用于研究植被生长状态及覆盖度。
NDVI在LAI值很高,即植被茂密时其灵敏度会降低。负值表示地面覆盖为云、水、雪等,对可见光高反射;0表示有岩石或裸土等,NIR和R近似相等;正值,表示有植被覆盖,且随覆盖度增大而增大;值的范围是 -1 ~ 1,一般绿色植被区的范围是0.2 ~ 0.8。
1.3 增强植被指数(Enhanced Vegetation Index,EVI)
EVI 加入蓝色波段以增强植被信号,矫正土壤背景和气溶胶散射的影响。EVI常用于LAI值高,即植被茂密区。值的范围是-1~1,一般绿色植被区的范围时0.2 ~ 0.8
1.4 土壤调节植被指数(Soil Adjusted Vegetation Index,SAVI)
目的是解释背景的光学特征变化并修正NDVI对土壤背景的敏感。与NDVI相比,增加了根据实际情况确定的土壤调节系数L,取值范围0~1。 L=0 时,表示植被覆盖度为零;L=1时,表示土壤背景的影响为零,即植被覆盖度非常高,土壤背景的影响为零,这种情况只有在被树冠浓密的高大树木覆盖的地方才会出现。
1.5 差值植被指数(Difference Vegetation Index,DVI)
DVI对土壤背景的变化较 RVI 敏感,植被覆盖度高时,对植被的敏感度有所下降,适宜于冬小麦初期的植被覆盖研究。
1.6 计算公式
1.7 补充:Landsat的优点
- 免费,容易获取!!!白嫖的才是最香的!
- 数据覆盖全球,近20年的landsat影像几乎都有,有利于时间序列分析。(Landsat 30米的数据最早可以到1984年)
- 空间分辨率30m,以前用MODIS(500m)数据较多,现在Landsat用的多,未来估计用10m的哨兵Sentinel或者更高空间分辨率的数据。
- 波段较多
2. GEE code
获取多种植被主要通过USGS Landsat 8 Level 2, Collection 2, Tier 1提取,数据如下:
var table = ee.FeatureCollection("users/cduthes1991/boundry/China_province_2019").filter(ee.Filter.eq('provinces','beijing'));
var roi = table.geometry();
Map.addLayer(roi, {'color':'blue'}, 'StudyArea');
Map.centerObject(roi, 6);var year_name = 2014;
var start_date = (year_name) + '-01-01';
var end_date = (year_name + 1) + '-01-01';
var cloudCover = 20//****************************************************************************************************
//****************************************************************************************************
// indices
function DVI(img) {var red = img.select("red");var nir = img.select("nir");var dvi = img.expression("(nir - red)",{"red": red,"nir": nir});return dvi;
}function RVI(img) {var nir = img.select("nir");var red = img.select("red");var rvi = img.expression("(nir/red)",{"nir": nir,"red": red});return rvi;
}function NDVI(img) {var nir = img.select("nir");var red = img.select("red");var ndvi = img.expression("(nir - red)/(nir + red)",{"nir": nir,"red": red});return ndvi;
}function EVI(img) {var nir = img.select("nir");var red = img.select("red");var blue = img.select("blue");var evi = img.expression("2.5 * (nir - red)/(nir + 6 * red - 7.5 * blue + 1)",{"nir": nir,"red": red,"blue": blue});return evi;
}function SAVI(img) {var nir = img.select("nir");var red = img.select("red");var savi = img.expression("1.5 * (nir - red)/(nir + red + 0.5)",{"nir": nir,"red": red});return savi;
}// cloud
function bandRenameL8(image) {var blue = image.select(['SR_B2']).rename('blue');var green = image.select(['SR_B3']).rename('green');var red = image.select(['SR_B4']).rename('red');var nir = image.select(['SR_B5']).rename('nir');var swir1 = image.select(['SR_B6']).rename('swir1');var swir2 = image.select(['SR_B7']).rename('swir2');var new_image = blue.addBands([green, red, nir, swir1, swir2]);return new_image;
}function applyScaleFactorsL8(image) {var opticalBands = image.select('SR_B.').multiply(0.0000275).add(-0.2);var thermalBands = image.select('ST_B.*').multiply(0.00341802).add(149.0);return image.addBands(opticalBands, null, true).addBands(thermalBands, null, true);
}function cloudmaskL8(image) {// Bits 3 and 5 are cloud shadow and cloud, respectively.var cloudShadowBitMask = (1 << 4);var cloudsBitMask = (1 << 3);// Get the pixel QA band.var qa = image.select('QA_PIXEL');// Both flags should be set to zero, indicating clear conditions.var mask = qa.bitwiseAnd(cloudShadowBitMask).eq(0).and(qa.bitwiseAnd(cloudsBitMask).eq(0));return image.updateMask(mask);
}//****************************************************************************************************
//****************************************************************************************************
for(var i = year_name; i <= 2016; i++){
// get image collection
var l8_col = ee.ImageCollection("LANDSAT/LC08/C02/T1_L2").filterBounds(roi).filterDate(start_date, end_date).filter(ee.Filter.lt('CLOUD_COVER', cloudCover)).map(applyScaleFactorsL8).map(cloudmaskL8).map(bandRenameL8);
print('landsat8', l8_col.size())// combine, mean and calculate
var image = l8_col
print("final image count", l8_col.size(), l8_col)
var final_image = image.mean().clip(roi);
print(final_image) // 6 bands(red,blue,green,nir...)
var image_dvi= DVI(final_image)
var image_rvi = RVI(final_image)
var image_ndvi= NDVI(final_image)
var image_evi= EVI(final_image)
var image_savi= SAVI(final_image)Map.addLayer(final_image, {bands: ["red", "green", "blue"], min:0.0, max:0.25}, "image")var ndwi_palettes = ["ffffff","#f9f9f9","#d8fdf4","#7dd5e9","3d7ede","243ad4","#1c00b8", "#250081"];
var ndvi_palettes = ["#e700d5", "#e60000", "#e69f00", "#dfe200", "#7ebe00", "#00a10c", "#008110"];//Map.addLayer(image_dvi.clip(roi), {min:-1, max:1, palette:ndwi_palettes}, "dvi");
//Map.addLayer(image_rvi.clip(roi), {min:0, max:30, palette:ndwi_palettes}, "rvi");
Map.addLayer(image_ndvi.clip(roi), {min:-0.3, max:1, palette:ndvi_palettes}, "ndvi");
//Map.addLayer(image_evi.clip(roi), {min:-0.3, max:1, palette:ndwi_palettes}, "ndwi");
Map.addLayer(image_savi.clip(roi), {min:-0.3, max:1, palette:ndwi_palettes}, "savi");// export to drive
Export.image.toDrive({image: image_dvi.clip(roi),folder: "LUCC",description: "image_dvi" + i,scale: 30,region: roi,maxPixels: 1e13})
Export.image.toDrive({image: image_rvi.clip(roi),folder: "LUCC",description: "image_rvi" + i,scale: 30,region: roi,maxPixels: 1e13})
Export.image.toDrive({image: image_ndvi.clip(roi),folder: "LUCC",description: "image_ndvi" + i,scale: 30,region: roi,maxPixels: 1e13})
Export.image.toDrive({image: image_evi.clip(roi),folder: "LUCC",description: "image_evi" + i,scale: 30,region: roi,maxPixels: 1e13})
Export.image.toDrive({image: image_savi.clip(roi),folder: "LUCC",description: "image_savi" + i,scale: 30,region: roi,maxPixels: 1e13})
}
研究区:
NDVI:
SAVI
3. 参考
- 光谱植被指数与水稻叶面积指数相关性的研究
相关文章:

GEE19:基于Landsat8的常见的植被指数逐年获取
植被指数逐年获取 1. 常见的植被指数1.1 比值植被指数(Ratio vegetation index,RVI)1.2 归一化植被指数(Normalized Difference Vegetation Index,NDVI)1.3 增强植被指数(Enhanced Vegetation I…...
Python【多分支实际应用的练习】
要求:某商店T恤的价格为35元/件(2件9折,3件以上8折),裤子的价格为120 元/条(2条以上9折)小明在该店买了3件T恤和2条裤子,请计算并显示小明应该付多少钱? 代码如下: tshirt_price 35 # T恤的单价 pan…...

LeetCode 343. 整数拆分(动态规划)
LeetCode 343. 整数拆分 思路: 通过题目我们可以知道,一个正整数最少拆成2个数,最多拆成n个数,即可拆分的个数为2~n 若将拆除的第一个正整数令为k,那么剩下的数则为n-k,此时可以不拆分&#x…...

C++对象模型(12)-- 构造函数语义学:构造函数
1、默认构造函数生成规则 编译器不一定会为类生成默认构造函数,但在下列情况下,编译器会生成默认构造函数。 (1)该类没有任何构造函数,但包含一个类类型的成员变量,且成员变量所属的类有默认构造函数。 …...

[23] T^3Bench: Benchmarking Current Progress in Text-to-3D Generation
3D生成蓬勃发展,主流方法通过事例比较和用户调查来评价方法好坏,缺少客观比较指标;本文提出Bench,首次综合比较了不同生成方法;具体来说,本文设计了质量评估(Quality Assessment)和对…...
linux系统如何定时关机
立刻关机 poweroff 10分钟后自动关机 shutdown -h 10 如果希望终止上面执行的10分钟关机,则执行: shutdown -c 希望在22:00关闭计算机 shutdown -h 22:00...

构建高性能物联网数据平台:EMQX和CnosDB的完整教程
CnosDB 是一款高性能、高压缩率、高易用性的开源分布式时序数据库。主要应用场景为物联网、工业互联网、车联网和IT运维。所有代码均已在GitHub开源。本文将介绍如何使用EMQX 这一MQTT 服务器 CnosDB 构建物联网数据平台,实现物联网数据的实时流处理。 前言 在物联…...
【vim 学习系列文章 11 -- vim filetype | execute | runtimepath 详细介绍】
文章目录 filetype plugin indent on 什么功能?vim runtimepath 详细介绍vim 中 execute 命令详细介绍execute pathogen#infect() 详细介绍 filetype plugin indent on 什么功能? 在网上我们经常可以看到vimrc配置中有 filetype plugin indent on 这个配…...

[备忘]WindowsLinux上查看端口被什么进程占用|端口占用
Windows上 查看端口占用: netstat -aon|findstr <端口号> 通过进程ID查询进程信息 tasklist | findstr <上一步查出来的进程号> 图例: Linux 上 查看端口占用: netstat -tuln | grep <端口号> lsof -i:<端口号&…...
函数的扩展
文章目录 函数的扩展1.函数参数的默认值1.1 基本用法-- 参数变量是默认声明的,所以不能用 let或const 再次声明-- 使用参数默认值时,函数不能有同名参数1.2 与解构赋值默认值结合使用☆☆☆ 函数参数的默认值生效以后,参数解构赋值依然会进行…...

Cypress安装使用
node.js 安装使用Cypress总是会看见node.js,那就先看看node.js是什么。JavaScript以前运行需要在浏览器中(浏览器内置解释器),通过node.js框架内置v8引擎(也就是可以执行js脚本所需的工具),这样…...

怎么把图片改成jpg格式?
怎么把图片改成jpg格式?大家都知道,随着计算机被发明到现在已经存在了很多年,在这么多的的技术发展过程中,也形成了种类非常多的图片文件格式,例如平时我们能接触到的图片格式有jpg、png、gif、bmp、heic、tiff、jfif、…...
[一带一路金砖 2023 CTF]Crypto
题1 题目描述: from Crypto.Util.number import * from flag import flag import gmpy2 assert(len(flag)38) flag bytes_to_long(flag)p getPrime(512) q getPrime(512)e 304 enc pow(flag,e,p*q) print(p) print(q) print(enc) #9794998439882070838464987…...
FPGA【Verilog语法】
关键字: and always assign begin buf bufif0 bufif1 case casex casez cmos deassign default defparam disable edge else end endcase endfunction endprimitive endmodule endspecify endtable …...

Flume 整合 Kafka
1.背景 先说一下,为什么要使用 Flume + Kafka? 以实时流处理项目为例,由于采集的数据量可能存在峰值和峰谷,假设是一个电商项目,那么峰值通常出现在秒杀时,这时如果直接将 Flume 聚合后的数据输入到 Storm 等分布式计算框架中,可能就会超过集群的处理能力,这时采用 Kaf…...

VUE:侧边弹出栏组件,组件中有树状图,搜索框可筛选树状图节点,可收缩
作者:CSDN @ _乐多_ 本文记录了一个侧边弹出栏组件代码。代码即插即用。 弹出栏中有树状图,搜索框,可收缩。 其中,搜索框可筛选树状图节点。点击右侧小按钮可以收缩弹出框,点击X号也可以收缩弹出框。 文章目录 一、组件代码代码依赖element-plus库。且需要下载几个svg图…...

如何使用pytorch定义一个多层感知神经网络模型——拓展到所有模型知识
# 导入必要的库 import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader, random_split import torchvision.transforms as transforms import torchvision.datasets as datasets# 定义MLP模型 class MLP(nn.Module):def __…...

为什么引入SVG文件,给它定义属性不生效原理分析
背景: 我使用antd 的Icon组件引入SVG图片,但给svg图片定义styles样式时,不生效,为什么呢? 我们平时用antd组件库的 < ArrowRightOutlined style{{color: red }}>时为什么会生效呢,但我图一这样定义就…...
Integer包装类常用方法和属性
包装类 什么是包装类Integer包装类常用方法和属性 什么是包装类 Java 包装类是指为了方便处理基本数据类型而提供的对应的引用类型。Java 提供了八个基本数据类型(boolean、byte、short、int、long、float、double、char),每个基本数据类型对…...

基于Spring boot轻松实现一个多数据源框架
Spring Boot 提供了 Data JPA 的包,允许你使用类似 ORM 的接口连接到 RDMS。它很容易使用和实现,只需要在 pom.xml 中添加一个条目(如果使用的是 Maven,Gradle 则是在 build.gradle 文件中)。 <dependencies>&l…...

AI炼丹日志-23 - MCP 自动操作 自动进行联网检索 扩展MCP能力
点一下关注吧!!!非常感谢!!持续更新!!! Java篇: MyBatis 更新完毕目前开始更新 Spring,一起深入浅出! 大数据篇 300: Hadoop&…...
笔记本电脑右下角wifi不显示,连不上网怎么办?
解决思路:设备管理器--先禁用wifi6硬件-再启用wifi6硬件(20秒搞定) 笔记本电脑右下角的wifi经常莫名其妙的不显示,连不上网,感觉应该是与什么程序不兼容,导致wifi模块被办掉了,怎么这种情况出现…...
USB MSC SCCI
🔍 数据包完整内容 0000 1b 00 10 09 22 8b 8b 9b ff ff 00 00 00 00 09 00 0010 00 02 00 02 00 02 03 1f 00 00 00 55 53 42 43 10 0020 09 22 8b 00 02 00 00 80 00 0a 28 00 00 00 00 00 0030 00 00 01 00 00 00 00 00 00 00 ⚙️ 一、…...
如何迁移SOS数据库和修改sos服务的端口号
一. 迁移SOS数据库。 1. 对SOS整个库进行拷贝。压缩拷贝等都可以 2. 找到SOS安装目录下的这个目录 /SOS7/SERVERS7/LOCAL/ 在此目录下会发现,有SOS服务库的文件夹。拷贝你要迁移的SOS数据库 3. 进入该文件夹,找到:serverdb.cfg 打开后&…...

解决开发者技能差距:AI 在提升效率与技能培养中的作用
企业在开发者人才方面正面临双重挑战。一方面,IDC 预测,到2025年,全球全职开发者将短缺400万人;另一方面,一些行业巨头已暂停开发者招聘,转而倚重人工智能(AI)来满足开发需求。这不禁…...
我的3种AI写作节奏搭配模型,适合不同类型写作者
—不用内耗地高效写完一篇内容,原来可以这样搭配AI ✍️ 开场:为什么要“搭配节奏”写作? 很多人以为用AI写作,就是丢一句提示词,然后“等它写完”。 但你有没有遇到这些情况: AI写得很快,学境…...

如何将通话记录从Android传输到Android
“如何将通话记录从 Android 转移到 Android?我换了一部新的 Android 手机,想要将通话记录复制到其中。”您需要将通话记录从 Android 传输到 Android 是一种常见的情况,因为通话记录是手机上最重要的数据之一。幸运的是,如果您从…...

Unity 游戏优化(持续更新中...)
垃圾回收 是什么? 垃圾回收(Garbage Collection)GC 工作机制 1、Unity 为用户生成的代码和脚本采用了自动内存管理。 2、小块数据(如值类型的局部变量)分配在栈上。大块数据和长期存储分配在托管堆上。 3、垃圾收集…...
LlamaFactory——如何使用魔改后的模型
需求来源:有时我们可能想在llamafactory框架支持的模型上进行一些改动,例如修改forward()方法等,修改方法我们可以通过继承Transformers库中相应的class并重写相应的方法即可,那我们如何使用自己的模型呢? 首先&#…...

王树森推荐系统公开课 排序06:粗排模型
shared bottom 表示神经网络被所有特征共享。精排模型主要开销在神经网络,神经网络很大且很复杂。 每做一次推荐,用户塔只做一次推理。物品塔存放入向量数据库。 后期融合模型常用于召回,前期融合模型常用于精排。 物品塔短时间内比较稳…...