等值線標註和“線條標註”

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英寸放置一個標註:

#!/bin/bash
gmt begin contour_annot1 pdf,png
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
../_images/contour-annot-gmtplot-0.png

通過指定 -Gd 選項的參數,確定了標註的位置(等值線上相距1.5英寸的點)

給定標註個數

現在指定每條等值線上標註的個數。每條等值線上只放置1個標註,並且要求等值線的長度不小於1英寸,

#!/bin/bash
gmt begin contour_annot2 pdf,png
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
../_images/contour-annot-gmtplot-1.png

通過指定 -Gn 選項的參數,確定了標註的位置(每條長度超過1英寸的等值線的中心位置)

給定標註位置

給定標註所在位置的座標,由於座標不是嚴格位於等值線上,指定了非0距離值,即標註位置與等值線距離的上限。

根據等值線的幾何形狀,自動計算標註的角度。爲了幫助理解,通過指定選項 -A 中的 +d* 屬性,採用了debug模式,即在每個給定位置上繪製了一個小圓圈。

#!/bin/bash
cat << EOF > fix.txt
80      -8.5
55      -7.5
102     0
130     10.5
EOF
gmt begin contour_annot3 pdf,png
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
../_images/contour-annot-gmtplot-2.png

通過指定 -Gf 選項的參數,確定了標註的位置(等值線上與給定點距離最小的點)

線段與等值線交點處放置標註

通過指定 -Gl-GL 選項的參數來定義線段,將標註放置在直線段與等值線的交點。

#!/bin/bash
gmt begin contour_annot4 pdf,png
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
../_images/contour-annot-gmtplot-3.png

通過指定 -GL 選項的參數確定了標註的位置(大圓弧與等值線的交點)

圖中的標註位於數據極值點連線(Z-/Z+)與等值線的交點。圖中極值點連線爲兩點之間的大圓弧,在其與等值線交點位置處放置了標註。同一幅地圖中,可以分別指定多條線段。

廣義的線段與等值線相交算法

如果需要指定的與等值線相交的線段比較多,或線段數據來自其他數據集,可以使用廣義的相交算法確定標註的位置。多段數據文件 cross.txt 中定義了三條曲線,在這三條曲線與等值線交點位置處放置了標註,

#!/bin/bash
gmt begin contour_annot5 pdf,png
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
../_images/contour-annot-gmtplot-4.png

通過指定 -GX 選項的參數(多段數據文件 cross.txt ),確定了標註的位置

標註屬性實例

本節通過實例說明標註屬性的作用,採用 plot 繪製了大地水準面極值點之間的大圓弧,並且沿着該大圓弧從ETOPO5數據集中提取了高程數據。高程數據文件(transect.txt)中包括了 經度、緯度、距離、大地水準面、高程 數據。

按照沿大圓弧距離放置標註, 1

在本實例中將標註的走向從沿大圓弧改變爲跨大圓弧,並指定了不透明的文本框和輪廓線,增加了標註的可讀性。沿大圓弧每1000km放置一個標註,使用距離值作爲標註的內容。標註的方向與大圓弧垂直:

#!/bin/bash
gmt begin contour_annot6 pdf,png
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
../_images/contour-annot-gmtplot-5.png

通過指定 -Sq 選項的參數控制標註屬性.

圖中顯示了上述命令的綜合效果。值得注意的是,大圓弧的起點和終點沒有與表示極值點的”-“和”+”符號完全重合。造成這個現象的原因是,極值點符號”-“和”+”的座標是等值線的平均值,而不是全局或局部極值的位置。

按照沿大圓弧距離放置標註, 2

與上一個實例不同的是,本實例中標註與大圓弧平行,以弧度指定標註位置,並添加弧度單位。文本框的形狀爲圓角矩形,且標註內容與文本框的底色呈反色顯示。

#!/bin/bash
gmt begin contour_annot7 pdf,png
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
../_images/contour-annot-gmtplot-6.png

另一個標註屬性實例

使用不同數據集定義標註的內容和位置

本實例中採用沿大圓弧的海底地形數據作爲標註的內容,按照沿大圓弧的距離,每1500km放置一個標註。因此需要使用 awk 程序從 transect.txt 文件中抽取距離爲1500km倍數的記錄,並創建一個新文件,指定標註的位置和內容:

#!/bin/bash
gmt begin contour_annot8 pdf,png
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
../_images/contour-annot-gmtplot-7.png

標註的位置和內容來自不同的數據集

綜合實例

最後,採用之前章節中論述的多個標註位置確定方法和屬性設置,繪製了一幅比較複雜的綜合性圖件。假設在Canary Islands發生了災難性滑坡,圖件顯示了所引發的的海嘯的走時(以小時爲單位)。根據海嘯走時和海底地形繪製了彩圖,對等值線和線條進行了標註。完整的腳本如下:

#!/bin/bash
gmt begin contour_annot9 pdf,png
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/k -fg --FORMAT_FLOAT_OUT=%.0f -o2`
cat << EOF > ttt.cpt
0	lightred	3	lightred
3	lightyellow	6	lightyellow
6	lightgreen	100	lightgreen
EOF
gmt grdgradient @earth_relief_05m -R-85/5/10/55 -Nt1 -A45 -Gtopo5_int.nc
gmt grdimage ttt_atl.nc -Itopo5_int.nc -Cttt.cpt -R-85/5/10/55 -JM5.3i -nc+t1
gmt grdcontour ttt_atl.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 -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 -Wthinner great_NY_Paris.txt -SqD1000k:+an+o+gblue+LDk+f7p,Helvetica-Bold,white
cat << EOF | gmt text -Gwhite -Wthin -Dj0.1i/0.1i -F+f8p,Bookman-Demi+j
74W	41N	RT	New York
2.33E	48.87N	CT	Paris
17W	28N	CT	Canaries
EOF
rm topo5_int.nc
gmt end
../_images/contour-annot-gmtplot-8.png

Canary Islands到大西洋沿岸的海嘯走時圖,特別是紐約。當發生災難性滑坡時,紐約將在8小時後遭遇大海嘯。