✍️ 田冬冬 , 姚家园 • 📅 2024-09-09

# 写 netCDF 文件

## 文件名格式

GMT生成网格数据时默认使用 nf 格式（默认网格文件格式由GMT参数 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参数 IO_NC4_CHUNK_SIZE 可以控制分块的大小， IO_NC4_DEFLATION_LEVEL 可以控制压缩等级。