✍️ Caesar（自然资源部第一海洋研究所） , 周茂 • 📅 2026-01-05

# grdmath

官方文档:

  grdmath

简介:

  网格数据的逆波兰表示法（RPN）计算

grdmath 使用逆波兰表示法对网格文件或常量进行逐元素运算，最终结果写入到新的网格文件。 若不给定网格文件，则必须使用 `-R` 与 `-I` 选项生成网格文件。 = outgrid 可在计算 中多次使用以保存中间结果。复杂的或频繁使用的运算可赋值给变量或使用宏。

## 语法

gmt grdmath [ `-A` min_area[/min_level/max_level][+a[g|i][s|S]][+l|r][+p percent] ] [ `-D` resolution[+f] ] [ `-I` increment ] [ `-M` ] [ `-N` ] [ `-R` region ] [ `-S` ] [ `-V`[level] ] [ `-a` flags ] [ `-bi` binary ] [ `-di` nodata[+c col] ] [ `-e` regexp ] [ `-f` flags ] [ `-g` gaps ] [ `-h` headers ] [ `-i` flags ] [ `-n` flags ] [ `-r` reg ] [ `-x`[[-]n] ] [ --PAR=value ] operand [ operand ] OPERATOR [ operand ] OPERATOR ... = outgrid

## 输入输出数据

operand

  如果 operand 是一个文件，GMT 将试着以网格文件的形式读取该文件。如果非文件， 将被解析为 其他符号 或数字常量。

= outgrid

  输出网格文件名

## 可选选项

-A

-A min_area[/min_level/max_level][+a[g|i][s|S]][+l|r][+p percent]

  不绘制面积过小的区域（湖泊或岛屿），或不绘制某个级别的湖泊边界。

  在绘制湖泊时，若不管湖泊的面积大小而把所有湖泊的边界都画上去，可能导致图 看上去比较乱，该选项用于对湖泊进行筛选。面积小于 min_area 平方千米 或者湖泊级别不在 [min_level,max_level] 范围的边界都不会被绘制。 默认值为 0/0/4，即绘制所有湖泊边界，即绘制0到4级所有级别的面积大于0的 湖泊。

  对于level=2，即湖岸线，包括常规的湖以及很宽的河流。加上 +r 则只绘制河流， 加上 +l 则只绘制常规湖。

  对于南极洲而言，因为有冰层的存在，所以海岸线有多种处理方式：

  - +ai 用ice shell boundary作为南极洲的海岸线，默认值

  - +ag 以ice grounding line作为海岸线

  - +as 忽略南纬60度以南的海岸线，用户可以使用 plot 绘制自己的南极洲海岸线

  - +aS 忽略南纬60度以北的海岸线

  +p precent：一个多边形，降低精度后，边数减少，面积变化，当面积变化 过大时再绘制这个多边形就不合适了，该子选项用于去除那些面积与最高精度面积 之比小于 percent 的多边形。

备注

该选项仅适用于 LDISTG 运算符

-D

-D resolution[+f]

  设置 LDISTG 运算符使用的数据集的分辨率: (f)ull，(h)igh，(i)ntermediate，(l)ow 和 (c)rude。 默认的 l 选项将数据集缩减为原本的 20%。如果请求的分辨率不存在，使用 +f 选项 会自动选择一个较低的分辨率。

备注

该选项仅适用于 LDISTG 运算符。

-I

-I xinc[+e|n][/yinc[+e|n]]

  指定X和Y方向的网格间隔

  - xinc 和 yinc 为 X 和 Y 方向的网格间隔。对于地理坐标，可以指定网格间隔单位 [默认单位为度]

  - +e 微调X和Y方向范围的最大值，使得其是网格间隔的整数倍（默认会微调 网格间隔以适应给定的数据范围）

  - +n 表明 xinc 和 yinc 不是网格间隔，而是X和Y方向的节点数。 此时会根据节点数、网格区域范围以及网格配准方式重新计算网格间隔。

  注意：

  - 若 yinc 设置为0，则表示其与 xinc 相同

  - 若使用 -R grdfile 选项，则网格间隔和配准方式已经根据网格文件自动初始化， 此时依然可以使用 -I 和 -r 覆盖相应的值

-M

-M

  默认的导数计算单位为 z_units/x(或 y )_units。使用该选项，可以将 dx 和 dy 的单位从度变为 平地球近似下的米，因此最终单位变为 z_units/meter

-N

-N

  操作多个网格时，关闭严格的范围匹配检查 [默认情况下，要求每个网格的范围和第一个网格的范围 不能超过阈值，该阈值为第一个网格间隔的 10^-4]

-R

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

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

-S

-S

  将下一个运算应用到所有的网格中，使最终结果为一个网格。必须在列出所有网格后才能使用该选项。 注 ：仅能在改选项后使用 reduce 运算符，包括 ADD，AND，MAD，LMSSCL，MAX，MEAN，MEDIAN，MIN，MODE，MUL，RMS，STD，SUB，VAR 或 XOR

-V

-V[level]

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

-a

-a[[col=]name][,...]

  控制输入或输出为 OGR/GMT 格式时对非空间元数据的处理方式。 (参数详细介绍)

-bi

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

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

-di

-di 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]

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

-r

-r[g|p]

  设置网格配置方式 [默认为网格线配准]。 (参数详细介绍)

-x

-x[[-]n]

  限制多核算法中能使用的核数（需要GMT开启OpenMP支持）。 (参数详细介绍)

-^ 或 -

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

-+ 或 +

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

-? 或无参数

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

--PAR=value

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

## 运算符

Operator 为运算符名称； args 分别表示输入参数和输出参数个数； Returns 中的 A B C ... 等字符表示输入参数。

运算符列表
操作符 (Operator) | 参数 (Args) | 返回值 (Returns) | 函数类型 (Type)
--- | --- | --- | ---
`ABS` | 1 1 | A 的绝对值 | 算术运算
`ACOS` | 1 1 | 反余弦（结果为弧度） | 微积分
`ACOSD` | 1 1 | 反余弦（结果为度） | 微积分
`ACOSH` | 1 1 | 反双曲余弦 | 微积分
`ACOT` | 1 1 | 反余切（结果为弧度） | 微积分
`ACOTD` | 1 1 | 反余切（结果为度） | 微积分
`ACSC` | 1 1 | 反余割（结果为弧度） | 微积分
`ACSCD` | 1 1 | 反余割（结果为度） | 微积分
`ADD` | 2 1 | A + B（加法） | 算术运算
`AND` | 2 1 | 如果 A 等于 NaN 则返回 B，否则返回 A | 逻辑运算
`ARC` | 2 1 | 返回 [0, pi] 上的圆弧 (A,B) | 算术运算
`AREA` | 0 1 | 每个网格单元的面积（如果是地理坐标，单位为 km2） | 特殊操作符
`ASEC` | 1 1 | 反正割（结果为弧度） | 微积分
`ASECD` | 1 1 | 反正割（结果为度） | 微积分
`ASIN` | 1 1 | 反正弦（结果为弧度） | 微积分
`ASIND` | 1 1 | 反正弦（结果为度） | 微积分
`ASINH` | 1 1 | 反双曲正弦 | 微积分
`ATAN` | 1 1 | 反正切（结果为弧度） | 微积分
`ATAND` | 1 1 | 反正切（结果为度） | 微积分
`ATAN2` | 2 1 | A/B 的反正切（结果为弧度） | 微积分
`ATAN2D` | 2 1 | A/B 的反正切（结果为度） | 微积分
`ATANH` | 1 1 | 反双曲正切 | 微积分
`BCDF` | 3 1 | 二项分布累积分布函数 (p = A, n = B, x = C) | 概率统计
`BPDF` | 3 1 | 二项分布概率密度函数 (p = A, n = B, x = C) | 概率统计
`BEI` | 1 1 | 开尔文函数 bei (A) | 特殊函数
`BER` | 1 1 | 开尔文函数 ber (A) | 特殊函数
`BITAND` | 2 1 | A & B (按位与运算) | 逻辑运算
`BITLEFT` | 2 1 | A << B (按位左移) | 算术运算
`BITNOT` | 1 1 | ~A (按位非运算，即返回补码) | 逻辑运算
`BITOR` | 2 1 | A | B (按位或运算) | 逻辑运算
`BITRIGHT` | 2 1 | A >> B (按位右移) | 算术运算
`BITTEST` | 2 1 | 如果 A 的第 B 位被设置则返回 1，否则为 0 (按位测试) | 逻辑运算
`BITXOR` | 2 1 | A ^ B (按位异或运算) | 逻辑运算
`BLEND` | 3 1 | 使用权重 C (0-1 范围) 混合 A 和 B，计算方式为 A*C + B*(1-C) | 特殊操作符
`CAZ` | 2 1 | 从网格节点到栈中 (x, y)（即 A, B）的笛卡尔方位角 | 特殊操作符
`CBAZ` | 2 1 | 从网格节点到栈中 (x, y)（即 A, B）的笛卡尔反方位角 | 特殊操作符
`CDIST` | 2 1 | 网格节点与栈中 (x, y)（即 A, B）之间的笛卡尔距离 | 特殊操作符
`CDIST2` | 2 1 | 同 CDIST，但仅计算到非零节点的距离 | 特殊操作符
`CEIL` | 1 1 | ceil (A) (大于或等于 A 的最小整数) | 逻辑运算
`CHICRIT` | 2 1 | 卡方分布临界值 (alpha = A, nu = B) | 概率统计
`CHICDF` | 2 1 | 卡方累积分布函数 (chi2 = A, nu = B) | 概率统计
`CHIPDF` | 2 1 | 卡方概率密度函数 (chi2 = A, nu = B) | 概率统计
`COMB` | 2 1 | 组合数 nCr (n = A, r = B) | 概率统计
`CORRCOEFF` | 2 1 | 相关系数 r(A, B) | 概率统计
`COS` | 1 1 | A 的余弦（A 为弧度） | 微积分
`COSD` | 1 1 | A 的余弦（A 为度） | 微积分
`COSH` | 1 1 | A 的双曲余弦 | 微积分
`COT` | 1 1 | A 的余切（A 为弧度） | 微积分
`COTD` | 1 1 | A 的余切（A 为度） | 微积分
`CSC` | 1 1 | A 的余割（A 为弧度） | 微积分
`CSCD` | 1 1 | A 的余割（A 为度） | 微积分
`CUMSUM` | 2 1 | 每一行 (B=±1|3) 或每一列 (B=±2|4) 的累加和。B 的符号决定求和方向 | 算术运算
`CURV` | 1 1 | A 的曲率（拉普拉斯算子 \(\nabla^2\)） | 微积分
`D2DX2` | 1 1 | d2(A)/dx2 二阶导数 | 微积分
`D2DY2` | 1 1 | d2(A)/dy2 二阶导数 | 微积分
`D2DXY` | 1 1 | d2(A)/dxdy 二阶偏导数 | 微积分
`D2R` | 1 1 | 度转换为弧度 | 特殊操作符
`DDX` | 1 1 | d(A)/dx 中央一阶导数 | 微积分
`DAYNIGHT` | 3 1 | 太阳在 (A, B) 照射处为 1，其余为 0，C 为过渡宽度 | 特殊操作符
`DDY` | 1 1 | d(A)/dy 中央一阶导数 | 微积分
`DEG2KM` | 1 1 | 球面度转换为公里 | 特殊操作符
`DENAN` | 2 1 | 用 B 中的值替换 A 中的 NaN | 逻辑运算
`DILOG` | 1 1 | 双对数 (Spence's) 函数 | 特殊函数
`DIV` | 2 1 | A / B (除法) | 算术运算
`DOT` | 2 1 | 节点与栈中单位向量 (A, B) 之间的二维(笛卡尔)或三维(地理)点积 | 特殊操作符
`DUP` | 1 2 | 在栈中复制一份 A | 特殊操作符
`ECDF` | 2 1 | 指数累积分布函数 (x = A, lambda = B) | 概率统计
`ECRIT` | 2 1 | 指数分布临界值 (alpha = A, lambda = B) | 概率统计
`EPDF` | 2 1 | 指数概率密度函数 (x = A, lambda = B) | 概率统计
`ERF` | 1 1 | 误差函数 erf (A) | 概率统计
`ERFC` | 1 1 | 互补误差函数 erfc (A) | 概率统计
`EQ` | 2 1 | 如果 A 等于 B 则返回 1，否则为 0 | 逻辑运算
`ERFINV` | 1 1 | A 的反误差函数 | 概率统计
`EXCH` | 2 2 | 交换栈中的 A 和 B | 特殊操作符
`EXP` | 1 1 | e 的次幂 | 算术运算
`FACT` | 1 1 | A! (A 的阶乘) | 算术运算
`EXTREMA` | 1 1 | 局部极值：-1 为极小值，+1 为极大值，其余为 0 | 微积分
`FCDF` | 3 1 | F 累积分布函数 (F = A, nu1 = B, nu2 = C) | 概率统计
`FCRIT` | 3 1 | F 分布临界值 (alpha = A, nu1 = B, nu2 = C) | 概率统计
`FISHER` | 3 1 | 位于中心经度 A、纬度 B，且浓度参数为 C 的 Fisher 概率密度函数 | 概率统计
`FLIPLR` | 1 1 | 反转每一行中的值顺序 | 特殊操作符
`FLIPUD` | 1 1 | 反转每一列的顺序 | 特殊操作符
`FLOOR` | 1 1 | 小于或等于 A 的最大整数 | 逻辑运算
`FMOD` | 2 1 | A % B (截断除法的余数) | 算术运算
`FPDF` | 3 1 | F 概率密度函数 (F = A, nu1 = B, nu2 = C) | 概率统计
`GE` | 2 1 | 如果 A >= B 则返回 1，否则为 0 | 逻辑运算
`GT` | 2 1 | 如果 A > B 则返回 1，否则为 0 | 逻辑运算
`HSV2LAB` | 3 3 | 将 h,s,v 转换为 l,a,b (h=A[0-360], s=B, v=C[0-1]) | 特殊操作符
`HSV2RGB` | 3 3 | 将 h,s,v 转换为 r,g,b (h=A[0-360], s=B, v=C[0-1]) | 特殊操作符
`HSV2XYZ` | 3 3 | 将 h,s,v 转换为 x,t,z (h=A[0-360], s=B, v=C[0-1]) | 特殊操作符
`HYPOT` | 2 1 | 直角三角形的斜边长度 (= sqrt (A2+ B2)) | 微积分
`I0` | 1 1 | A 的修正贝塞尔函数 (第一类, 0阶) | 特殊函数
`I1` | 1 1 | A 的修正贝塞尔函数 (第一类, 1阶) | 特殊函数
`IFELSE` | 3 1 | 如果 A 不等于 0 则返回 B，否则返回 C | 逻辑运算
`IN` | 2 1 | A 的修正贝塞尔函数 (第一类, B阶) | 特殊函数
`INRANGE` | 3 1 | 如果 B <= A <= C 则返回 1，否则为 0 | 逻辑运算
`INSIDE` | 1 1 | 当位于 A 中的多边形内或其边界上时返回 1，否则为 0 | 特殊操作符
`INV` | 1 1 | A 的反误差函数 | 概率统计
`ISFINITE` | 1 1 | 如果 A 是有限值则返回 1，否则为 0 | 逻辑运算
`ISNAN` | 1 1 | 如果 A 等于 NaN 则返回 1，否则为 0 | 逻辑运算
`J0` | 1 1 | A 的贝塞尔函数 (第一类, 0阶) | 特殊函数
`J1` | 1 1 | A 的贝塞尔函数 (第一类, 1阶) | 特殊函数
`JN` | 2 1 | A 的贝塞尔函数 (第一类, B阶) | 特殊函数
`K0` | 1 1 | A 的修正开尔文函数 (第二类, 0阶) | 特殊函数
`K1` | 1 1 | A 的修正贝塞尔函数 (第二类, 1阶) | 特殊函数
`KEI` | 1 1 | 开尔文函数 kei (A) | 特殊函数
`KER` | 1 1 | 开尔文函数 ker (A) | 特殊函数
`KM2DEG` | 1 1 | 公里转换为球面度 | 特殊操作符
`KN` | 2 1 | A 的修正贝塞尔函数 (第二类, B阶) | 特殊函数
`KURT` | 1 1 | A 的峰度 | 概率统计
`LAB2HSV` | 3 3 | 将 l,a,b 三元组转换为 h,s,v 三元组 | 特殊操作符
`LAB2RGB` | 3 3 | 将 l,a,b 三元组转换为 r,g,b 三元组 | 特殊操作符
`LAB2XYZ` | 3 3 | 将 l,a,b 三元组转换为 x,y,z 三元组 | 特殊操作符
`LCDF` | 1 1 | 拉普拉斯累积分布函数 (z = A) | 概率统计
`LCRIT` | 1 1 | 拉普拉斯分布临界值 (alpha = A) | 概率统计
`LDIST` | 1 1 | 计算到多段 ASCII 文件 A 中各条线的最小距离（如果使用 -fg 则单位为 km） | 特殊操作符
`LDIST2` | 2 1 | 同 LDIST，计算到文件 B 中各线的距离，但仅针对 A 非零的节点 | 特殊操作符
`LDISTG` | 0 1 | 同 LDIST，但操作对象为 GSHHG 数据集（参见 -A, -D 选项） | 特殊操作符
`LE` | 2 1 | 如果 A <= B 则返回 1，否则为 0 | 逻辑运算
`LOG` | 1 1 | 双对数 (Spence's) 函数 | 特殊函数
`LOG10` | 1 1 | \(\log_{10}\) (A) (以 10 为底的对数) | 算术运算
`LOG1P` | 1 1 | log (1+A) (自然对数，对极小值 A 更精确) | 算术运算
`LOG2` | 1 1 | \(\log_2\) (A) (以 2 为底的对数) | 算术运算
`LMSSCL` | 1 1 | A 的 LMS (最小中位数平方) 尺度估计 (LMS STD) | 概率统计
`LMSSCLW` | 2 1 | A 基于权重 B 的加权 LMS 尺度估计 (LMS STD) | 概率统计
`LOWER` | 1 1 | A 的最低值 (最小值) | 算术运算
`LPDF` | 1 1 | 拉普拉斯概率密度函数 (z = A) | 概率统计
`LRAND` | 2 1 | 均值为 A，标准差为 B 的拉普拉斯随机噪声 | 概率统计
`LT` | 2 1 | 如果 A < B 则返回 1，否则为 0 | 逻辑运算
`MAD` | 1 1 | A 的中位数绝对偏差 (L1 STD) | 概率统计
`MAX` | 2 1 | A 和 B 的最大值 | 概率统计
`MEAN` | 1 1 | A 的平均值 | 概率统计
`MEANW` | 2 1 | A 基于权重 B 的加权平均值 | 概率统计
`MEDIAN` | 1 1 | A 的中位数 | 概率统计
`MEDIANW` | 2 1 | A 基于权重 B 的加权中位数 | 概率统计
`MIN` | 2 1 | A 和 B 的最小值 | 概率统计
`MOD` | 2 1 | A % B (向下取整除法的余数) | 算术运算
`MODE` | 1 1 | A 的众数 (最小中位数平方估计) | 概率统计
`MODEW` | 2 1 | A 基于权重 B 的加权众数 (最小中位数平方估计) | 概率统计
`MUL` | 2 1 | A x B (乘法) | 算术运算
`NAN` | 2 1 | 如果 A 等于 B 则返回 NaN，否则返回 A | 逻辑运算
`NEG` | 1 1 | 负值 (-A) | 算术运算
`NEQ` | 2 1 | 如果 A 不等于 B 则返回 1，否则为 0 | 逻辑运算
`NORM` | 1 1 | 归一化 (A) 使得 min(A) = 0 且 max(A) = 1 | 概率统计
`NOT` | 1 1 | ~A (按位非运算，即返回补码) | 逻辑运算
`NRAND` | 2 1 | 均值为 A，标准差为 B 的正态分布随机值 | 概率统计
`OR` | 2 1 | 如果 B 等于 NaN 则返回 NaN，否则返回 A | 逻辑运算
`PCDF` | 2 1 | 泊松累积分布函数 (x = A, lambda = B) | 概率统计
`PDIST` | 1 1 | 计算到 ASCII 文件 A 中各点的最小距离（如果使用 -fg 则单位为 km） | 特殊操作符
`PDIST2` | 2 1 | 同 PDIST，计算到文件 B 中各点的距离，但仅针对 A 非零的节点 | 特殊操作符
`PERM` | 2 1 | 排列数 nPr (n = A, r = B) | 概率统计
`PLM` | 3 1 | 伴随勒让德多项式 P(A)，次数为 B，阶数为 C | 特殊函数
`PLMg` | 3 1 | 归一化伴随勒让德多项式 P(A)，次数为 B，阶数为 C (地球物理规范) | 特殊函数
`POINT` | 1 2 | 从 ASCII 文件 A 中计算平均 x 和 y 并压入栈中 | 特殊操作符
`POP` | 1 0 | 从栈中删除顶端元素 | 特殊操作符
`POW` | 2 1 | A 的 B 次幂 | 算术运算
`PPDF` | 2 1 | 泊松分布 P(x, lambda) (x = A, lambda = B) | 概率统计
`PQUANT` | 2 1 | A 的第 B 个分位数 (0-100%) | 概率统计
`PQUANTW` | 3 1 | A 基于权重 B 的第 C 个加权分位数 (0-100%) | 概率统计
`PSI` | 1 1 | A 的 Psi (或 Digamma) 函数 | 特殊函数
`PV` | 3 1 | 勒让德函数 Pv(A)，次数为 v = real(B) + imag(C) | 特殊函数
`QV` | 3 1 | 勒让德函数 Qv(A)，次数为 v = real(B) + imag(C) | 特殊函数
`R2` | 2 1 | 斜边的平方 (= A2+ B2) | 微积分
`R2D` | 1 1 | 弧度转换为度 | 特殊操作符
`RAND` | 2 1 | 均值为 A，标准差为 B 的拉普拉斯随机噪声 | 概率统计
`RCDF` | 1 1 | 瑞利累积分布函数 (z = A) | 概率统计
`RCRIT` | 1 1 | 瑞利分布临界值 (alpha = A) | 概率统计
`RGB2HSV` | 3 3 | 将 r,g,b 转换为 h,s,v (r,g,b 范围为 0-255) | 特殊操作符
`RGB2LAB` | 3 3 | 将 r,g,b 转换为 l,a,b (r,g,b 范围为 0-255) | 特殊操作符
`RGB2XYZ` | 3 3 | 将 r,g,b 转换为 x,y,z (r,g,b 范围为 0-255) | 特殊操作符
`RINT` | 1 1 | rint (A) (舍入到最接近 A 的整数) | 算术运算
`RMS` | 1 1 | A 的均方根 (Root-mean-square) | 算术运算
`RMSW` | 1 1 | A 基于权重 B 的加权均方根 | 算术运算
`RPDF` | 1 1 | 瑞利概率密度函数 (z = A) | 概率统计
`ROLL` | 2 0 | 将栈顶 A 个元素循环平移 B 个位置 | 特殊操作符
`ROTX` | 2 1 | 将 A 在 x 方向上按常数 B 进行旋转平移 | 算术运算
`ROTY` | 2 1 | 将 A 在 y 方向上按常数 B 进行旋转平移 | 算术运算
`SADDLE` | 1 1 | 鞍点 (±)：x 方向为局部极小值(-1)或极大值(+1)，其余为 0 | 微积分
`SDIST` | 2 1 | 计算网格节点与栈中 (lon, lat) (即 A, B) 之间的球面(大圆/测地线)距离（单位为 km） | 特殊操作符
`SDIST2` | 2 1 | 同 SDIST，但仅计算到非零节点的距离 | 特殊操作符
`SAZ` | 2 1 | 从网格节点到栈中 (lon, lat) (即 A, B) 的球面方位角 | 特殊操作符
`SBAZ` | 2 1 | 从网格节点到栈中 (lon, lat) (即 A, B) 的球面反方位角 | 特殊操作符
`SEC` | 1 1 | 反正割（结果为弧度） | 微积分
`SECD` | 1 1 | 反正割（结果为度） | 微积分
`SIGN` | 1 1 | A 的符号 (+1 或 -1) | 逻辑运算
`SIN` | 1 1 | A 的正弦（A 为弧度） | 微积分
`SINC` | 1 1 | 归一化 Sinc 函数 | 特殊函数
`SIND` | 1 1 | A 的正弦（A 为度） | 微积分
`SINH` | 1 1 | A 的双曲正弦 | 微积分
`SKEW` | 1 1 | A 的偏度 | 概率统计
`SQR` | 1 1 | 平方 (2次幂) | 算术运算
`SQRT` | 1 1 | 平方根 | 算术运算
`STD` | 1 1 | A 的标准差 | 概率统计
`STDW` | 2 1 | A 基于权重 B 的加权标准差 | 概率统计
`STEP` | 1 1 | 赫维赛德阶跃函数 H(A) | 特殊函数
`STEPX` | 1 1 | x 方向的赫维赛德阶跃函数: H(x-A) | 特殊函数
`STEPY` | 1 1 | y 方向的赫维赛德阶跃函数: H(y-A) | 特殊函数
`SUB` | 2 1 | A - B (减法) | 算术运算
`SUM` | 1 1 | A 的累加和 (Cumulative sum) | 算术运算
`TAN` | 1 1 | A 的正切（A 为弧度） | 微积分
`TAND` | 1 1 | A 的正切（A 为度） | 微积分
`TANH` | 1 1 | A 的双曲正切 | 微积分
`TAPER` | 2 1 | 在末端 A 范围内余弦渐变到 0 的单位权重 | 特殊操作符
`TCDF` | 2 1 | 学生 t 累积分布函数 (t = A, nu = B) | 概率统计
`TCRIT` | 2 1 | 学生 t 分布临界值 (alpha = A, nu = B) | 概率统计
`TN` | 2 1 | ~A (按位非运算，即返回补码) | 逻辑运算
`TPDF` | 2 1 | 学生 t 概率密度函数 (t = A, nu = B) | 概率统计
`TRIM` | 3 1 | Alpha 截断：如果 C 的值落在 A 和 B (百分比) 指定的尾部，则设为 NaN | 特殊操作符
`UPPER` | 1 1 | A 的最高值 (最大值) | 算术运算
`VAR` | 1 1 | A 的方差 | 概率统计
`VARW` | 2 1 | A 基于权重 B 的加权方差 | 概率统计
`VPDF` | 3 1 | Von Mises 密度分布 V(x,mu,kappa) (角度=A, mu=B, kappa=C) | 概率统计
`WCDF` | 3 1 | 威布尔累积分布函数 (x=A, scale=B, shape=C) | 概率统计
`WCRIT` | 3 1 | 威布尔分布临界值 (alpha=A, scale=B, shape=C) | 概率统计
`WPDF` | 3 1 | 威布尔密度分布 P(x,scale,shape) (x=A, scale=B, shape=C) | 概率统计
`WRAP` | 1 1 | 将弧度 A 转换到 [-pi, pi] 范围内 | 特殊操作符
`XOR` | 2 1 | A ^ B (按位异或运算) | 逻辑运算
`XYZ2HSV` | 3 3 | 将 x,y,z 三元组转换为 h,s,v 三元组 | 特殊操作符
`XYZ2LAB` | 3 3 | 将 x,y,z 三元组转换为 l,a,b 三元组 | 特殊操作符
`XYZ2RGB` | 3 3 | 将 x,y,z 三元组转换为 r,g,b 三元组 | 特殊操作符
`Y0` | 1 1 | A 的贝塞尔函数 (第二类, 0阶) | 特殊函数
`Y1` | 1 1 | A 的贝塞尔函数 (第二类, 1阶) | 特殊函数
`YLM` | 2 2 | 次数为 A、阶数为 B 的实部和虚部正交归一化球谐函数 | 特殊函数
`YLMg` | 2 2 | 次数为 A、阶数为 B 的余弦和正弦归一化球谐函数（地球物理规范） | 特殊函数
`YN` | 2 1 | A 的贝塞尔函数 (第二类, B阶) | 特殊函数
`ZCDF` | 1 1 | 正态累积分布函数 (z = A) | 概率统计
`ZCRIT` | 1 1 | 正态分布临界值 (alpha = A) | 概率统计
`ZPDF` | 1 1 | 正态概率密度函数 (z = A) | 概率统计

## 其他符号

以下符号都具有特殊意义：

数学常量与网格变量
标识符 | 描述 / 数值
--- | ---
`PI` | 圆周率 (3.1415926...)
`E` | 自然常数 (2.7182818...)
`EULER` | 欧拉常数 (0.5772156...)
`PHI` | 黄金分割率 (1.6180339...)
`EPS_F` | 单精度浮点数机器精度 (1.192092896e-07)
`XMIN` | x 值的最小值
`XMAX` | x 值的最大值
`XRANGE` | x 值的范围
`XINC` | x 的增量
`NX` | x 方向的节点数
`YMIN` | y 值的最小值
`YMAX` | y 值的最大值
`YRANGE` | y 值的范围
`YINC` | y 的增量
`NY` | y 方向的节点数
`X` | 包含 x 坐标的网格
`Y` | 包含 y 坐标的网格
`XNORM` | 包含归一化 [-1 到 +1] x 坐标的网格
`YNORM` | 包含归一化 [-1 到 +1] y 坐标的网格
`XCOL` | 包含列号 (0, 1, ..., NX-1) 的网格
`YROW` | 包含行号 (0, 1, ..., NY-1) 的网格
`NODE` | 包含节点号 (0, 1, ..., (NX*NY)-1) 的网格
`NODEP` | 包含补边 (pad) 时的节点号网格

上述符号均可以作为变量使用，当其为多个数时，逐元素操作。

## 运算符注意事项

1. 对于笛卡尔坐标，运算符 MEAN，MEDIAN，MODE，LMSSCL，MAD， PQUANT，RMS，STD 和 VAR 将返回基于给定网格的值。对于地理 坐标，GMT 将施行球面加权运算，其中每个节点的值都由该点代表的地理区域加权得到。

2. SDIST 计算堆栈上的点 (lon,lat) 与所有网格点的球面距离，单位为 km。网格范围 和点的坐标单位均为度。类似地，SAZ 和 SBAZ 分别用来球面方位角以及球面 反方位角，单位也为度。如果设置了 -fg 或隐含该选项，LDIST 和 PDIST 以 km 为单位计算球面距离，否则返回笛卡尔距离。注 : 如果 PROJ_ELLIPSOID 为椭球，则计算结果为大地线（测地线）的长度。这可能导致计算比较慢，但可以通过 PROJ_GEODESIC 中设置使用其他算法以平衡精度和效率。

   LDISTG 和 LDIST 作用类似，但是 LDISTG 使用 GSHHG 数据运算。其中 GSHHG 数据来自 `-D` 和 `-A` 选项。

3. POINT 读取一个 ASCII 文件，计算 x 和 y 的平均值并放在堆栈中。如果输入数据 为地理坐标，使用平均 3D 向量来确定平均位置。

4. PLM 和 PLMg 运算符用来计算 L 阶 M 次的缔合勒让德函数；M 参数 的范围应该满足 0 <= M <= L，参数为纬度的正弦值。 PLM 运算符没有经过标准化， 并且乘以 phase (-1)^M。 PLMg 使用大地测量/地球物理常见的标准化。使用 -M 参数可以附加球谐系数 C 和 S。 PLM 在较高的阶次就会出现溢出，具 体和纬度相关， PLMg 则可以保证在 3000 阶以下都不会溢

5. YLM 和 YLGM 用于计算网格所有位置的 L 阶 M 次标准化后的球谐函数， 0 <= M <= L。结果返回两个网格，一个为球谐函数的实部网格，一个为虚部网格。使用 POP 可保存其中的任意一个，也可以使用两个连续的 = file.nc 同时保存。

   正交归一化的复数谐函数主要用于物理学和地震学，YLM 的平方在球面上的积分为 1。在大地测量学中，YLMG 积分后的结果为 4pi。相位 (-1)^M 不包含在 YLM 和 YLMg 中。

6. 所有导数都基于 central finite differences 和 natural boundary conditionsi， 并且为笛卡尔坐标下的导数

7. 不同参数文件名相同时，应给定相对路径或绝对路径以区分不同文件

8. 不允许使用管道

9. 该模块计算过程保存在堆栈中，栈中保存结果最大为 100，即不能叠加太多的操作 以防溢出

10. 所有需要半径的运算符为保证其为正值，均自动取了绝对值后计算

11. 当使用 OpenMP 后，某些运算符将使用该能力。目前包括 LDIST，LDIST2， PDIST，PDIST2，SAZ，SBAZ，SDIST，YLM，和 grd_YLMg

12. DEG2KM 和 KM2DEG 只有当设置 PROJ_ELLIPSOID 为球形时才准确

13. DOT 在点积计算之前对二维向量进行归一化，对于三维向量，则不需要。

14. 颜色转换函数，例如 RGB2HSV 等，不仅包括 rgb 到 hsv 等三元数的转换， 还包括 lab 到 sRGB 等四元数的转换

15. DAYNIGHT 返回一个网格，在给定太阳位置为 (A,B) 时，面向太阳的网格点为 1， 其他为 0，如果过渡宽度 C 为 0，则结果为 0 和 1 两种，如果 C 不为 0，则使用 atan 函数近似求解，因此值不为 0 或 1。

16. VPDF 运算符的输入数据单位为角

17. CUMSUM 运算符通常在行或者列结束时重置累计的值，使用 ±3 或 ±4 可以使累积 的值在下一行或者列继续

18. 位运算符 BITAND，BITLEFT，BITNOT，BITOR，BITRIGHT， BITTEST 和 BITXOR 会将网格数据中的单精度数转换为无符号的 32 位整数， 然后按位运算。因此，可储存在双精度数中的最大整数为 2^24 ，更大的数都会被 截断。如果被比较的数中包括 NaN ，则最终结果也为 NaN

## 网格值精度

不管输入数据的精度如何，创建网格文件的 GMT 程序将在内部以 4 字节浮点数组的形式保存网格。 这样做是为了节省内存，而且大多数实际数据都可以使用 4 字节浮点值存储。 具有更高精度的数据（即双精度值）将在 GMT 操作网格或写入新网格时失去该精度。 为了限制处理数据时的精度损失，用户应该始终考虑在处理之前对数据进行归一化。

## 储存、调用和清除

用户可以将中间计算结果储存到一个变量中，并在后续计算中调用该变量。这在需要 对某部分进行多次重复计算时可以提高效率和可读性。保存结果需要使用特殊的运算符 STO@label ， 其中 label 是变量的名称。调用该变量时，使用 [RCL]@label ， RCL 是可选的。使用后要清除该变量，可以使用 CLR@label ， STO 和 CLR 均不影响计算中的堆栈。

## GSHHG 信息

GSHHG (The Global Self-consistent, Hierarchical, High-resolution Geography Database) 最初为 GSHHS，是一个海岸线数据库，主要有三个来源：World Vector Shorelines (WVS，不包括南极洲), CIA World Data Bank II (WDBII), 和 Atlas of the Cryosphere (AC，只包含南极洲)。 除了南极洲，所有的 1 级多边形（海陆边界）都来自更准确的 WVS，所有的更高级别 的多边形（2-4 级，湖泊边界、湖中岛边界和湖中岛中湖边界）来自 WDBII。南极洲 的海岸线有两种：冰盖的边界和陆地的边界，可以使用 -A 选项选择。为了将 WVS 、WDBII 和 AC 数据转换为 GMT 可用的格式，GMT 已经进行了多种处理，包括：由线段 组建多边形，去重，以及校正多边形之间的交叉等。每个多边形的面积已经被计算出来， 因此，用户可以自己选择不绘制小于最小面积的多边形，还可以限制绘制的多边形的级别 ，见 -A 选项。绘制海岸线时，还可以使用不同的精细程度，其中低分辨率的海岸线 是由 Douglas-Peucker 算法简化得到的。河流和边界的分类遵循 WDBII。详细细节见 GSHHG 。

## 点位于多边形内/外

为了确定点在多边形内，外或在边界上，GMT 会平衡数据类型以及多边形形状等因素来 确定算法。对于笛卡尔坐标，GMT 使用 non-zero winding 算法，该算法非常快。对于 地理坐标，如果多边形不包括两极点且多边形的经度范围不超过 360 度，同样使用该 算法。否则，GMT 会采用 full spherical ray-shooting 方法。

## 宏

用户可以将特定的运算符组合保存为宏文件 gmtmath.macros 。文件中可以包含任意 数量的宏， # 开头的行为注释。宏的格式为

    name = arg1 arg2 ... arg2[ : comment]

其中，name 是宏名，当此运算符出现在命令中时，则将其简单替换为参数列表。宏 不可以互相调用。下面给出一个宏例子：INCIRCLE 宏需要三个参数：半径，x0 和 y0， 并将在圆内的点设置为 1，外部设置为 0

    INCIRCLE = CDIST EXCH DIV 1 LE : usage: r x y INCIRCLE to return 1 inside circl

由于在宏中可能使用地理或时间常数，因此可使用 `:` 后加一个空格的形式作为注释的开端。

## 示例

计算网格点到北极的距离

    gmt grdmath -Rg -I1 0 90 SDIST = dist_to_NP.nc

求两个文件的均值以及结果的 log10 函数值

    gmt grdmath file1.nc file2.nc ADD 0.5 MUL LOG10 = file3.nc

给定含有海底地形年代（单位 m.y.）和深度（单位 m）网格文件 `agrs.nc` ，使用 公式 depth(单位为 m) = 2500 + 350 * sqrt (age) 估计正常深度

    gmt grdmath ages.nc SQRT 350 MUL 2500 ADD = depths.nc

从 `s_xx.nc`，`s_yy.nc` 和 `s_xy.nc` 三个文件包含的应力张量中，根据 tan (2*a) = 2 * s_xy / (s_xx - s_yy) 求出最大主应力的角度，单位为度

    gmt grdmath 2 s_xy.nc MUL s_xx.nc s_yy.nc SUB DIV ATAN 2 DIV = direction.nc

计算 1 度分辨率的网格上完全正则化的 8 阶 4 次球谐函数，实数和虚数的振幅分别为 0.4 和 1.1

    gmt grdmath -R0/360/-90/90 -I1 8 4 YLM 1.1 MUL EXCH 0.4 MUL ADD = harm.nc

提取文件:file:faa.nc 中超过 100 mgal 的局部最大值的位置

    gmt grdmath faa.nc DUP EXTREMA 2 EQ MUL DUP 100 GT MUL 0 NAN = z.nc
    gmt grd2xyz z.nc -s > max.xyz

变量的使用: consider this radial wave where we store and recall the normalized radial arguments in radians

    gmt grdmath -R0/10/0/10 -I0.25 5 5 CDIST 2 MUL PI MUL 5 DIV STO@r COS @r SIN MUL = wave.nc

创建一个保存 32 位浮点型 GeoTiff 文件

    gmt grdmath -Rd -I10 X Y MUL = lixo.tiff=gd:GTiff

计算地理网格 `data.grd` 中网格点到 `trace.txt` 的距离，单位为 km

    gmt grdmath -Rdata.grd trace.txt LDIST = dist_from_line.grd

-S 选项的使用：计算所有以 model_*.grd 为名的网格对应节点的标准差

    gmt grdmath model_*.grd -S STD = std_of_models.grd

创建 0.5 度分辨率的 geotiff 网格文件，网格值为离海岸线的距离，单位为 km

    gmt grdmath -RNO,IS -Dc -I.5 LDISTG = distance.tif=gd:GTIFF

## 参考文献

Abramowitz, M., and I. A. Stegun, 1964, Handbook of Mathematical Functions, Applied Mathematics Series, vol. 55, Dover, New York.

Holmes, S. A., and W. E. Featherstone, 2002, A unified approach to the Clenshaw summation and the recursive computation of very high degree and order normalized associated Legendre functions. Journal of Geodesy, 76, 279-299.

Press, W. H., S. A. Teukolsky, W. T. Vetterling, and B. P. Flannery, 1992, Numerical Recipes, 2nd edition, Cambridge Univ., New York.

Spanier, J., and K. B. Oldman, 1987, An Atlas of Functions, Hemisphere Publishing Corp.

## 相关模块

math, grd2xyz, grdedit, grdinfo, xyz2grd