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…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...
