在 GMT 中绘制断层很简单,只要有断层的坐标数据,直接用 psxy 即可绘制。

有时不仅要绘制断层,还需要在断层线的旁边加上断层名,最直接的想法是用 pstext 将断层名写上去。使用 pstext 添加断层名时会遇到两个问题:

  1. text 的位置;
  2. text 的角度(一般情况下,断层名与断层线平行);

如果只是几条断层的话,可以手动指定并微调 text 的位置和角度,以达到想要的效果。如果要标记的断层名有点多,或者想要批量绘制不同区域的多张断层图,手动微调的方法就有些麻烦了。当然,如果真有需求的话,可以手动微调,建立一个断层名的数据库,以后用起来就方便多了。

直接的想法

为了能够将添加断层名这个事情自动化,就需要解决以上两个问题。对于任意一条断层而言:

  1. text 的位置可以通过找断层线的中间点得到;
  2. text 的角度可以通过 text 位置附近的几个点计算切线方向得到;

思路很简单,自己实现起来也不算难。不过,其实 GMT 已经实现了这一功能,直接拿过来用即可。

GMT 的解法

GMT 的 psxy 命令中提供了 - Sq 选项可以用于在绘制线段的同时在线段上添加标注,利用这一选项可以实现给断层标注断层名的目的。

最小示例

下面的例子是实现添加断层名的最小代码,关键在于 - Sq 选项:

  1. n1 表明在线段上只显示一次断层名,当然也可以选择显示多次;
  2. : 是一个分界符,不可缺少;
  3. +Lh 表明从多段数据的头段中读取 - L 选项作为断层名;
  4. 对于每段数据,在头段记录中都需要使用 -L<label> 来指定断层名;
gmt psxy -R90/130/30/60 -JM15c -B5 -Sqn1:+Lh > map.ps << EOF
> -L"AAA Fault"
95.00 35.00
97.56 37.17
100.27 39.29
103.14 41.34
106.20 43.31
109.45 45.20
112.93 46.99
116.63 48.67
120.00 50.00
> -L"BBB Fault"
95.00 55.00
96.59 54.61
98.16 54.19
99.69 53.76
101.19 53.30
102.65 52.83
104.09 52.34
105.49 51.83
106.86 51.31
108.20 50.77
109.51 50.21
110.00 50.00
EOF

绘图效果如下:

稍复杂的示例

-Sq 有很多子选项,可以对图进行进一步修改,详情参考官方文档。

将上面例子中的 - Sq 选项改成:

-Sqn1:+Lh+f15p,blue+n0c/0.3c

其中:

  • +f15p,blue 用于修改断层名的字号和颜色
  • +n0c/0.3c 表明将断层名沿着垂直断层的方向偏移 0.3 厘米;

效果如下:

自定义

上图的效果已经很不错了,但是现实情况可能会很复杂,尤其是在断层比较多的时候,可能几个断层名会重叠在一起。此时想要自动判断并调整断层名的位置就比较困难了,所以需要在已有位置的基础上做一些手动的调整。

给上例中的 - Sq 选项中额外加上一个 + T 子选项,即:

-Sqn1:+Lh+f15p,blue+n0c/0.3c+Tfaultname.txt

使用该选项后,会在绘图的同时将每个断层名的信息输出到文件 faultname.txt 中,其格式为:

X   Y   angle   label

对照着画出来的图,手动调整不甚满意的断层名的位置和角度。然后放弃之前的 psxy -Sq 的代码,使用 psxy 绘制断层,pstext 绘制断层名 faultname.txt。