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)