1 简介
乔博士最近在做一个研究,涉及到过去十几年某些地区某些指标逐日的提取。一共五个地区,各地区下五个指标,各指标5000+副影像需要获取均值。。。。。所以一共大概好几万副影像需要统计。。。然而在ArcGIS上手动做还是通过ArcPy做都不太现实,所以就问问我有没有相关的代码程序:
我是有的,然而因为我之前涉及的没有那么多影像,最多也就几十景求均值,所以现成的代码是输入在终端里的。所以乔博士又提出了这么个要求:
所以,这次的代码目标是提取某个文件夹里所有影像的均值,并且输出成excel可以读的表,方便后续的研究。
2 效果展示
首先,得把tif扔进一个文件夹里:
然后使用后面要贴出来的代码,就可以得到一个csv文件,csv文件里是这样的:
同时终端里是这样的:
可以说是一模一样!
我们就可以通过这个csv进一步方便的进行排序、制图什么的了。
3 代码
from osgeo import gdal
import glob
import numpy as np
import csv
# 计算栅格图像均值
def calc_grid_mean(tiffile, csvpath):
open_tif = gdal.Open(tiffile) # 打开tif文件
# 打开栅格图像的波段
band = open_tif.GetRasterBand(1).ReadAsArray()
count_value = [] # 存放像元值的数组
# 遍历图像矩阵,剔除异常值,读取有效值
for i in range(len(band)):
for j in range(len(band[i])):
if band[i][j] >= -1000:
count_value.append(band[i][j]) # 将有效值放入新数组
# 把文件名和参数写入csv
mycsv = open(str(csvpath), 'a', newline='') # 新建并打开csv
csv_write = csv.writer(mycsv, dialect='excel')
tif_info = (str(tif[-18:]), float(np.mean(count_value))) # 把文件名称+均值整合为一行
csv_write.writerow(tif_info) # 把文件名称+均值写入csv
print(f'{str(tif[-18:])}, {np.mean(count_value)}') # 在终端中打印出文件名称+均值
csv_path = r'csv.csv' # csv输出路径
tif_dir = glob.glob(r'文件夹\*.tif') # tif目录
for tif in tif_dir: # 遍历文件夹
calc_grid_mean(tif, csv_path) # 计算均值
这个代码涉及到一个函数+一个遍历。
函数是读取一张tif并且计算均值,因为有些在ArcGIS裁剪后的图像空值其实是负好几,所以我设置了一个条件,选取大于-1000的。
遍历就是遍历选取的文件夹里的所有tif,通过上面的函数计算均值写入同一个csv里。
-----------------------分割线(以下是乞讨内容)-----------------------