大家好
我是瓶子~,又见面咯~
不知不觉假期余额又又又不足了,瓶子最近也面临着开学“危机”。不过这几天确实应该整理整理心情投入到新一轮的奋斗中了。
屏幕前热爱学习的你不如动动小手滑动阅读一下小火的推文,把觉得有用的文章收藏一下方便后期阅读使用哦。
好啦言归正传,瓶子最近在学习的过程中,发现了一个容易忽略的科学问题。就是当我们把一整组影像放在arcgis中的时候,可能可以发现他的最大最小值的趋势是什么,但是其实很容易忽略其平均值。在一些研究中,我们是需要看平均值的趋势的,而最大最小值的趋势并不能代表平均值趋势,所以我们就需要制图分析。
于是,一篇(shuishuide)高质量推文就呼之欲出了!只需要修改一下数据所在的路径就可以实现影像统计值的可视化了!
废话不多说了,直接呈上代码!!!
# -*- encoding:utf-8 -*-
import os
import numpy as np
import pandas as pd
from osgeo import gdal
import matplotlib.pyplot as plt
def gdal_analysis(in_path, out_csv):
# 获取.tif文件列表
tifs = [os.path.join(in_path, i) for i in os.listdir(in_path) if i.endswith(".tif")]
# 初始化用于存储统计数据的字典
stat_data = {
'fileName': [],
'count': [],
'min': [],
'max': [],
'sum': [],
'mean': [],
'median': [],
'std': []
}
# 遍历每个.tif文件,计算统计数据
for in_tif in tifs:
bname = os.path.basename(in_tif)
fname = os.path.splitext(bname)[0]
rds = gdal.Open(in_tif) # 打开文件
band = rds.GetRasterBand(1) # 获取第一个波段
ndv = band.GetNoDataValue() # 获取无数据值
values = np.array(band.ReadAsArray()).ravel() # 将波段数据读入数组
values = values[values != ndv] # 排除无数据值
# 计算统计量并添加到字典
stat_data['fileName'].append(fname)
stat_data['count'].append(len(values))
stat_data['min'].append(np.min(values))
stat_data['max'].append(np.max(values))
stat_data['sum'].append(np.sum(values))
stat_data['mean'].append(np.mean(values))
stat_data['median'].append(np.median(values))
stat_data['std'].append(np.std(values))
# 将统计数据字典转换为DataFrame
res_df = pd.DataFrame(stat_data)
# 提取文件名和平均值作为图表数据
file_names = np.array(res_df['fileName'])
mean_values = res_df['mean'].values
# 绘制折线图
plt.figure(figsize=(12, 6))
plt.plot(file_names, mean_values, label='Mean Value', marker='o', linestyle='-')
plt.plot(file_names, res_df['median'].values, label='Median Value', marker='s', linestyle='--')
plt.plot(file_names, res_df['min'].values, label='Min Value', marker='v', linestyle='-.')
plt.plot(file_names, res_df['max'].values, label='Max Value', marker='^', linestyle=':')
# 设置图例、标题、x轴和y轴标签
plt.legend()
plt.title('Raster Data Statistics Over Time')
plt.xlabel('File Name')
plt.ylabel('Statistic Value')
# 优化x轴的显示,防止文件名重叠
plt.xticks(rotation=45)
# 显示网格
plt.grid(True)
# 显示图表
plt.tight_layout() # 调整布局以适应所有标签
plt.show()
# 保存DataFrame到CSV文件
res_df.to_csv(out_csv, index=False)
# 输入输出路径
path1 = r"J:\Geographic_data\2000-2022年逐年归一化植被指数(NDVI)数据河南省(1km)"
csv1 = r"J:\Geographic_data\2000-2022年逐年归一化植被指数(NDVI)数据河南省(1km)\statistics.csv"
# 执行函数
gdal_analysis(path1, csv1)
print("done")
输出的结果是:
表格一张
文件一个
数据案例下载:
2000-2022年逐年归一化植被指数(NDVI)数据河南省(1km)
链接: https://pan.baidu.com/s/1X8ZIf2pqVAzjr-kYrlvJMQ?pwd=msr3 提取码: msr3
祝小火伴们开学开心~
宇宙级声明:以上风格仅代表本期小编