python实现.nc转tiff

jupyter notebook 代码

之所以采用jupyter进行代码介绍,是希望能帮助大家更好理解代码
若不想阅览下方nc数据描述部分,可跳转至:查看变量信息
最后附上了完整代码。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

查看变量信息

第十八行开始逐个查看每个字段的描述,由于过多此处没有截取完全

在这里插入图片描述
在这里插入图片描述

最终确定需要字段为solar_mon

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

完整代码

该代码基于python2编写,其中gdal和osr在python3中可通过
from osgeo import gdal, osr
导入

# coding:utf-8
import netCDF4 as nc
import numpy as np
import gdal
import osr
from tqdm import tqdm
import os


def save_data(out_path, tif_data):
    # 创建tif文件
    driver = gdal.GetDriverByName('GTiff')

    # 创建框架
    out_tif = driver.Create(out_path, len_lon, len_lat, 1, gdal.GDT_Float32)
    # 设置影像显示范围
    geotransfor = (lonmin, lon_res, 0, latmax, 0, -lat_res)  # -latres < 0
    out_tif.SetGeoTransform(geotransfor)

    # 获取地理坐标系统信息
    srs = osr.SpatialReference()
    srs.ImportFromEPSG(4326)  # 定义输出的坐标系为"WGS 84",AUTHORITY["EPSG","4326"]
    out_tif.SetProjection(srs.ExportToWkt())  # 赋予投影信息

    # 数据写出
    out_tif.GetRasterBand(1).WriteArray(tif_data)
    out_tif.FlushCache()
    out_tif = None


if __name__ == '__main__':
    path = r'D:\biyelunwen\data\fushe\CERES_EBAF_Edition4.1_200003-202007.nc'

    # 读取数据
    data = nc.Dataset(path)

    # 查看变量
    variables = data.variables
    # for i in variables.keys():
    #     print('*'*10+i+'*'*10)
    #     print(variables[i])

    # 获取经纬度
    var_lon = variables['lon'][:]
    var_lat = variables['lat'][:]

    # 查看太阳辐射数据介绍
    print(variables['solar_mon'])  # 该数据以月值进行整合

    # 获得数据起始时间
    begin_time = variables['time'].units.split( )[2]
    # 获取数据起始年份和月份
    begin_year = int(begin_time.split('-')[0])
    begin_month = int(begin_time.split('-')[1])
    print(begin_year, begin_month)

    # 获取影像左下角和右下角坐标
    lonmin, latmax, lonmax, latmin = (var_lon.min(), var_lat.max(),
                                      var_lon.max(), var_lat.min())
    print(lonmin, latmax, lonmax, latmin)

    # 计算分辨率
    len_lat = len(var_lat)
    len_lon = len(var_lon)
    lon_res = (lonmax - lonmin)/(len_lon - 1.0)
    lat_res = (latmax - latmin)/(len_lat - 1.0)

    # 获取数据
    solar = variables['solar_mon']
    basepath = r'../data/radi'
    if not os.path.exists(basepath):
        os.mkdir(basepath)

    # 保存数据
    for month in tqdm(range(solar.shape[0]), ncols=80, desc=u'保存进度'):
        if begin_month > 12:
            begin_month = 1
        out_tif_path = basepath + r'/radi_{}_{}{}'.format(begin_year, begin_month, '.tif')
        data = np.asarray(solar[month])
        save_data(out_tif_path, data)
        if begin_month == 12:
            begin_year += 1
        begin_month += 1

最终文件保存结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值