欢迎光临
我们一直在努力

探索Python融合地学: NC 数据批量转换 TIFF 格式(附完整代码和样例数据)

最近有同学在后台私信问我关于nc文件转tiff的问题,今天梧桐就介绍一下我对nc数据的一些认识。

在地理空间数据分析领域,NetCDF(简称 NC)格式是绕不开的重要数据格式 —— 气象、海洋、水文等领域的海量栅格数据几乎都以它为载体。但很多时候我们需要将 NC 数据转换成更通用的 TIFF 格式,才能在 ArcGIS、QGIS 等常用 GIS 软件中进一步分析。今天这篇文章,我们就从 NC 数据的基础认知入手,一步步实现 NC 数据的读取与批量转换 TIFF,零基础也能轻松上手。

文末提供本次教程中使用的中国1980-2022年1km的降水数据链接,需要的自取。

1 先搞懂,什么是NC数据

NetCDF(Network Common Data Form)即网络通用数据格式,是一种面向科学数据的自描述、可移植、多维度的二进制数据格式,由美国大学大气研究协会(UCAR)开发。

核心特点

  • 自描述性:NC 文件自带元数据(如变量名、单位、空间分辨率、时间范围、坐标系等),无需额外说明文档就能理解数据含义;

  • 多维度存储:完美适配地理数据的 “经度、纬度、时间、高度” 等多维特征(比如一份气温数据,可同时包含经纬度网格 + 时间序列);

  • 高效压缩:二进制存储方式比文本格式占用空间更小,读取速度更快;

  • 跨平台兼容:Windows、Linux、MacOS 等系统均可读写,是科研领域的 “通用语言”。

  • 常见应用场景

    气象再分析数据(如 ERA5、NCEP)、卫星遥感数据(如 MODIS 的部分产品)、模式模拟数据(如 WRF 模式输出)等,几乎都是 NC 格式。

    2 Python处理NC数据

    处理 NC 数据的核心是解析其内部的变量和维度信息,Python 中最常用的库是xarray(简洁易用)和netCDF4(底层操作),我们以更适合新手的xarray为例。

    (1)环境准备

    首先安装所需库(建议用 conda 或 pip):

    # pip安装
    pip install xarray netCDF4 rasterio numpy
    # conda安装(推荐,避免依赖冲突)
    conda install xarray netCDF4 rasterio numpy -c conda-forge

    2. 读取 NC 数据并解析核心信息

    以下代码可快速读取 NC 文件,查看其维度、变量、元数据等关键信息,是转换前的必要准备,这里以中国降水nc数据做示例.数据来源为ChinaMet。

    以下是读取数据的代码:

    import xarray as xr

    # 1. 读取 nc 文件
    # 请替换为你的实际文件路径
    file_path = 'G:\\……\\ch_prec\\ChinaMet_001deg_prec\\ChinaMet_001deg_prec_1980.nc'
    ds = xr.open_dataset(file_path)

    # 2. 查看整体结构信息
    print("=== 数据集概览 (Dataset Overview) ===")
    print(ds)

    # 3. 查看具体的变量名 (Data Variables)
    print("\\n=== 包含的变量 (Variables) ===")
    print(ds.data_vars.keys())

    # 4. 查看维度信息 (Dimensions) – 比如时间、经度、纬度的大小
    print("\\n=== 维度信息 (Dimensions) ===")
    print(ds.dims)

    # 5. 查看特定变量的详细信息
    # 这里演示如何获取第一个变量的信息
    var_name = list(ds.data_vars)[0]
    variable = ds[var_name]

    print(f"\\n=== 变量 '{var_name}' 的详细属性 ===")
    print(f"Shape (形状): {variable.shape}")
    print(f"Coords (坐标): {variable.coords}")
    print(f"Attrs (单位等属性): {variable.attrs}")

    下面就是文件读取出来的结果,我们可以看到这个文件包含的变量和纬度,以及单位等各种信息。这一步是非常关键的,只有知道了文件的信息,才能正确转换文件类型。

    === 数据集概览 (Dataset Overview) ===
    <xarray.Dataset> Size: 108MB
    Dimensions: (lon: 6869, lat: 3938)
    Coordinates:
    * lon (lon) float64 55kB 67.8467.8567.8667.87 … 136.5136.5136.5
    * lat (lat) float64 32kB 15.315.3115.3215.33 … 54.6554.6654.67
    Data variables:
    prec (lat, lon) float32 108MB …
    Attributes:
    Title: ChinaMet: A new multisource merged and multi-variable meteo…
    Data Period: 1980-2022
    Contact: Dr. Ling Zhang, Email: zhanglingky@lzb.ac.cn, Northwest Ins…

    === 包含的变量 (Variables) ===
    KeysView(Data variables:
    prec (lat, lon) float32 108MB …)

    === 维度信息 (Dimensions) ===
    FrozenMappingWarningOnValuesAccess({'lon': 6869, 'lat': 3938})

    === 变量 'prec' 的详细属性 ===
    Shape (形状): (3938, 6869)
    Coords (坐标): Coordinates:
    * lon (lon) float64 55kB 67.8467.8567.8667.87 … 136.5136.5136.5
    * lat (lat) float64 32kB 15.315.3115.3215.33 … 54.6554.6654.67
    Attrs (单位等属性): {'long_name': 'annual precipitation', 'units': 'mm/year'}

    进程已结束,退出代码为 0

    (3)批量将NC数据转为TIFF数据

    以下是基本的代码:

    import os
    import xarray as xr
    import numpy as np
    import rasterio
    from rasterio.transform import from_origin
    from tqdm import tqdm

    # 设置文件夹路径
    input_folder = 'G:/……/ch_prec/ChinaMet_001deg_prec/' # `.nc` 文件所在文件夹
    output_folder = 'G:/……/cn_prec_nctotif/' # 输出文件夹路径,确保该文件夹存在
    # 获取所有.nc文件
    nc_files = [f for f in os.listdir(input_folder) if f.endswith('.nc')]
    # 确保输出文件夹存在
    os.makedirs(output_folder, exist_ok=True)

    # 处理每个文件
    for nc_file in tqdm(nc_files, desc="Processing .nc files", ncols=100):
    # 构建文件路径
    file_path = os.path.join(input_folder, nc_file)
    # 读取.nc文件
    ds = xr.open_dataset(file_path)
    # 获取降水数据
    rhu = ds['prec']
    # 获取经纬度信息
    lat = ds['lat'].values
    lon = ds['lon'].values
    # 检查纬度顺序,如果是从南到北(递增),则反转纬度顺序
    if lat[0] < lat[-1]:
    lat = lat[::-1] # 反转纬度顺序

    # 设置栅格的空间分辨率和起始位置
    transform = from_origin(lon.min(), lat.max(), (lon[1] – lon[0]), (lat[0] – lat[1]))
    # 检查rhu的维度
    print(f"rhu维度:{rhu.shape}")

    # 如果没有时间维度,直接保存prec作为TIF
    output_tif = f"{output_folder}{nc_file}_rhu.tif"
    with rasterio.open(output_tif, 'w', driver='GTiff', count=1, dtype='float32',
    height=rhu.shape[0], width=rhu.shape[1], crs='EPSG:4326', transform=transform) as dst:
    dst.write(rhu.values[::-1, :], 1) # 反转纬度顺序写入

    print("所有文件处理完成!")

    常见问题解决

    • “未找到变量”:核对TARGET_VAR是否与 NC 文件中的变量名一致(可通过第二部分的读取代码查看所有变量);

    • “维度不匹配”:检查数据维度顺序(如是否是 “纬度、经度” 而非 “经度、纬度”,需调整data_array的维度顺序);

    • “坐标系错误”:确认数据的实际坐标系,若不是 WGS84,需修改crs参数(如 UTMzone50N 对应EPSG:32650)。

    3 结果

    成功转化,nice!有的nc数据有时间维度,对这种数据我们需要进行针对处理,总之在处理nc数据时,要明确nc数据的信息(变量,维度,单位等……)再做具体操作。这就是今天的所有内容,教程中使用的中国降水数据我放在“梧桐GIS助手”小程序里,大家可以直接获取。

    赞(0)
    未经允许不得转载:171主机测评 » 探索Python融合地学: NC 数据批量转换 TIFF 格式(附完整代码和样例数据)
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址