-K-O 是 GMT 的 17 个标准选项中最常用但最容易出错的两个。本文将介绍使用 这两个选项的技巧。

用法回顾

  • 如果一张图只需要一个命令就可以画出来,则不需要 -K-O 选项;
  • 如果一张图由两个命令绘制出来,第一个命令需要使用 -K,第二个命令需要使用 -O
  • 如果一张图由多个命令组成,第一个命令使用 -K ,中间命令使用 -K-O ,最后一个命令使用 -O
  • 第一个命令使用重定向符号 > 创建新文件并写入 PS 命令;
  • 余下所有命令绘图命令使用重定向符号 >> 向 PS 文件中追加新的 PS 命令;

经典错误

根据上面所说的用法去写绘图脚本,经常会出现各种错误,列出常见的错误如下:

  • 已经写好的一个绘图脚本,想要在往图里加点东西。在脚本的最后加了个命令,使用了 -O,但是却忘了 把原来最后一个命令的 -O 改成 -K -O。这样最后一个命令应该没有效果,或者 gs 直接报错。
  • 第一个命令绘制海岸线,第二个命令绘制地形,导致地形把海岸线覆盖了,想要交换两个命令的顺序, 结果忘记将第一个命令的 -K 改成 -O ,忘记将第二个命令的 -O 改成 -K。这样应该完全没结果吧。
  • 想要在第一个命令前再加一个绘图命令,也记得把原来第一个命令的 -K 改成 -K -O ,但是忘记把 > 改成 >>

新手常犯的错误太多,一时想不起了。

完全避免犯错的技巧

下面的技巧可以几乎完全避免使用 -K-O 以及 重定向符号 过程中可能出现的错误(前提是要理解 这个简单的技巧为什么可以帮助你避免犯错)。下面分别给出 GMT4 和 GMT5 下 bash 脚本中使用 -K-O 的技巧。

在理解了如下脚本后,很容易将其修改到 bat、Perl、Python 中。

GMT4 Bash 脚本

#!/bin/bash
#
# GMT template
#
PS=example.ps
J=X6i
R=0/1/0/1

# Begin GMT Plot
psxy -J$J -R$R -T -K > $PS

# now begin your real plot commands
# every command should be with "-K" "-O" and ">>"

# End GMT Plot
psxy -J$J -R$R -T -O >> $PS

# Plot finished. Now you can convert PS to other format

GMT5 Bash 脚本

#!/bin/bash
#
# GMT template
#
PS=example.ps
J=X6i
R=0/1/0/1

# Begin GMT Plot
gmt psxy -J$J -R$R -T -K > $PS

# now begin your real plot commands
# every command should be with "-K" "-O" and ">>"

# End GMT Plot
gmt psxy -J$J -R$R -T -O >> $PS

# Plot finished. Now you can convert PS to other format

一点点解释

  • -T 选项忽略所有输入,即输入为空,相当于 /dev/null 。因而这两个
  • psxy 命令实际上不会写入任何图像相关的代码到 PS 文件中。第一个 psxy
  • 命令生成了 PS 头部信息,最后的 psxy 命令生成了尾巴。

可以在这两个 psxy 命令中间添加任意数目真正用于绘图的命令。这些(零个、一个或者多个)命令既不 需要头段也不需要尾巴,因而所有的中间绘图命令都需要 -K-O 选项,并使用重定向 >>

这样带来的好处在于,中间所有命令具有统一的风格,都使用 -K -O >>。因而可以任意增加、删除命令 或调整任意命令的相对顺序。

备注

  • 印象中这个技巧在官方文档的脚本中出现过,但是没有将其作为一种技巧来说,所以貌似未得到推广;
  • 每个 GMT 命令默认都会输出头段和尾巴,这样的设计合理吗?为什么不是绘图命令完全抛弃头段和尾巴, 由两个单独的命令向 PS 文件中写头段和尾巴?这样的设计也许不太符合 GMT 命令的整体风格;
  • 究竟有没有效果?用过之后才有评价的资格。

修订历史

  • 2013-07-07:初稿;
  • 2013-08-24:修订了 bash 脚本中的一个笔误;
  • 2013-11-06:修订脚本,使用 -T 选项,不再使用 /dev/null
  • 2014-07-06:删除了 Perl 版脚本,增加了 GMT5 版本的脚本;