python xarray批量处理nc

该博客介绍了如何利用xarray库读取netCDF(NC)文件,并通过GDAL库将数据批量导出为TIFF格式。示例代码展示了如何计算年份的平均值并将其保存为单独的TIFF文件,同时提供了批量导出各个年份图像的函数。整个过程涉及到地理坐标系统的设置和数据的翻转操作。
摘要由CSDN通过智能技术生成

xarray读取nc

xarray是一类非常灵活的结构,被看作新一代nc处理库

  • 组织结构
    ✓ xarray.DataArray
  • Dims
  • Coordinates
  • Variables
    ✓ xarray.Dataset
  • Dims
  • Coordinates
  • Variables – a set of DataArray
  • 管理工具
from osgeo import gdal,osr,ogr
import os
import glob
import xarray
import matplotlib.pyplot as plt
import numpy as np
filename = "D:/Acdemic/xibei/GLDAS_1948_2018_AI_60s_60n.nc"
da = xarray.open_dataset(filename).load()

打印da,如图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BzvlpdHY-1669621988533)(C:/Users/wang/AppData/Roaming/Typora/typora-user-images/image-20221122111650651.png)]

xarray读取数据的时候,只需要open_dataset().load()即可
如图所示,xarray的数据结构很好读,用起来不能太舒服,尝试将这些年份的图像批量导出/导出为一张平均值:

还是先计算导出的关键参数:

Lon = np.array(da['lon'])
Lat = np.array(da['lat'])
data = np.array(da['ai'])
num = len(data)
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)

批量导出:

# 批量导出的情况
def xarraync_to_tiffs(data,Output_folder):
    for i in range(len(data)):#创建.tif文件
    #   tp_arr_float[i] = np.flipud(tp_arr_float[i]) 
        driver = gdal.GetDriverByName('GTiff')
        out_tif_name = Output_folder + '\\'+ 'AIdata' + '_' + str(i+1948) + '.tif'
        out_tif = driver.Create(out_tif_name, N_Lon, N_Lat, 1, gdal.GDT_Float32)
        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(np.flipud(data[i])) # 将数据写入内存,此时没有写入硬盘
        out_tif.FlushCache() # 将数据写入硬盘
        out_tif = None # 注意必须关闭tif文件

    
if __name__ == '__main__':
    Output_folder = r'D:\Acdemic\xibei\AI'
    xarraync_to_tiffs(data, Output_folder)
    print('OK')

导出一张

# 导出一张的情况(求平均值)
driver = gdal.GetDriverByName('GTiff')
out_tif_name = r'D:\Acdemic\xibei\AI\AI_mean.tif'
out_tif = driver.Create(out_tif_name, N_Lon, N_Lat, 1, gdal.GDT_Float32)
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(np.flipud(np.mean(data, 0))) # 将数据写入内存,此时没有写入硬盘
out_tif.FlushCache() # 将数据写入硬盘
out_tif = None # 注意必须关闭tif文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

地学万事屋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值