nc数据批量转为tiff数据详细代码(Python代码)

nc数据批量转为tiff数据详细代码(Python代码)

# -*- coding: utf-8 -*-
"""
Created on Wed Dec  2 11:12:50 2020

@author: xiao_gf
"""
import os
import numpy as np
import netCDF4 as nc
from osgeo import gdal,osr


def strstr(str1, str2):  #查找某一字符是否存在于另一字符串中,str2为需要查找的字符,str1为字符串
  if int(str1.find(str2)) != -1:
    return True
  else:
    return False


def nc2array(nc_data,p):  #其中,nc_data为nc数据,p表示读取数组的名称
    data = nc.Dataset(nc_data)  #读取nc数据
    #print(data.variables['RSM'])
    lon = data.variables['LON'][:] #经度
    lat = data.variables['LAT'][:] #纬度
    var = np.array(data.variables[p][::-1])  # 本数据读取顺序需要逆转,不然输出结果会呈现镜像现象
    lonMin,latMax,lonMax,latMin = [lon.min(),lat.max(),lon.max(),lat.min()] #获取四至坐标
    #print(lonMin,latMax,lonMax,latMin)
    
    #计算分辨率
    N_lat = len(lat)  
    N_lon = len(lon)  
    lon_Res = (lonMax - lonMin) / (float(N_lon)-1)
    lat_Res = (latMax - latMin) / (float(N_lat)-1)
    return var,lonMin-(lon_Res/2),latMax+(lat_Res/2),lon_Res,lat_Res 
    # nc文件中的坐标是中心点坐标,tiff是左上角坐标(这样处理后的结果与专业软件转化结果一致)
    
def array2tiff(raster,array,originX,originY,xsize,ysize):
    cols = array.shape[1] #列数
    rows = array.shape[0] #行数
    
    driver = gdal.GetDriverByName('GTiff')
    outRaster = driver.Create(raster, cols, rows, 1, gdal.GDT_Float32)  #创建栅格
    outRaster.SetGeoTransform((originX, xsize, 0, originY, 0, -ysize))  #tiff范围
    outband = outRaster.GetRasterBand(1)
    outband.WriteArray(array)  #写入数据
    outRasterSRS = osr.SpatialReference()  #获取地理坐标系
    outRasterSRS.ImportFromEPSG(4326) # 定义输出的坐标系为"WGS 84",AUTHORITY["EPSG","4326"]
    outRaster.SetProjection(outRasterSRS.ExportToWkt())
    outband.FlushCache()
        
if __name__ =='__main__':
    
    in_folder = r"D:\data"
    out_folder = r"D:\NC2TIFF"
    # 批处理转化
    files = os.listdir(in_folder)
    for file in files:
        if file[-3:] == '.nc':
            nc_data = os.path.join(in_folder,file)
            raster = os.path.join(out_folder,file[:-3]+'.tif')
            if strstr(str(file), 'RSM'):
                p = 'RSM'
            else:
                p = 'SOILLIQ'
            array,originX,originY,xsize,ysize = nc2array(nc_data,p)
            array2tiff(raster,array,originX,originY,xsize,ysize)
            
    
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小松鼠想吃大闸蟹

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

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

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

打赏作者

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

抵扣说明:

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

余额充值