python批量将nc文件转为tif

目标:将nc文件批量转为tif
参考:
代码
# -*- 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()
  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值