NDVI数据集提取植被覆盖度FVC

植被覆盖度FVC

植被覆盖度(Foliage Vegetation Cover,FVC)是指植被冠层覆盖地表的面积比例,通常用来描述一个区域内植被的茂密程度或生长状况。它是生态学、环境科学以及地理信息系统等领域的重要指标,对于理解地表能量平衡、水文循环、碳循环等生态过程至关重要。

植被覆盖度可以通过地面调查、遥感和地理信息系统等技术手段来测量。在遥感应用中,通常使用植被指数(如归一化植被指数NDVI)来估算植被覆盖度。这些指数反映了植被的健康状况和生物量,是监测植被变化、评估生态系统健康和进行环境变化研究的重要工具。

FVC的计算公式(参考文献Cui et al.,2023):
NDVImin为累计像元值5%的值,NDVImax为累计像元值95%的值
FVC的取值范围为[0,1]
在这里插入图片描述
表格参考自知乎用户@24K知识星球。
在这里插入图片描述

NDVI数据集

本次NDVI数据集选择的是GIMMS-3G+数据集,下载网址:GIMMS-3G+
我下载了2022年下半年的数据,数据格式是nc文件

首先用R语言将nc文件拆分成按月划分的tif文件

library(raster)
library(ncdf4)
ndvi<-brick("ndvi3g_geo_v1_2_2022_0712.nc4",varname="ndvi")
writeRaster(ndvi,filename = ndvi@data@names,bylayer=T,format="GTiff",overwrite=TRUE)

这样就获得了按月划分的tif文件。比如7月的文件为X2022.07.tif
由于比例系数是0.0001,所以每个波段的数值需要乘以0.0001
利用R语言将像元数值缩小10000倍。

library(raster)
library(sp)

# 打开.tif文件
input_file <- "X2022.07.tif"
output_file <- "X2022.07.scaled.tif"
raster_data <- raster(input_file)

# 获取波段的最小值和最大值
min_value <- minValue(raster_data)
max_value <- maxValue(raster_data)

# 设置新的最小值和最大值范围
new_min <- min_value/10000
new_max <- max_value/10000

# 调整波段范围
adjusted_raster <- ((raster_data - min_value) / (max_value - min_value)) * (new_max - new_min) + new_min

# 保存修改后的.tif文件
writeRaster(adjusted_raster, output_file, format="GTiff")

利用QGIS查看下归一化后的NDVI文件如下:
在这里插入图片描述
海洋部分的无数据nodata,冰覆盖的数值为-0.3
在这里插入图片描述
由于冰覆盖的数值较多,我不想让该数值影响到NDVImin和NDVImax值的计算,故写了一个python脚本将-0.3的值变成nodata

import rasterio

# 打开NDVI TIF文件
with rasterio.open('X2022.07.scaled.tif') as src:
    # 读取NDVI数据
    ndvi = src.read(1)

    # 判断是否有Nodata
    nodata = src.nodata
    if nodata is None:
        print('没有空数据')
    else:
        print(nodata)

    # 将NDVI值为-0.3的像素赋值为NoData
    ndvi[(ndvi == -0.3)] = nodata

    # 复制源文件的元数据
    profile = src.profile

    # 更新NoData值
    profile['nodata'] = nodata

    # 保存新的TIF文件
    with rasterio.open('X2022.07.scaled2.tif', 'w', **profile) as dst:
        dst.write_band(1, ndvi)

去除-0.3后的tif文件QGIS展示:
在这里插入图片描述
然后再利用python计算NDVImin和NDVImax

import rasterio
import numpy as np

# 打开NDVI栅格数据
with rasterio.open('X2022.07.scaled2.tif') as src:
    ndvi = src.read(1)  # 假设NDVI是在第一个波段

# 判断是否有Nodata
nodata = src.nodata
if nodata is None:
    print('没有空数据')
else:
    print(nodata)

# 排除NoData值。NoData的值需要排除,不然会影响到NDVImin和NDVImax的计算结果。
ndvi_valid = ndvi[(ndvi != nodata)]
print(ndvi_valid)

# 计算5%和95%作为最小值和最大值
ndvi_min = np.percentile(ndvi_valid, 5)
ndvi_max = np.percentile(ndvi_valid, 95)

print(f"NDVI最小值: {ndvi_min}")
print(f"NDVI最大值: {ndvi_max}")

终端显示:

-3.3999999521443642e+38
[-0.0356 -0.0511 -0.0456 ...  0.4683  0.5181  0.565 ]
NDVI最小值: 0.0869000032544136
NDVI最大值: 0.8664000034332275

利用ENVI软件的快速统计功能同样也可以获取累计百分数为5%和95%的值,结果和python运算的结果差不多。
在这里插入图片描述
接下来,就可以利用QGIS的栅格计算器功能获取FVC了。
QGIS中的栅格计算器在Raster(栅格)选项栏中。
根据FVC的计算公式输入栅格计算表达式:

 ( "X2022.07.scaled2@1"  - 0.0869000032544136 )  /  ( 0.8664000034332275 - 0.0869000032544136) 

在这里插入图片描述
这样,就获得了FVC的图如下。可以看到取值不在0-1之间,所以需要将小于0的值都赋值为0,大于1的部分赋值为1,其余部分为其本身的值。
在这里插入图片描述
再次利用栅格计算器,将FVC的值调整到0-1之间。
栅格计算表达式:

("X202207FVC@1" < 0) * 0 + ("X202207FVC@1" > 1) * 1 + ("X202207FVC@1" >= 0 AND "X202207FVC@1" <= 1) * "X202207FVC@1"

在这里插入图片描述
现在就将FVC的值调整到0-1了。我还对图层的样式做了调整,突出显示了FVC<=0.2的地区
在这里插入图片描述

本文参考文献

1、Cui, B., Gui, D., Liu, Q., Abd‐Elmabod, S. K., Liu, Y., & Lu, B. (2024). Distribution and growth drivers of oases at a global scale. Earth’s Future, 12, e2023EF004086. https://doi.org/10.1029/2023EF004086
2、Pinzon, J.E., E.W. Pak, C.J. Tucker, U.S. Bhatt, G.V. Frost, and M.J. Macander. 2023. Global Vegetation Greenness (NDVI) from AVHRR GIMMS-3G+, 1981-2022. ORNL DAAC, Oak Ridge, Tennessee, USA. https://doi.org/10.3334/ORNLDAAC/2187

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

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

相关文章

SwinTransformer的相对位置索引的原理以及源码分析

文章目录 1. 理论分析2. 完整代码 引用&#xff1a;参考博客链接 1. 理论分析 根据论文中提供的公式可知是在 Q Q Q和 K K K进行匹配并除以 d \sqrt d d ​ 后加上了相对位置偏执 B B B。 A t t e n t i o n ( Q , K , V ) S o f t m a x ( Q K T d B ) V \begin{aligned} &…

软件设计之Java入门视频(12)

软件设计之Java入门视频(12) 视频教程来自B站尚硅谷&#xff1a; 尚硅谷Java入门视频教程&#xff0c;宋红康java基础视频 相关文件资料&#xff08;百度网盘&#xff09; 提取密码&#xff1a;8op3 idea 下载可以关注 软件管家 公众号 学习内容&#xff1a; 该视频共分为1-7…

gptoolbox matlab工具箱cmake 调试笔记

一、问题描述 起因&#xff1a;在matlab中运行Offset surface of triangle mesh in matlab的时候报错&#xff1a; 不支持将脚本 signed_distance 作为函数执行: E:\MATLAB_File\gptoolbox\mex\signed_distance.m> 出错 offset_bunny (第 22 行) D signed_distance(BC,V,F…

绝区贰--及时优化降低 LLM 成本和延迟

前言 大型语言模型 (LLM) 为各行各业带来了变革性功能&#xff0c;让用户能够利用尖端的自然语言处理技术处理各种应用。然而&#xff0c;这些强大的 AI 系统的便利性是有代价的 — 确实如此。随着 LLM 变得越来越普及&#xff0c;其计算成本和延迟可能会迅速增加&#xff0c;…

Python实战训练(方程与拟合曲线)

1.方程 求e^x-派&#xff08;3.14&#xff09;的解 用二分法来求解&#xff0c;先简单算出解所在的区间&#xff0c;然后用迭代法求逼近解&#xff0c;一般不能得到精准的解&#xff0c;所以设置一个能满足自己进度的标准来判断解是否满足 这里打印出解x0是因为在递归过程中…

经典双运算放大器LM358

前言 LM358双运放有几十年的历史了吧&#xff1f;通用运放&#xff0c;很常用&#xff0c;搞电路的避免不了接触运放&#xff0c;怎么选择运放&#xff0c;是工程师关心的问题吧&#xff1f; 从本文开始&#xff0c;将陆续发一些常用的运放&#xff0c;大家选型可以参考&#…

【最新整理】全国高校本科及专科招生和毕业数据集(2008-2022年)

整理了各省高校本科、专科招生和毕业数据等21个相关指标&#xff0c;包括招生、在校、毕业人数&#xff0c;以及财政教育支出、教育经费等数据。含原始数据、线性插值、回归填补三个版本&#xff0c;希望对大家有所帮助 一、数据介绍 数据名称&#xff1a;高校本科、专科招生…

如何处理 PostgreSQL 中由于表连接顺序不当导致的性能问题?

文章目录 一、理解表连接和连接顺序二、识别由于表连接顺序不当导致的性能问题三、影响表连接顺序的因素四、解决方案手动调整连接顺序创建合适的索引分析数据分布和优化查询逻辑 五、示例分析手动调整连接顺序创建索引优化查询逻辑 六、总结 在 PostgreSQL 中&#xff0c;表连…

[FreeRTOS 内部实现] 事件组

文章目录 事件组结构体创建事件组事件组等待位事件组设置位 事件组结构体 // 路径&#xff1a;Source/event_groups.c typedef struct xEventGroupDefinition {EventBits_t uxEventBits;List_t xTasksWaitingForBits; } EventGroup_t;uxEventBits 中的每一位表示某个事件是否…

【LeetCode:3101. 交替子数组计数 + 滑动窗口 + 数学公式】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

怎样把自己电脑ip改成动态ip:步骤与解析

在今天的网络世界中&#xff0c;IP地址是计算机与互联网沟通的桥梁。而动态IP地址&#xff0c;作为其中的一种类型&#xff0c;由于其自动分配和管理的特性&#xff0c;为用户提供了更大的便利性和灵活性。那么&#xff0c;您是否想知道怎样将电脑IP改为动态呢&#xff1f;本文…

用Excel处理数据图像,出现交叉怎么办?

一、问题描述 用excel制作X-Y散点图&#xff0c;意外的出现了4个交叉点&#xff0c;而实际上的图表数据是没有交叉的。 二、模拟图表 模拟部分数据&#xff0c;并创建X-Y散点图&#xff0c;数据区域&#xff0c;X轴数据是依次增加的&#xff0c;因此散点图应该是没有交叉的。…

js好用的动态分页插件

js好用的动态分页插件是一款简单的分页样式插件&#xff0c;支持样式类型&#xff0c;当前页&#xff0c;每页显示数量&#xff0c;按钮数量&#xff0c;总条数&#xff0c;上一页文字&#xff0c;下一页文字&#xff0c;输入框跳转等功能。 js好用的动态分页插件

java基础:流程控制

一、用户交互Scanner &#xff08;一&#xff09;基础 1、概念&#xff1a;基本语法中我们并没有实现程序和人的交互&#xff0c;但是Java给我们提供了这样一个工具类&#xff0c;我们可以获取用户的输入。java.util.Scanner 是 Java5的新特征&#xff0c;我们可以通过Scanne…

Java实现登录验证 -- JWT令牌实现

目录 1.实现登录验证的引出原因 2.JWT令牌2.1 使用JWT令牌时2.2 令牌的组成 3. JWT令牌&#xff08;token&#xff09;生成和校验3.1 引入JWT令牌的依赖3.2 使用Jar包中提供的API来实现JWT令牌的生成和校验3.3 使用JWT令牌验证登录3.4 令牌的优缺点 1.实现登录验证的引出 传统…

Spring 泛型依赖注入

Spring 泛型依赖注入&#xff0c;是利用泛型的优点对代码时行精简&#xff0c;将可重复使用的代码全部放到一个类之中&#xff0c;方便以后的维护和修改&#xff0c;同时在不增加代码的情况下增加代码的复用性。 示例代码&#xff1a; 创建实体类 Product package test.spri…

在电子表格中对多列数据去重

一、数据展示 二、代码 Sub 选中区域数据去重()Dim arr()Dim c, d, id Selection.Counti 0For Each c In SelectionIf c.Value <> "" ThenReDim Preserve arr(0 To i)arr(i) c.Valuei i 1End IfNextarr 一维去重(arr)i 0For Each c In Range("O2&…

当需要对多个表进行联合更新操作时,怎样确保数据的一致性?

文章目录 一、问题分析二、解决方案三、示例代码&#xff08;以 MySQL 为例&#xff09;四、加锁机制示例五、测试和验证六、总结 在数据库管理中&#xff0c;经常会遇到需要对多个表进行联合更新的情况。这种操作带来了一定的复杂性&#xff0c;因为要确保在整个更新过程中数据…

Charles拦截发送数据包-cnblog

Charles拦截发送数据包 打开允许断点 右键要打断点的数据包&#xff0c;打断点 重新发请求进入断点模式 修改完毕后发送

集成学习(三)GBDT 梯度提升树

前面学习了&#xff1a;集成学习&#xff08;二&#xff09;Boosting-CSDN博客 梯度提升树&#xff1a;GBDT-Gradient Boosting Decision Tree 一、介绍 作为当代众多经典算法的基础&#xff0c;GBDT的求解过程可谓十分精妙&#xff0c;它不仅开创性地舍弃了使用原始标签进行…