---
author: 田冬冬, 姚家园
date: 2024-09-09
---

# 写 netCDF 文件

## 文件名格式

GMT生成网格数据时默认使用 **nf** 格式（默认网格文件格式由GMT参数
{term}`IO_GRIDFILE_FORMAT` 控制）。
可以通过在网格文件名后加上额外的信息以指定网格文件的格式。
网格文件的文件名格式为：

> *name*\[=*ID*\]\[**+d***divisor*\][**+n***invalid*]\[**+o***offset*|**a**\]\[**+s***scale*|**a**\]\[:*driver*\[*dataType*\]\[**+c***options*\]\]

- *name* 是网格文件名
- *ID* 是写网格文件时要使用的网格文件格式
- **+d** 将网格除以一个数 *divisor* [默认为 1]
- **+n** 将网格中的 *invalid* 替换为 NaN
- **+o** 将网格中的值进行一定的偏移，即加一个数 *offset*，或使用 **a** 自动对值进行调整以保证整数网格的精度 [默认为 0]
- **+s** 将网格中的值缩放，即乘以 *scale*，或使用 **a** 自动对网格缩放以保证整数网格的精度 [默认为 1]

*scale* 和 *offset* 都可以取为 **a**，表明由程序自动决定比例因子和偏移量的值。
在写网格文件时，会先加上偏移量，再乘以比例因子。**+sa** 将会同时设置 **+oa**。
如果需使用 GDAL 指定网格格式，则 *ID* 应设置为 *gd*，并指定 :*driver* 和可选的数据类型 *dataType*，
以及 **+c**\ *options* 选项传递给 GDAL 的 **-co** 选项。

## 分块与压缩

出于性能的考虑，GMT在输出超过16384个网格单元的网格文件时，会启用分块功能。
所谓分块，即数据不是按照一行一行序列存储的，而是将整个网格分成若干个区块，
然后依次存储每个区块的数据。

在读取数据时，若只需要读取数据的一部分，netCDF只需要读取相应的区块即可，
无需读取整个数据。

由于数据的压缩和解压比磁盘IO要快，因而可以对netCDF数据进行压缩，使得磁盘占用更少，
IO负载更少。netCDF的压缩可以分为若干等级，压缩级别越高，文件越小，读写数据越快，
但压缩/解压越耗时。通常，压缩级别取1到3效果比较好。

GMT参数 {term}`IO_NC4_CHUNK_SIZE` 可以控制分块的大小，
{term}`IO_NC4_DEFLATION_LEVEL` 可以控制压缩等级。
