import os
from osgeo import gdal
import netCDF4 as nc
import numpy as np
from glob import glob
from osgeo import osr
# 导入所需库
# os 用于基本操作系统操作
# gdal 用于处理地理空间数据
# netCDF4 用于读取 netCDF 文件
# numpy 用于数值操作
# glob 用于文件路径匹配
# osr 用于处理空间参考信息
# 定义工作路径和输出路径
WorkPath = r'D:/2001-2002/1/'
OutPath = WorkPath
# 定义空间分辨率
SP = 0.12 # 度
# 如果输出路径不存在,则创建
if not os.path.exists(OutPath):
os.makedirs(OutPath)
# 使用 glob 查找所有 .nc 文件
path = glob(os.path.join(WorkPath, '*.nc'))
# 对每个文件进行处理
for file in path:
f = nc.Dataset(file) # 打开 netCDF 文件
#风速的输出变量有2个
U10=f['U10'][:]
V10=f['V10'][:]
rain=np.sqrt(U10*U10+V10*V10)#wrf输出的总风速'''
data = np.array(rain).astype(float) # 提降风数据数据
#data[data == 65535] = np.nan # 将值为 65535 的数据替换为 NaN
if data.ndim==2: #如果本来就是二维数组就不变
a = data[:,:]
else: #将三维数组转为二维
a = data[0,:,:]
reversed_arr = a[::-1] #这里是需要倒置一下的
lon = np.array(f['XLONG'][:])# 提取经度数据
#print(len(lon))
lat = np.array(f['XLAT'][:])
# lon = lon.ravel()
#lat = lat.ravel()
#更改异常值
data[data[:, :]> 100000] = -32767
# 提取纬度数据
LonMin, LatMax, LonMax, LatMin = lon.min(), lat.max(), lon.max(), lat.min() # 计算范围和极值
N_Lat = 96#经纬度的长度得自己定义,不然读取的形状就是1,会报错形状不统一
N_Lon = 144#
Lon_Res = SP
Lat_Res = SP
# 提取文件名并构建输出路径
fname = os.path.basename(file).split('.nc')[0]
outfile = OutPath + '/{}.tif'.format(fname)
driver = gdal.GetDriverByName('GTiff') # 获取 GeoTIFF 驱动
# 创建输出 GeoTIFF 文件
outRaster = driver.Create(outfile, N_Lon, N_Lat, 1, gdal.GDT_Float32)
# 设置地理变换参数
outRaster.SetGeoTransform([LonMin - Lon_Res / 2, Lon_Res, 0, LatMax + Lat_Res / 2, 0, -Lat_Res])
sr = osr.SpatialReference()
sr.SetWellKnownGeogCS('WGS84') # 使用 WGS84 坐标系
outRaster.SetProjection(sr.ExportToWkt()) # 设置投影信息
band=outRaster.GetRasterBand(1)
band.WriteArray(reversed_arr) # 将数据写入栅格波段
print(fname +'.tif', '处理完成')
# 释放内存
del outRaster
f.close()
批量wrfout的变量转tif(没有考虑wrf中getver函数提取特殊变量)
最新推荐文章于 2025-04-29 15:28:57 发布