等值线标注和“线条标注”

GMT 中可以使用采用 grdcontourpscontour 模块来绘制等值线,每条等值线都可以附加一个标注。GMT 中 plotplot3d 模块也可以使用 -Sq 选项绘制带有标注的线段。

在需要为等值线/线段附加标注的时候,如何优化标注的位置是一个很困难的主题。GMT提供了不同的算法确定标注的位置,并且可以自由地指定标注的属性。本章总结了标注的属性和位置确定方法,并给出了一些应用实例。

标注的位置

GMT 中提供了5种算法来自动确定标注的位置。对于 grdcontourpscontour 模块,可以通过 -G 选项指定使用哪种标注定位算法,对于 plotplot3d 模块,则可以通过 -Sq 选项指定使用哪种标注定位算法。

不管是 -G 还是 -Sq,其所需要的信息是完全相同的,采用 <code><info> 的格式来指定算法和相应参数,其中 <code> 取不同的值代表不同的算法,<info> 则是各个算法所对应的参数。

下述内容给出了不同 <code> 对应的算法和相应的参数:

d:

完整的语法为 d<dist>[c|i|p][/frac]

根据地图上的投影距离确定标注的位置,可以指定长度单位或采用默认值 [PROJ_LENGTH_UNIT]。从等值线的起始位置开始,以 <dist> 为步长,沿着等值线布置标注。为了保证可以标注总长度小于 <dist> 的封闭曲线,可以指定 <frac> 参数,将第一个标注放置在距封闭曲线起点 d = <dist> * <frac> 的位置上,frac 的默认值为0.25。

D:

完整的语法为 D<dist>[d|m|s|e|f|k|M|n][/<frac>]

d 相似,但是其输入数据必须是地理坐标(同时必须选择地图投影),距离为沿等值线的地表真实距离。可以附加距离的单位,其中 d|m|s|e|f|k|M|n 各个单位的含义见 单位 一节。其它参数的意义与 d 相同。

f:

完整的语法为 f<fix.txt>[/<slop>[c|i|p]]

其中,ASCII文件 <fix.txt> 中每条记录的前两列(坐标)指定了标注的位置。当文件中的坐标与等值线的距离小于 <slop> (附加单位或使用默认值 PROJ_LENGTH_UNIT )时,才会显示标注。<slope> 的默认值为0,即文件中的坐标必须与线段上的坐标完全匹配。

l:

完整的语法为 l<line1>[,<line2>[, ...]]

指定一个或多个以逗号分隔的直线段,在这些直线段与等值线的交点位置放置标注。通过起点 <start> 和终点 <stop> 的坐标来定义每个直线段 <line> 。起点和终点的坐标可以是常规坐标,如斜杠分隔的经纬度,或与地图区域相关的2个字母组合成的子选项。这些字母的取值与 pstext 中对齐方式的取值相同,即 [L|C|R][B|M|T]

第一个字母代表横坐标 <x>,第二个字母代表纵坐标 <y>,如 LB` 代表 地图的左下角。 在模块 ``grdcontour 中还可以使用子选项 Z+Z- 代表网格数据中全局最大值点或最小值点的坐标。例如,直线段 line LT/RB 代表地图左上角到右下角的对角线, Z-/135W/15S 代表网格数据中最小值点与 (135ºW, 15ºS)之间的直线段。

L:

除起点与终点之间的线段为大圆弧外,其余内容与子选项 l 相同。

n:

完整的语法为 n<number>[/<minlength>[c|i|p]]

沿等值线放置 <number> 个标注,即将等值线分割为 <number> 段,标注位于每段的中心位置。还可以通过指定最小距离 <minlength> 来保证相邻标注之间的距离不小于 <minlength>

N:

完整的语法为 N<number>[/<minlength>[c|i|p]]

除标注位于每段终点位置外( <number> >= 2 ),与子选项 n 类似。当 number=-1 时,标注位于等值线的起点;当 number=+1 时,标注位于等值线的终点。

x:

完整的语法为 x<cross.d>

ASCII文件 <cross.d> 内给出了多段数据,这些线段与等值线的交点即是标注的位置。

X:

除了ASCII文件中定义的线段为大圆弧外,与子选项 x 的类似。

每调用一次等值线绘制模块,只能指定一种确定标注位置的算法。

标注的属性

确定标注的位置之后,还需要指定标注的属性。对于等值线绘制模块,在 -A 选项后以 +<code>[<参数>] 的格式定义不同的属性;对于线条绘制模块中,则是在 -Sq 选项后用冒号 : 来分隔标注的属性和标注的位置。

部分属性只能用于线条绘制模块,因此,首先列出了两个模块通用的属性。这些属性包括:

+a:

控制标注的角度和线条的角度间的相互关系:

  1. 后面加上 n 表示二者相互垂直;

  2. 后面加上 p 表示二者之间相互平行,调用 grdcontour 模块时,还可以附加 ud 表示标注的上边缘指向更高或更低的等值线;

  3. 给定角度 <angle> 表示自水平方向开始逆时针方向旋转的角度

+c:

每个标注周围存在一个假想的文本框,等值线在这个区域内是不可见的。默认的文本框精确的围限了标注,可以指定水平向和竖直向的间隙(相对于标注的基线)。若水平向和竖直向的间隙值不同,需要以斜杠分隔,可以在间隙值后附加长度单位( c|i|m|p ),也可以指定间隙与标注所采用字体的百分比,默认值为15% 。

+d:

Debug 模式。标注所在位置也会绘制等值线,用来测试等值线的位置。

+d:

延迟模式, 延迟标注文字的绘制。

+f:

指定标注文字的字体、大小和颜色等,可参考 pstext 。字体的默认值参见 FONT_ANNOT_PRIMARY

+g:

指定文本框的填充效果,颜色的默认值与 PS_PAGE_COLOR 相同。

+j:

指定标注内容与标注位置之间的对齐方式,默认值为 CM ,指定值可以覆盖默认值,参数值由2个字母组成,取值范围分别为 [L|C|R][B|M|T] 。对于弯曲的标注文字 (+v),只有竖直向对齐方式起作用。

+o:

指定文本框的形状为圆角矩形,只有对文本框进行填充或显示轮廓时才起作用。对于弯曲的标注文字 (+v)不起作用。

+p:

指定文本框轮廓线的线条属性,默认值为[0.25p,black] 。

+r:

当曲率半径低于给定值时,不放置标注,可以指定曲率半径的单位,默认值为0。

+u:

在标注后加单位 <unit> 。通常在单位和标注之间有一个空格,若想去掉这个间隔,需要在单位前加连字符(-)。调用 grdcontour 模块时,若给出这个属性,却不指定单位时,则使用网格头段中 z 值的单位。

+v:

根据线条摆动情况放置弯曲的标注,当标注长度较大时,该属性尤其有用。默认值为给定角度的不可见的直线段。

+w:

标注所在位置处等值线的角度,是对附近的 width 个点,进行最小二乘拟合计算的,width 的默认值为10。

+=:

+u 非常相似,用于指定 prefix 的单位。

对于等值线绘制模块,标注的内容为等值线的数值(可以通过 +u+= 属性来修改)。对于线条绘制模块来说,还可以指定下述属性:

+l:

在标注位置放置相同的内容,如果标注内容包含空格,则需要用引号括起来。

+L:

通过附加 子选项 指定标注的内容,可用的子选项包括:

+Lh:

采用多段数据的头记录作为标注内容(假设输入为多段数据,如果不是多段数据,则采用文件头记录)。首先扫描 -L<子选项> 属性,若没有指定该选项,则采用数据段头记录首字符(默认为 > )后的第一个单词。

+Ld:

采用笛卡尔坐标系内的距离作为标注内容的距离单位,可以指定单位,如 c|i|p,默认值为 [PROJ_LENGTH_UNIT]。标注内容的格式参见:term:FORMAT_FLOAT_OUT

+LD:

采用真实地表距离计算标注内容,可以指定单位,如 d|e|f|k|m|M|n|s,默认值为度 d

+Lf:

采用ASCII文件 fix.txt 中第2列数据之后的所有文字作为标注的内容,显然,该属性需要在指定标注位置算法(f) 的前提下,才能起作用。

+Ln:

采用多段数据中当前数据段的顺序号作为标注内容。

+LN:

采用斜杠分隔的文件号--当前数据段顺序号作为标注内容。

+Lx:

与属性 h 类似,多段数据头记录的来源为 cross.d 文件。显然,该属性需要在指定标注位置算法(x|X)的前提下,才能起作用。

等值线标注位置实例

本节通过一些简单的实例说明等值线标注位置选项的作用。首先,在实例1中,采用部分全球大地水准面数据(geoid),绘制了等值线。所选择的区域包含了大地水准面的两级,Indian Low和New Guinea High。

等距离放置标注

第1个实例使用标注位置算法的默认值,沿等值线每1.5英寸放置一个标注:

#!/usr/bin/env bash
gmt begin contour_annot1
gmt coast -R50/160/-15/15 -JM5.3i -Gburlywood -Sazure -A500
gmt grdcontour geoid.nc -B20f10 -BWSne -C10 -A20+f8p -Gd1.5i -S10 -T+lLH
gmt end show
../_images/a7d4a34d2e817071cf5fcf5501576e0e.png

通过指定 -Gd 选项的参数,确定了标注的位置(等值线上相距1.5英寸的点)

给定标注个数

现在指定每条等值线上标注的个数。每条等值线上只放置1个标注,并且要求等值线的长度不小于1英寸,

#!/usr/bin/env bash
gmt begin contour_annot2
gmt coast -R50/160/-15/15 -JM5.3i -Gburlywood -Sazure -A500
gmt grdcontour geoid.nc -B20f10 -BWSne -C10 -A20+f8p -Gn1/1i -S10 -T+lLH
gmt end show
../_images/feeea42314322307e3c7b316ae1d6444.png

通过指定 -Gn 选项的参数,确定了标注的位置(每条长度超过1英寸的等值线的中心位置)

给定标注位置

给定标注所在位置的坐标,由于坐标不是严格位于等值线上,指定了非0距离值,即标注位置与等值线距离的上限。

根据等值线的几何形状,自动计算标注的角度。为了帮助理解,通过指定选项 -A 中的 +d* 属性,采用了debug模式,即在每个给定位置上绘制了一个小圆圈。

#!/usr/bin/env bash
cat << EOF > fix.txt
80      -8.5
55      -7.5
102     0
130     10.5
EOF
gmt begin contour_annot3
gmt coast -R50/160/-15/15 -JM5.3i -Gburlywood -Sazure -A500
gmt grdcontour geoid.nc -B20f10 -BWSne -C10 -A20+d+f8p -Gffix.txt/0.1i -S10 -T+lLH
gmt end show
../_images/7598d8912919a6c4f62dbbef4c16c6f1.png

通过指定 -Gf 选项的参数,确定了标注的位置(等值线上与给定点距离最小的点)

线段与等值线交点处放置标注

通过指定 -Gl-GL 选项的参数来定义线段,将标注放置在直线段与等值线的交点。

#!/usr/bin/env bash
gmt begin contour_annot4
gmt coast -R50/160/-15/15 -JM5.3i -Gburlywood -Sazure -A500
gmt grdcontour geoid.nc -B20f10 -BWSne -C10 -A20+d+f8p -GLZ-/Z+ -S10 -T+lLH
gmt end show
../_images/f78724144ed0141d3c4278cdea1589c2.png

通过指定 -GL 选项的参数确定了标注的位置(大圆弧与等值线的交点)

图中的标注位于数据极值点连线(Z-/Z+)与等值线的交点。图中极值点连线为两点之间的大圆弧,在其与等值线交点位置处放置了标注。同一幅地图中,可以分别指定多条线段。

广义的线段与等值线相交算法

如果需要指定的与等值线相交的线段比较多,或线段数据来自其他数据集,可以使用广义的相交算法确定标注的位置。多段数据文件 cross.txt 中定义了三条曲线,在这三条曲线与等值线交点位置处放置了标注,

#!/usr/bin/env bash
gmt begin contour_annot5
gmt coast -R50/160/-15/15 -JM5.3i -Gburlywood -Sazure -A500
gmt grdcontour geoid.nc -B20f10 -BWSne -C10 -A20+d+f8p -GXcross.txt -S10 -T+lLH
gmt end show
../_images/22d13ccdbcdaa8cb52bbd308a526db74.png

通过指定 -GX 选项的参数(多段数据文件 cross.txt ),确定了标注的位置

标注属性实例

本节通过实例说明标注属性的作用,采用 plot 绘制了大地水准面极值点之间的大圆弧,并且沿着该大圆弧从ETOPO5数据集中提取了高程数据。高程数据文件(transect.txt)中包括了 经度、纬度、距离、大地水准面、高程 数据。

按照沿大圆弧距离放置标注-不透明文本框

在本实例中将标注的走向从沿大圆弧改变为跨大圆弧,并指定了不透明的文本框和轮廓线,增加了标注的可读性。沿大圆弧每1000km放置一个标注,使用距离值作为标注的内容。标注的方向与大圆弧垂直:

#!/usr/bin/env bash
gmt begin contour_annot6
gmt coast -R50/160/-15/15 -JM5.3i -Gburlywood -Sazure -A500
gmt grdcontour geoid.nc -B20f10 -BWSne -C10 -A20+d+f8p -Gl50/10S/160/10S -S10 -T+l
gmt plot -SqD1000k:+g+LD+an+p -Wthick transect.txt
gmt end show
../_images/e233dfa9831ac0ca40c0e06b77007d5a.png

通过指定 -Sq 选项的参数控制标注属性.

图中显示了上述命令的综合效果。值得注意的是,大圆弧的起点和终点没有与表示极值点的”-“和”+”符号完全重合。造成这个现象的原因是,极值点符号”-“和”+”的坐标是等值线的平均值,而不是全局或局部极值的位置。

按照沿大圆弧距离放置标注-反色圆角矩阵

与上一个实例不同的是,本实例中标注与大圆弧平行,以度指定标注位置,并添加度单位。文本框的形状为圆角矩形,且标注内容与文本框的底色呈反色显示。

#!/usr/bin/env bash
gmt begin contour_annot7
gmt coast -R50/160/-15/15 -JM5.3i -Gburlywood -Sazure -A500
gmt grdcontour geoid.nc -B20f10 -BWSne -C10 -A20+d+u" m"+f8p -Gl50/10S/160/10S -S10 -T+l
gmt plot -SqD15d:+gblack+fwhite+LD+o+u\\260 -Wthick transect.txt
gmt end show
../_images/7e6abbb6ecece73aa0eeba61e0b8ce09.png

另一个标注属性实例

使用不同数据集定义标注的内容和位置

本实例中采用沿大圆弧的海底地形数据作为标注的内容,按照沿大圆弧的距离,每1500km放置一个标注。因此需要使用 awk 程序从 transect.txt 文件中抽取距离为1500km倍数的记录,并创建一个新文件,指定标注的位置和内容:

#!/usr/bin/env bash
gmt begin contour_annot8
gmt convert -i0,1,4 -Em150 transect.txt | gawk  '{print $1,$2,int($3)}' > fix2.txt
gmt coast -R50/160/-15/15 -JM5.3i -Gburlywood -Sazure -A500
gmt grdcontour geoid.nc -B20f10 -BWSne -C10 -A20+d+u" m"+f8p -Gl50/10S/160/10S -S10 -T+l
gmt plot -Sqffix2.txt:+g+an+p+Lf+u" m"+f8p -Wthick transect.txt
gmt end show
../_images/39ee94a600d54d5c989d92c5be3b0f4b.png

标注的位置和内容来自不同的数据集

综合实例

最后,采用之前章节中论述的多个标注位置确定方法和属性设置,绘制了一幅比较复杂的综合性图件。假设在Canary Islands发生了灾难性滑坡,图件显示了所引发的的海啸的走时(以小时为单位)。根据海啸走时和海底地形绘制了彩图,对等值线和线条进行了标注。完整的脚本如下:

#!/usr/bin/env bash
gmt begin contour_annot_9
R=-R-85/5/10/55
gmt grdgradient @earth_relief_05m_g $R -Nt1 -A45 -Gtopo5_int.nc
gmt set FORMAT_GEO_MAP ddd:mm:ssF FONT_ANNOT_PRIMARY +9p FONT_TITLE 22p
gmt project -E-74/41 -C-17/28 -G10 -Q > great_NY_Canaries.txt
gmt project -E-74/41 -C2.33/48.87 -G100 -Q > great_NY_Paris.txt
km=$(echo -17 28 | gmt mapproject -G-74/41+uk -fg --FORMAT_FLOAT_OUT=%.0f -o2)
gmt makecpt -Clightred,lightyellow,lightgreen -T0,3,6,100 -N
gmt grdimage @App_O_ttt.nc -Itopo5_int.nc -C $R -JM5.3i -nc+t1
gmt grdcontour @App_O_ttt.nc -C0.5 -A1+u" hour"+v+f8p,Bookman-Demi \
	-GL80W/31N/17W/26N,17W/28N/17W/50N -S2
gmt plot -Wfatter,white great_NY_Canaries.txt
gmt coast -B20f5 -BWSne+t"Tsunami travel times from the Canaries" -N1/thick \
	-Glightgray -Wfaint -A500
gmt convert great_NY_*.txt -E | gmt plot $R -Sa0.15i -Gred -Wthin
gmt plot -Wthick great_NY_Canaries.txt \
	-Sqn1:+f8p,Times-Italic+l"Distance Canaries to New York = $km km"+ap+v
gmt plot great_NY_Paris.txt -Sc0.08c -Gblack
gmt plot -Wthinner great_NY_Paris.txt -SqD1000k:+an+o+gblue+LDk+f7p,Helvetica-Bold,white
cat << EOF | gmt text -Gwhite -Wthin -Dj0.1i -F+f8p,Bookman-Demi+j
74W	41N	RT	New York
2.33E	48.87N	CT	Paris
17W	28N	CT	Canaries
EOF
gmt end show
../_images/bcdf48b16498f8b0de8dd5480ef351db.png

Canary Islands到大西洋沿岸的海啸走时图,特别是纽约。当发生灾难性滑坡时,纽约将在8小时后遭遇大海啸。