目标:将nc文件批量转为tif
参考:
(2条消息) 使用Python进行nc数据转tiff(多图层)_Evaporator Core的博客-CSDN博客,(2条消息) nc数据批量转为tiff数据详细代码(Python代码)_小松鼠想吃大闸蟹的博客-CSDN博客_nc2tiff
代码
# -*- coding: utf-8 -*-
"""
将nc文件批量转为tif文件
2022.05.13 16:11
YMJ终于试验成功
"""
# 导入库
import os
import numpy as np
import netCDF4 as nc
from osgeo import gdal
from osgeo import osr
# 定义函数
def nc_to_tif(data, output_path):
# nc.Dataset()函数,读取nc数据
nc_data = nc.Dataset(data)
# print(data)
# D:\RUANJIAN\Python\YMJdata\Practice\_nc_to_tiff\data_nc\fnl_20180505_06_00.grib2.nc
# print(nc_data)
# <class 'netCDF4._netCDF4.Dataset'>, 将nc文件的信息全都输出给nc_data
# 获取nc文件中的经度和纬度数据,nc_data.variables['变量名称'][:]
lon = nc_data.variables['lon_0'][:]
lat = nc_data.variables['lat_0'][:]
# 获取边界范围
lonMin, latMax, lonMax, latMin = [lon.min(), lat.max(), lon.max(), lat.min()]
# 将要从nc文件中提取的变量数据存储为数组形式,然后之后再以数组的形式存到tif文件中
# 变量数据就是:nc_data.variables["变量名称"]
tmp_array = np.array(nc_data.variables["TMP_P0_L103_GLL0"])
print(tmp_array)
# 异常值处理,看具体的异常值是怎么表示的,可能每种文件都不同
# tmp_array[np.where(tmp_array == 1.e+30)] = -99
# 计算分辨率
Num_lat = len(lat)
# print(Num_lat), 181
Num_lon = len(lon)
# print(Num_lon), 360
lon_Res = (lonMax - lonMin) / (float(Num_lon) - 1)
lat_Res = (latMax - latMin) / (float(Num_lat) - 1)
# 将数组再一组一组的写进tif文件中
for i in range(len(tmp_array[:])):
# 唤醒tif文件,告诉系统创建的文件格式是tiff
driver = gdal.GetDriverByName('GTiff')
# 设置输出tiff文件的名称,输出路径+特征名称+.tif
out_tif_name = output_path + "\\" + data.split("\\")[-1].split(".")[0] + ".tif"
# 创建栅格,(栅格名称,像元数量,像元数量,单波段,数据类型)
out_tif = driver.Create(out_tif_name, Num_lon, Num_lat, 1, gdal.GDT_Float32)
print(lonMin)
print(latMax)
# 地理坐标转换
# 这里的lonmin参数是可以变换的,比如geotransform = (-180, lon_Res, 0, 75, 0, -lat_Res),避免出现转出来错位的现象!!!
geotransform = (lonMin, lon_Res, 0, latMax, 0, -lat_Res)
out_tif.SetGeoTransform(geotransform) # tiff范围
# 定义坐标系,获取地理坐标系
srs = osr.SpatialReference()
# 定义输出的坐标系为"WGS 84",AUTHORITY["EPSG","4326"]
srs.ImportFromEPSG(4326)
# 投影
out_tif.SetProjection(srs.ExportToWkt())
# 获取数据集的波段,多波段可以循环获取
out_tif_band = out_tif.GetRasterBand(1) # 获取数据集的第一个波段
# 写入数据,将数据写入内存
out_tif_band.WriteArray(tmp_array[i])
# 将数据写入硬盘
out_tif.FlushCache()
# 关闭tif文件,一定要关的,结束的信号
out_tif = None
# 定义主程序
def main():
# 文件所在路径,及文件输出路径
input_path = "D:\\RUANJIAN\\Python\\YMJdata\\Practice\\_4_batch_tiff\\201807nc"
output_path = "D:\\RUANJIAN\\Python\\YMJdata\\Practice\\_4_batch_tiff\\201807nc\\tif"
# 获取文件路径下的所有文件
files = os.listdir(input_path)
for file in files:
# 进行条件判断
if file.split(".")[-1] == 'nc':
# 筛选出的具体的符合要求的文件,合并路径+文件名
data = os.path.join(input_path, file)
print(type(data))
# 调用函数
nc_to_tif(data, output_path)
# print("我真棒!") 夸夸自己的痕迹太明显了
print("finished")
# 启动程序
main()