NC转TIF数据处理(python)

在进行气候分析时,很多人都会用到ERA5数据。关于ERA5数据的下载,很多人都给出了相应的下载方法,官方也有相应的处理代码,这里简单说一下怎么把NC数据转成GIS分析常用的栅格TIF数据。代码如下

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['longitude'][:]

    Lat = nc_data_obj.variables['latitude'][:]

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

    tp_arr_float = tp_arr.astype(float)*1000

    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:\\ERA5\\1981'

    Output_folder = 'F:\\tp_tif\\test'

    # 读取所有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 (data)

main()

因为这里处理的是降水数据,所以变量是tp,各位需要对进行的数据进行自定义变量。

你可能感兴趣的:(NC转TIF数据处理(python))