✍️ 朱邓达 • 📅 2025-09-29

# grdinterpolate

官方文档:

  grdinterpolate

简介:

  从一个 3D 网格 (cube) 或堆叠的一系列 2D 网格 (layer) 中采样一个 3D 网格，或一系列 2D 网格，或 1D 序列。

grdinterpolate 读取一个 netCDF 格式的 3D 网格（以下称之为 cube ）或一系列 2D 网格层 （以下称每个 2D 网格层为 layer，按顺序堆叠形成第三个维度）， 沿着第三个维度（以下称之为 level ）对一个或多个 level 做插值。 要求 cube 的数据维度包含两个共有的 x 和 y 维度，第三个维度通常为距离或时间。 输出的插值结果可以保存为一个 cube 或者一系列 layer。 或者，可以在一个或多个任意点位 (x/y) 沿着 level 轴插值 (`-S`) ， 输出的表数据包含一个或多个 level 系列；也可以沿着任意垂直切片 (`-E`) 做插值， 输出为 2D 网格形式。

## 语法

gmt grdinterpolate cube | grd1 grd2 ... `-G` outfile [ `-D`[+x xname][+y yname][+z zname][+v vname][+s scale][+o offset][+n invalid][+t title][+r remark] ] [ `-E` line ] [ `-F` a|c|e|l|n|s p[+d1|2] ] [ `-R` region ] [ `-S` x/y|pointfile[+h header] ] [ `-T`[min/max/]inc[+i|n] |`-T` file|list ] [ `-V`[level] ] [ `-Z`[levels] ] [ `-bi` binary ] [ `-bo` binary ] [ `-d` nodata[+c col] ] [ `-e` regexp ] [ `-f` flags ] [ `-g` gaps ] [ `-h` headers ] [ `-i` flags ] [ `-n` flags ] [ `-o` flags ] [ `-q` flags ] [ `-s` flags ] [ `-:`[i|o] ] [ --PAR=value ]

## 输入数据

cube | grd1 grd2 ...

  指定 netCDF 格式的 3D 输入网格。或者使用 `-Z` 时，此处可指定一系列 2D 网格层 (layer)。

## 必须选项

-G

-G outfile

  输出的 cube 插值结果。如果通过 `-T` 仅指定单一 level，则退化为常规的 2D 网格。 如果 outfile 包含 C 语言浮点数格式 (e.g., layer_%6.6f.grd)， 则插值结果输出为一系列包含每个 level 的 2D 网格 (layer)。 使用 `-S` 则插值结果输出为 ASCII 格式的表数据。

## 可选选项

-D

-D[+x xname][+y yname][+z zname][+c[-|cpt]][+d dname][+s scale][+o offset][+n invalid][+t title][+r remark][+v varname]

  给定网格文件头段中的基本信息：

  - +c[-|cpt] - 设置 cpt 为该网格的默认 CPT [turbo]，或使用 - 移除已设置的默认 CPT

  - +d dname - 设置数据值名称 dname

  - +n invalid - 设置 invalid 值用于表示该节点处无有效值 [NaN]

  - +o offset - 设置读入数据后并乘以因子后要加的常数 [0]

  - +r remark - 设置网格文件的注释信息

  - +s scale - 设置读入网格数据后要乘以的因子 [1]

  - +t title - 设置网格文件的标题

  - +v varname - 指定数据集变量名称 varname

  - +x xname - 指定 X 坐标名及其单位，格式为 varname [unit]，比如 "distance [km]"

  - +y yname - 指定 Y 坐标名及其单位，格式同 xname

  - +z zname - 针对 3D 网格: 指定 Z 坐标名及其单位，格式同 xname

  其它说明：

  - 未指定的项其值保持不变

  - 可以给一个空值以重置某一项，比如使用 +t 而不指定标题则设置标题为空

  - 若字符串中包含空格则需要用引号括起来

  - 若字符串中包含加号 +，需要使用 + 对其进行转义。 或者可以使用单引号套双引号的方式，例如 '"title with + inside"'

  - 若字符串中使用了shell变量，且变量值中包含加号，则需要使用 `${variable/+/\\+}`

  - 对于地理数据（比如 -fg ）和 3D 网格，xname 和 yname 会自动设置。 通常 netCDF 数据变量名为 "z"（2D 网格）或 "cube"（3D 网格）， 可通过 +v 重命名该 netCDF 变量。

-E

-E table|origin|line[,line,...][+a az][+c][+d][+g][+i inc][+l length][+n np][+o az][+p][+r radius][+x]

  创建一条或多条测线。有以下几种方式：

  - 给定 table 文件，其中包含点位。

  - 给定起点 origin （和方位角 azimuth ，长度 length ，和下方相关选项）。

  - 给定一条或多条测线 line 。每条 line 的格式为 start/stop ， 其中 start 和 stop 格式为 lon/lat 或者两个字母指定地图上（或者使用 `-R` 指定的范围内）的位置 （例如BL,TR等，详见 锚点 ），你也可以使用 Z-,Z+ 代表网格（或多维网格的顶层，仅限 grdinterpolate ） 的全局最小值位置和最大值位置。

  支持以下选项：

  - +a - 设置测线走向 azimuth （配合 +l 指定长度），测线始于起点 origin 。

  - +c - 当多条测线首尾重合时，将其连接起来合并成一条测线。

  - +d - 输出结果增加沿测线的距离。

  - +g - 当测线起始点位于同一经度/纬度时，报告沿测线的纬度/经度变化而不是大圆弧距离。

  - +i - 指定采样间隔 inc ，若不指定则默认为网格最小间距的一半。

  - +l - 指定测线长度 length ，与 +a （或 +o ）以及 origin 一起使用。

  - +n - 指定采样点数 np （这间接确定了采样间隔）。

  - +o - 与 +a 类似，但将 origin 作为测线中点，指定测线走向 az。

  - +p - 当测线起始点位于同一纬度时，沿着纬线采样而不是大圆弧。

  - +r - 创建圆形测线，将 origin 作为圆心，指定 radius 作为半径。要求使用 +n 或 +i 。

  - +x - 地理距离的测量沿着恒向线（rhumb lines 或 loxodromes， 即沿着该方向行进时行进方向始终与经线保持相同夹角）而不是默认的大圆弧。

  注：

  - 对于设置长度的选项，仅能设置一种单位，设置不同单位的结果错误。 地理坐标下若不指定长度单位则默认为千米(k)。

  - 对于地理坐标，可使用 -j 指定距离计算方式（默认计算大圆弧路径）。

-F

-F a|c|e|l|n|s p[+d1|2]

  选择 1-D 插值方式:

  - a - Akima 样条（默认）

  - e - 阶梯曲线

  - c - 自然三次样条 (Natural cubic spline)

  - l - 线性插值

  - n - 不插值，取最近的数据点作为插值后的值

  - s - 平滑三次样条，指定拟合因子 p 以权衡样条拟合和曲率

  用户也可以更改 GMT 默认的插值方式，见 GMT_INTERPOLANT 。 可以加上 +d1 或 +d2 来计算样条的一阶导或二阶导。 注： 如果使用 e 或 n 的插值方法来计算导数，则结果恒为 0。

-R

-R xmin/xmax/ymin/ymax[+r][+u unit]

  指定数据范围。 (参数详细介绍)

-S

-S x/y|pointfile[+h header]

  在给定点位 (x/y) 或 pointfile 文件中的多个点位处沿 level 轴插值，输出空间或时间序列。 如果需要由起点和终点或类似点定义的一系列点位，可以首先使用 project 制作这样的点位文件。 默认将采样 cube 的每个 level。使用 `-T` 可自定义 level。 在输出的插值结果中，level 值将插入点位文件的第 3 列，后跟其它输入列，最后一列为每个 level 对应的采样值。 加上 +h 可在输出的每段序列段头后增加头段注释 header 。 在输出时，输入的每个点位的尾随文本将作为每个点位输出序列的段头。 默认情况下，表数据输出到标准输出。使用 `-G` 可指定输出文件名。 或者如果希望每个点位的序列输出到单独文件，可在 `-G` 指定的文件名中包含 C 语言的整数格式 (e.g., %d)， 此时将根据点数创建单独的输出文件。

-T

-T[min/max/]inc[+a][+i|n][+u] | [-T file|list]

  定义要等距采样的 level 范围（从 min 到 max ）和步长 inc （默认使用输入 cube 的每个 level ）。 具体详见 生成一维数组 。

  注：

  - 如果使用了 `-Z` ，且 `-E`，`-S` 和 `-T` 均未使用，则相当于将一系列 layer 组合成一个 cube 文件。

  - 对于 `-E` 和 `-S` ，可仅设置 `-T` min/max 来限制 level 范围，而对原有的 level 之间不做插值。

  - 如果 `-E`，`-S` 和 `-T` 均未使用，则将输入的 cube 拆分，输出为一系列的 layer， 这要求 `-G` 文件名中包含 C 语言浮点数格式，可使用 `-R` 指定范围。

-V

-V[level]

  设置 verbose 等级 [w]。 (参数详细介绍)

-Z

-Z[levels]

  读取命令行中传入的所有 2D 网格作为一个 cube 的每个 layer（默认读取一个 cube 文件）。 可指定 levels 来控制这些 2D 网格如何组合成一个 cube，即为这些 2D 网格分配其所在level。 levels 的设置方式和 `-T` 一致，若不设置则默认 level 为从 0 开始的整数。

-bi

-bi[ncols][type][w][+l|b]

  控制二进制文件的输入格式。 (参数详细介绍)

-bo

-bo[ncols][type][w][+l|b]

  控制二进制文件的输出格式。 (参数详细介绍)

-d

-d[i|o]nodata

  将某些特定值当作 NaN。 (参数详细介绍)

-e

-e[~]"pattern" | -e[~]/regexp/[i]

  筛选或剔除匹配指定模式的数据记录。 (参数详细介绍)

-f

-f[i|o]colinfo

  显式指定当前输入或输出数据中每一列的数据类型。 (参数详细介绍)

-g

-g[a]x|y|d|X|Y|D|[col]z gap[+n|p]

  确定数据或线段的间断。 (参数详细介绍)

-h

-h[i|o][n][+c][+d][+m segheader][+r remark][+t title]

  在读/写数据时跳过文件开头的若干个记录。 (参数详细介绍)

-i

-i cols[+l][+s scale][+o offset][,...][,t[word]]

  对输入的数据进行列选择以及简单的代数运算。 (参数详细介绍)

-n

-n[b|c|l|n][+a][+b BC][+c][+t threshold]

  设置网格文件的插值方式。 (参数详细介绍)

-o

-o cols[,...][,t[word]]

  对输出的数据进行列选择以及简单的代数运算。 (参数详细介绍)

-q

-q[i|o][~]rows[+c col][+a|f|s]

  对输入或输出的行进行筛选，该选项在一定程度上可以代替 gawk 的某些功能。 (参数详细介绍)

-s

-s[cols][+a|+r]

  设置 NaN 记录的处理方式。 (参数详细介绍)

-:

-:[i|o]

  交换输入或输出数据的前两列。 (参数详细介绍)

-^ 或 -

  显示简短的帮助信息，包括模块简介和基本语法信息（Windows下只能使用 -）

-+ 或 +

  显示帮助信息，包括模块简介、基本语法以及模块特有选项的说明

-? 或无参数

  显示完整的帮助信息，包括模块简介、基本语法以及所有选项的说明

--PAR=value

  临时修改GMT参数的值，可重复多次使用。参数列表见 配置参数

## 文件顺序

如果用户在命令行提供一系列的 2D 网格，并使用 `-Z` 分配各自的 level， 则用户必须确保输入的 2D 网格顺序和 `-Z` 分配的 level 顺序相匹配。 除非文件名是按照词典顺序排列，否则应谨慎使用通配符来列举所有网格 (e.g., *.nc)。

## 时间坐标

GMT 可以识别 netCDF 网格文件中的时间坐标。网格文件中变量的 unit 属性会被解析以 确定网格文件中时间坐标的起算点和单位。这些时间坐标值会被进一步根据 TIME_UNIT 和 TIME_EPOCH 转换为 GMT 内部时间值。输出时，默认以相对时间的形式输出，也可以使用 -f 选项 指定以绝对时间方式输出。

## 创建序列

`-S` 选项涉及表格的读取和输出，因此 grdinterpolate 模块也可以使用和表格输入输出相关的标准选项，例如 -b 选项 ，-i 和 -o 选项 等。 由于使用 `-S` 提供的点位坐标不要求正好位于网格节点， 本模块内部会使用 grdtrack 模块对每个layer做采样， 故 -n 选项 也可使用。

## 示例

从 cube 文件 temperature.nc 中使用三次样条插值提取一个 level=3400 的新 layer:

    gmt grdinterpolate temperature.nc -T3400 -Fc -Gtemp_3400.nc

从一系列的 2D 网格文件 layers_*.nc 中使用线性插值提取一个 level=3400 的新 layer， 其中每个网格文件对应的 level 值按照 z.txt 文件分配:

    gmt grdinterpolate layers_*.nc -Zz.txt -T3400 -Fl -Gtemp_3400.nc

从 cube 文件 temperature.nc 中使用 Akima 样条对所有 level 重新采样，输出一个新 cube ， 其中新 level 从 1500 到 2500，间隔 50:

    gmt grdinterpolate temperature.nc -T1500/2500/50 -Gtemperature_1500_2500.nc -Fa

与上面相同，但是每个 level 输出为一个单独的 2D 网格:

    gmt grdinterpolate temperature.nc -T1500/2500/50 -Gtemperature_%4.0f.nc -Fa

从一系列的 2D 网格文件 deformation_*.nc 提取出一个点位的时间序列（此处 level 为时间）， 其中每个网格文件对应的时间点按照 dates.txt 文件分配，在输出序列的段头添加 “Some like it hot”:

    gmt grdinterpolate deformation_*.nc -Zdates.txt -S115W/33N+h"Some like it hot" > record.txt

从 cube 文件 S362ANI_kmps.nc 中提取穿过夏威夷热点的垂直切片，采样 vs（各向同性剪切波速度）， 测线起始点位于同一纬度，测线距离以经度度数表示:

    gmt grdinterpolate S362ANI_kmps.nc?vs -E180/20/220/20+i1d+g+p -T25/500/25 -Gslice.nc

## 相关模块

grdedit, grdcut, project