最近有同学在后台私信问我关于nc文件转tiff的问题,今天梧桐就介绍一下我对nc数据的一些认识。
在地理空间数据分析领域,NetCDF(简称 NC)格式是绕不开的重要数据格式 —— 气象、海洋、水文等领域的海量栅格数据几乎都以它为载体。但很多时候我们需要将 NC 数据转换成更通用的 TIFF 格式,才能在 ArcGIS、QGIS 等常用 GIS 软件中进一步分析。今天这篇文章,我们就从 NC 数据的基础认知入手,一步步实现 NC 数据的读取与批量转换 TIFF,零基础也能轻松上手。
文末提供本次教程中使用的中国1980-2022年1km的降水数据链接,需要的自取。
一、先搞懂:什么是 NC 数据?
NetCDF(Network Common Data Form)即网络通用数据格式,是一种面向科学数据的自描述、可移植、多维度的二进制数据格式,由美国大学大气研究协会(UCAR)开发。
核心特点
自描述性:NC 文件自带元数据(如变量名、单位、空间分辨率、时间范围、坐标系等),无需额外说明文档就能理解数据含义;
多维度存储:完美适配地理数据的 “经度、纬度、时间、高度” 等多维特征(比如一份气温数据,可同时包含经纬度网格 + 时间序列);
高效压缩:二进制存储方式比文本格式占用空间更小,读取速度更快;
跨平台兼容:Windows、Linux、MacOS 等系统均可读写,是科研领域的 “通用语言”。
常见应用场景
气象再分析数据(如 ERA5、NCEP)、卫星遥感数据(如 MODIS 的部分产品)、模式模拟数据(如 WRF 模式输出)等,几乎都是 NC 格式。
二、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。

代码如下,我选取了1980年读取:
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: 108MBDimensions: (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.67Data variables:prec (lat, lon) float32 108MB ...Attributes:Title: ChinaMet: A new multisource merged and multi-variable meteo...Data Period: 1980-2022Contact: 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.67Attrs (单位等属性): {'long_name': 'annual precipitation', 'units': 'mm/year'}进程已结束,退出代码为 0
三、批量将 NC 转换为 TIFF 格式

现在我们的需求是将nc数据转为tiff格式的数据,单文件转换易实现,批量处理才是提升效率的关键。以下代码支持读取指定文件夹下所有 NC 文件,提取目标变量并转换为 TIFF 格式,同时保留地理坐标信息。我们直接展示代码,具体细节也在代码的注释中:
import osimport xarray as xrimport numpy as npimport rasteriofrom rasterio.transform import from_originfrom 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'].valueslon = 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作为TIFoutput_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)。
结果

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


梧桐GIS助手 小程序集中了本号的几乎所有教程和分享的数据,全部免费无广告无套路获取,详细介绍可以看这篇文章““梧桐GIS助手”正式上线|这一次让我们一起出发”,希望大家多多支持,我是加拿大一枝黄花。

开始探索
公众号丨梧桐GIS
小程序丨梧桐GIS助手