python批量读取nc气象数据并转为tif
创始人
2024-01-31 07:35:28
0

python批量nc数据转tif

各类地理数据中,NC格式是很常见的,然而这种格式ArcGIS是无法打开的。一旦下载的话nc也是多时序的(多年、多月等等),让我们看看如何批量操作吧。

直接上代码:

import numpy as np
import netCDF4 as nc
from osgeo import gdal,osr,ogr
import os
import glob
def NC_to_tiffs(data,Output_folder):nc_data_obj = nc.Dataset(data)Lon = nc_data_obj.variables['lon'][:]Lat = nc_data_obj.variables['lat'][:]PM = nc_data_obj.variables['di_01']tp_arr = np.asarray(nc_data_obj.variables['di_01'])#将tp数据读取为数组tp_arr_float = tp_arr.astype(float)LonMin,LatMax,LonMax,LatMin = [Lon.min(),Lat.max(),Lon.max(),Lat.min()]N_Lat = len(Lat)N_Lon = len(Lon)Lon_Res = (LonMax - LonMin) /(float(N_Lon)-1)Lat_Res = (LatMax - LatMin) / (float(N_Lat)-1)for i in range(len(tp_arr[:])):#创建.tif文件driver = gdal.GetDriverByName('GTiff')out_tif_name = Output_folder + '\\'+ data.split('\\')[-1].split('.')[0] + '_' + str(i+1) + '.tif'out_tif = driver.Create(out_tif_name,N_Lon,N_Lat,1,gdal.GDT_Float32)# 设置影像的显示范围#-Lat_Res一定要是-的geotransform = (LonMin,Lon_Res, 0, LatMax, 0, -Lat_Res)out_tif.SetGeoTransform(geotransform)#获取地理坐标系统信息,用于选取需要的地理坐标系统srs = osr.SpatialReference()srs.ImportFromEPSG(4326)# 定义输出的坐标系为"WGS 84",AUTHORITY["EPSG","4326"]out_tif.SetProjection(srs.ExportToWkt()) # 给新建图层赋予投影信息#数据写出out_tif.GetRasterBand(1).WriteArray(tp_arr_float[i]) # 将数据写入内存,此时没有写入硬盘out_tif.FlushCache() # 将数据写入硬盘out_tif = None # 注意必须关闭tif文件def main():Input_folder = 'D:/OneDrive/data/GPCC_AI/inputNC'Output_folder = 'D:/OneDrive/data/GPCC_AI/output'# 读取所有nc数据data_list = glob.glob(Input_folder + '\\*.nc')for i in range(len(data_list)):data = data_list[i]NC_to_tiffs(data,Output_folder)print(str(i) + ': ' + data)
main()

运行之后会打印转换成功的数据和序号:

0: D:/OneDrive/data/GPCC_AI/inputNC\GPCC_DI_201301.nc
1: D:/OneDrive/data/GPCC_AI/inputNC\GPCC_DI_201302.nc
2: D:/OneDrive/data/GPCC_AI/inputNC\GPCC_DI_201303.nc
3: D:/OneDrive/data/GPCC_AI/inputNC\GPCC_DI_201304.nc
4: D:/OneDrive/data/GPCC_AI/inputNC\GPCC_DI_201305.nc
5: D:/OneDrive/data/GPCC_AI/inputNC\GPCC_DI_201306.nc
6: D:/OneDrive/data/GPCC_AI/inputNC\GPCC_DI_201307.nc
7: D:/OneDrive/data/GPCC_AI/inputNC\GPCC_DI_201308.nc
8: D:/OneDrive/data/GPCC_AI/inputNC\GPCC_DI_201309.nc
9: D:/OneDrive/data/GPCC_AI/inputNC\GPCC_DI_201310.nc
10: D:/OneDrive/data/GPCC_AI/inputNC\GPCC_DI_201311.nc
11: D:/OneDrive/data/GPCC_AI/inputNC\GPCC_DI_201312.nc
12: D:/OneDrive/data/GPCC_AI/inputNC\GPCC_DI_201401.nc
13: D:/OneDrive/data/GPCC_AI/inputNC\GPCC_DI_201402.nc
14: D:/OneDrive/data/GPCC_AI/inputNC\GPCC_DI_201403.nc
15: D:/OneDrive/data/GPCC_AI/inputNC\GPCC_DI_201404.nc
16: D:/OneDrive/data/GPCC_AI/inputNC\GPCC_DI_201405.nc
17: D:/OneDrive/data/GPCC_AI/inputNC\GPCC_DI_201406.nc
18: D:/OneDrive/data/GPCC_AI/inputNC\GPCC_DI_201407.nc
...

打开文件夹,TIF也转换好了,此时发现我们的图像是上下左右颠倒的?

image-20221109235922077

由于不同NC维度不同,数据格式、类型、存储方式都可能不同,因此一定要真正理解代码,才能对其进行修改,使之适合自己的数据。

在本例中,数据上下左右发生了颠倒,我们只需要用数组反转函数即可:

numpy.flipud() # 上下翻转
numpy.flip() # 左右翻转

那么把代码加到哪里呢?让我们来看看函数是如何工作的:

主函数的前几行是比较关键的,中括号的内部是变量名:

Lon = nc_data_obj.variables['lon'][:]
Lat = nc_data_obj.variables['lat'][:]
PM = nc_data_obj.variables['di_01']

那么如何查看变量名呢?这就需要数据预读取,代码如下:

data = 'D:/OneDrive/data/GPCC_AI/GPCC_DI_201301.nc'
nc_data_obj = nc.Dataset(data)
nc_data_obj.variables

下图中是结果,红框是变量名,蓝框是数据类型,绿框是数据大小

image-20221110000631817

一般nc数据中lon和lat是必有的,只不过名字也许不同,可能有的是“longtitude”和“latitude”,我们要的数据是“di_01”。

PM = nc_data_obj.variables['di_01']
tp_arr = np.asarray(nc_data_obj.variables['di_01'])#将tp数据读取为数组

所以修改了上述两行

该函数主要是将nc读成多维数组,再循环写成tif,因此我们在数组这一步进行翻转:

for i in range(len(tp_arr[:])):#创建.tif文件tp_arr_float[i] = np.flipud(tp_arr_float[i])  driver = gdal.GetDriverByName('GTiff')

从预览图来看,结果正确!

image-20221110001325751

接下来是比较重要的投影信息:

EPSG:4326是WGS84的地理坐标

srs.ImportFromEPSG(4326)

最后是输入路径和输出路径,输出路径是一空文件夹,输入路径记录了全部的nc文件

Input_folder = 'D:/OneDrive/data/GPCC_AI/inputNC'
Output_folder = 'D:/OneDrive/data/GPCC_AI/output'# 读取所有nc数据

径记录了全部的nc文件

Input_folder = 'D:/OneDrive/data/GPCC_AI/inputNC'
Output_folder = 'D:/OneDrive/data/GPCC_AI/output'# 读取所有nc数据

这样就能实现批量操作了,读成数组之后,可以进行你要做的任何操作!

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...