代码求栅格平均值不准确(区分栅格背景值和Nodata值)

一、问题

我今天使用代码求ERA5的每年栅格平均值,但是我发现结果明显偏高,在我反复更换了GDAL等代码库时发现结果还是偏高,以下是我检验出结果偏高的原因:

1. 我算的是年anomaly结果按理说会在0值线上下波动。

2. 我习惯使用arcgis进行计算进行验证,结果显示arcgis是正确的。

二、原因

在我寻找结果的过程中我发现了一个问题,那就是栅格的nodata值(尤其是一些别人的数据产品)似乎和代码处理后我自己赋予的nodata值(实际上是背景值)不是一回事,之前我经常使用value > 0就能正确计算是因为这两个值一般情况都是小于0(例如NDVI或降水等栅格数据),但是这次情况很特殊,nodata值竟然是255,这就导致我一直无法正确计算整个栅格的平均值,有趣的是arcgis或者说arcpy调用工具是可以忽视所有nodata值的。

三、解决方案

所以大家在进行代码运算栅格平均值时,一定要检查栅格自身的nodata值,并在代码中忽略它。

图1 可以看到Nodata值为255(Arcgis pro 栅格属性)

附上一段Python代码供参考:

#中国所有区域降水异常
import os
import re
import numpy as np
import matplotlib.pyplot as plt
import rasterio

# 文件夹路径
folder_path = 'J:\\GrasslandCarbon2000-2020\\Cliamte_Analysis\\PreAno'

# 获取文件夹中的所有文件
files = os.listdir(folder_path)

# 过滤出.tif文件并按照年份排序
raster_files = sorted([f for f in files if f.endswith('.tif') and f.startswith('pre_')], key=lambda x: int(re.findall(r'\d+', x)[0]))

# 初始化列表以存储平均值
average_values = []

# 遍历每个栅格文件
for raster_file in raster_files:
    # 打印文件名
    print(raster_file)

    # 打开文件
    with rasterio.open(os.path.join(folder_path, raster_file)) as dataset:
        # 读取数据
        data = dataset.read(1)
        
        # 忽略arcgis中看到的nodata值,本例为255
        valid_data = data[data != 255]
        average_value = valid_data.mean()
        average_values.append(average_value)

# 提取年份
years = [int(re.findall(r'\d+', f)[0]) for f in raster_files]

# 绘制折线图
plt.plot(years, average_values, marker='o')
plt.xlabel('Year')
plt.ylabel('PreAno')
plt.title('Average PreAno over Years')
plt.grid(True)
plt.show()

ArcGIS填补栅格空缺可以使用栅格计算器工具。首先,导航至ArcToolbox > Spatial Analyst Tools > 地图代数,打开栅格计算器。然后,在栅格计算器输入以下语句:Con(IsNull("raster"), FocalStatistics("raster", NbrRectangle(5,5, "CELL"), "MEAN"), "raster")。这个语句的作用是将栅格数据的空缺用周围6个像元矩阵平均值进行填充。\[1\] 另外,如果你要填补LUCC2000数据的空缺,可以使用类似的方法。输入以下语句:Con(IsNull("LUCC2000.tif"), FocalStatistics("LUCC2000.tif", NbrRectangle(6,6, "cell"), "MAJORITY"), "LUCC2000.tif")。这个语句的作用是将LUCC2000数据的空缺用周围6个像元矩阵出现最多的进行填充。\[2\] 除了以上方法,还可以使用其他数据进行填充,尤其是在缺失较少的情况下。可以使用邻域的数据进行填充,或者使用Raster Calculation工具进行其他方法的填充。\[3\] #### 引用[.reference_title] - *1* [arcgis栅格缺失填补](https://blog.csdn.net/qq_39546299/article/details/120980737)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Arcgis处理栅格数据Nodata](https://blog.csdn.net/weixin_43416590/article/details/126891570)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LHQ132

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值