-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 版本的脚本;