批量wrfout的变量转tif(没有考虑wrf中getver函数提取特殊变量)

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()

### 解决方案 当尝试将 `wrfinput` 文件中的 SST 变量替换到 `wrfout` 中并遇到错误提示“wrfout中不存在SST变量”,这通常是因为 `wrfout` 文件本身并不包含该变量。为了成功完成这一操作,可以采用以下方法: #### 方法一:创建新变量 如果目标是向现有的 NetCDF 文件 (`wrfout`) 添加新的 SST 变量,则可以通过 Python 的 netCDF4 库实现这一点。 ```python import netCDF4 as nc def add_sst_variable_to_wrfout(wrfout_path, wrfinput_path): # 打开两个文件作为只读模式 with nc.Dataset(wrfinput_path, 'r') as src_ds,\ nc.Dataset(wrfout_path, 'a') as dst_ds: # 获取源文件里的sst数据 sst_data = src_ds.variables['SST'][:] # 创建一个新的维度(如果有需要) if 'Time' not in dst_ds.dimensions.keys(): time_dim_size = None # 或者指定时间维大小 dst_ds.createDimension('Time', size=time_dim_size) # 定义属性字典用于复制元信息 var_attrs = {k: v for k, v in src_ds.variables['SST'].__dict__.items()} # 向目的文件添加sst变量 new_var = dst_ds.createVariable( 'SST', datatype=src_ds.variables['SST'].datatype, dimensions=('Time', 'south_north', 'west_east'), fill_value=getattr(src_ds.variables['SST'], '_FillValue', None)) # 设置变量属性 new_var.setncatts(var_attrs) # 将实际的数据赋给新建的变量 new_var[:] = sst_data add_sst_variable_to_wrfout('/path/to/wrfout_file.nc', '/path/to/wrfinput_d01') ``` 这段代码展示了如何打开两个不同的 WRF 输出文件,并从中提取 SST 数据再将其插入另一个文件中[^1]。 #### 方法二:利用第三方工具辅助处理 除了编程方式外,也可以考虑使用专门设计用来处理气象科学领域常见格式 (如 GRIB 和 NetCDF) 的软件包来进行这项工作,比如 NCO 工具集或者 CDO 命令行工具。这些工具提供了更简便的操作接口来管理复杂的气候/天气模拟输出文件。 对于上述提到的情况,在某些特定条件下可能还需要调整 namelist 配置文件以确保模型能够识别新增加的 SST 字段[^3]。 #### 注意事项 - 修改后的 `wrfout` 文件应当经过充分验证,确认其正确性和一致性。 - 如果计划继续运行后续的时间步长仿真,请务必保证所引入的变化不会影响整个系统的稳定性或准确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值