主要参考以下文献:1. https://blog.csdn.net/u010986241/article/details/112853279?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.baidujs&dist_request_id=65ded7ca-aa64-4403-9369-61bcb91e8521&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.baidujs
2. https://blog.csdn.net/tk20190411/article/details/107667464
可实现代码如下(以v10参数变量为例):
# -*- coding: utf-8 -*-
# 模块导入
import numpy as np
import netCDF4 as nc
from osgeo import gdal,osr,ogr
import os
import glob
import datetime
def NC_to_tiffs(data,Output_folder):
nc_data_obj = nc.Dataset(data)
# print(nc_data_obj,type(nc_data_obj)) # 了解NC_DS的数据类型,
# print(nc_data_obj.variables) # 了解变量的基本信息
# print(nc_data_obj)
Lon = nc_data_obj.variables['longitude'][:]
Lat = nc_data_obj.variables['latitude'][:]
u_arr = np.asarray(nc_data_obj.variables['v10']) # 这里根据需求输入想要转换的波段名称
#影像的左上角和右下角坐标
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(u_arr[:])):
#创建.tif文件
driver = gdal.GetDriverByName('GTiff')
out_tif_name = Output_folder + '/' + 'v10_' + 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()) # 给新建图层赋予投影信息
# 去除异常值
u_arr[u_arr[:, :] == -32768] = -99
#数据写出
out_tif.GetRasterBand(1).WriteArray(u_arr[i][::-1])
# 将数据写入内存,此时没有写入硬盘 此处[::-1]用于图像的垂直镜像对称,避免图像颠倒
out_tif.FlushCache() # 将数据写入硬盘
del out_tif # 注意必须关闭tif文件
def main():
Input_folder = 'H:/LAB/LABDATA/ECMWF/3/NC'
Output_folder = 'H:/LAB/LABDATA/ECMWF/3/TIF/v10'
# 读取所有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 + '-----转tif成功')
print('----转换结束----')
if __name__ == '__main__':
main()
运行成功显示如下: