說到 GMT 中最簡單的繪圖指令,那非 pscoast
莫屬。在本章中,我們要來解說如何用 pscoast
製作海岸線地圖、GMT 本身的參數輸入風格,以及如何調整這些參數。
製作一張群島海
(Archipelago Sea) 的地圖,如下圖所示。群島海位於北歐,是波羅的海的一個附屬海,海如其名,被大小不等的眾多島嶼給佔據。事實上,群島海很有可能是擁有最多島嶼的海,雖然大部分的島都很小就是了。西邊的最大島嶼叫做奧蘭島 (Åland),屬於芬蘭下轄的自治區。這麼多島嶼的地方,用來觀察 pscoast
的各種調整效果再適合不過了。
直接觀看指令稿
pscoast
- 繪製海岸線- GMT 共用選項:
-B
-J
-P
-R
-U
- GMT 的命令列參數調整
- 調整地圖邊框的簡單方法
- GMT 的輸出與轉存
繪製地圖的第一步,是決定我們繪製的地區。雖然我們已經知道要畫的是群島海了,但沒有詳細的經緯度是不行的。最方便取得經緯度的作法,就是去 Google Map 網站,搜尋 Archipelago Sea,然後視窗就會移到這片海域的附近。以右鍵在你想要當作地圖邊界的區域底點一下,選「這是哪裡?」,底下就會出現點選區域的名稱和經緯度。
注意一下經緯度的表示法,跳出來的視窗中有兩個數字,第一個 59.865253 是緯度,正值表示北緯,負值表示南緯。而第二個 19.435697 是經度,正值表示東經,負值表示西經。另外,這裡也不採用「度分秒」的角度格式,而是把所有零頭都歸到「度」後的小數點。這種格式比較容易進行數學運算,所以也是 GMT 預設採用的座標標示法。
查看一番後,這裡我們選擇經度從 19.42 到 22.95,緯度從 59.71 到 60.56 的這塊區域來畫圖。你也可以自由選擇你喜歡的區域。接著打開:ref:`終端機`,輸入如下指令:
$ pscoast
會看到一連串的說明,pscoast
的全部語法和選項都會列在上面。如果你對選項的意思很熟,只是要確認一下的話,你也可以改成這樣輸入,如此一來,就只有選項用法的部份會顯示在螢幕上。
$ pscoast -
幾乎所有 GMT 的指令,包含 pscoast
,都是以類似如下的語法操作:
$ 指令 (輸入檔) [選項1 選項2 選項3...]
所有以負號 (-) 開頭的文字,程式都會解讀成選項,而不是負號開頭的東西,就會是輸入檔。通常每個指令都會有一兩個必填的選項,而其他的選項如果沒指定的話,就會使用預設值。輸入檔和選項的先後次序,對 GMT 而言是沒差的,你也可以打完所有選項後,再打上輸入檔的名字。
不過 pscoast
這個指令稍微特別一點點,它不用給定輸入檔!這樣程式要怎麼知道海岸線位在哪呢?原來,GMT 的標準安裝內,已經有附上一個稱為 GSHHG
的資料庫,這個資料庫內含有許多世界的基本資料,像是海岸線、國界、河流等等的位置,而 pscoast
做的事情,就是從這個資料庫裡面讀取資料,畫到地圖上。因此精確說來, pscoast
不僅能畫海岸線,也可以畫河流、國界等等的特徵。不用給定輸入檔,我們只要專心在設定參數上就行了!第一個參數當然就是地圖的座標,是透過 -R
(Region) 選項來設定的,選項值直接打在 -R
後方,不需要空格隔開。一般來說,
-R
選項有兩種給定方法:
-R19.42/22.95/59.71/60.56
-R19.42/59.71/22.95/60.56r
第一種格式為 西邊界/東邊界/南邊界/北邊界
,也就是由 x 座標 (經度) 和 y 座標 (緯度) 的範圍來指定。第二種格式使用時,要在最後面加上 r
,這樣子四個欄位就會是
左下角經度/左下角緯度/右上角經度/右上角緯度
。以上兩行實際執行時,效果會一模一樣。這裡我們來採用第一種格式試試看,在命令行輸入以下指令然後執行看看:
$ pscoast -R19.42/22.95/59.71/60.56
pscoast: Syntax error: Must specify a map projection with the -J option
pscoast: Syntax error: Must specify at least one of -C, -G, -S, -I, -N, -Q and -W
馬上就會出現錯誤,問題出在我們還有一些選項沒有給定。對於一張地圖來說,除了邊界以外,第二重要的就是投影法了。GMT 中以 -J
設定投影法,有五花八門的樣式可供選擇,這裡我們來選個在畫小範圍地圖時很常用的麥卡托投影法來看看。輸入以下指令:
$ pscoast -R19.42/22.95/59.71/60.56 -JM6i
在 -J
後面的 M
為麥卡托投影的代號,6i
代表地圖橫向的寬度為 6 英吋 (inch)。如果你對英吋有多長不熟,也可以換成 -JM15c
,代表地圖橫向的寬度為 15 公分 (cm),差不多就是 6 吋的長度。
Attention!
-J
和 -R
具有連動關係,也就是說在不同投影法之下,給定地圖邊界和尺寸的方法與參數輸入模式會有點不同,請參閱GMT 官方說明或之後的章節。有關於各種投影法的適用情形,請參閱之後的章節,或地理資訊系統與測地學專書的介紹。另外,GMT 預設的大地座標系統是
WGS84 參考橢球,如欲調整此設定,也請參閱之後的章節。
接下來還有一個錯誤要處理,這是有關「繪圖樣式」的設定。GMT 要求我們至少給定一種繪圖樣式,我們先使用 -W
以指定海岸線的畫筆屬性。畫筆具有三種屬性:粗細、顏色跟樣式,給定的語法是
-W粗細,顏色,樣式
如果省略時,就使用預設的樣式作圖。我們試著指定指定畫筆粗細為 0.1 點 (1 點 = 1/72 英吋 = 0.03527 公分) 的黑色線條看看:
$ pscoast -R19.42/22.95/59.71/60.56 -JM6i -W0.1p,black
0.1p
代表的就是 0.1 點,black
就是黑色,顯而易見的我們沒有指定線條樣式,程式就會以預設的實心線條作圖。值得一提的還有,我們在這裡使用了 GMT 預先定義的顏色名字,這些名字可以在這裡查詢。
Note
有關畫筆的進階樣式設定,例如設定線條樣式、利用 RGB 值自訂顏色等,會在「:doc:`pen_and_painting`」詳加描述。
目前已經設定了三個選項,pscoast
已經可以正常執行了。輸入以上指令,如果你看到類似如下畫面:
$ pscoast -R19.42/22.95/59.71/60.56 -JM6i -W0.1p,black
%!PS-Adobe-3.0
%%BoundingBox: 0 0 595 842
%%HiResBoundingBox: 0 0 595 842
%%Title: GMT v5.1.1 (r12968) [64-bit] Document from pscoast
%%Creator: GMT5
..... #(太長了,中略)
end
%%EOF
那就表示地圖已經成功產生了!但嚴格來說,GMT 產生的不是地圖,而是一長串以PostScript 語言描述的程式碼。我們得把這些程式碼另存成文字檔,然後再找個能夠解讀此種語言的軟體開啟才行。另存新檔的動作,可以透過 UNIX 系統很常見的 I/O 重導向指令,也就是 >
,來達成:
$ pscoast -R19.42/22.95/59.71/60.56 -JM6i -W0.1p,black > archi_sea.ps
最後面的 > archi_sea.ps
是把剛才的純文字輸出轉存到 archi_sea.ps
中,.ps
是這種檔案的常見副檔名。現在就可以用任何一種 :ref:`PostScript 看圖軟體`來打開此檔案了:
為方便閱讀,上圖已旋轉到北方朝上的角度,實際上的出圖應該會是直向的。不管怎麼說,這張圖看來幾乎完全不像目標區域的實際樣子,那是因為它只使用了最低限度的參數,尤其是海岸線的數據看起來太過粗糙了。現在我們要來加上一些額外的參數,讓畫出的地圖更能描述實際情況。首先先來為陸地和海洋加上顏色,使用的分別是 -G
(Ground) 和 -S
(Sea) 選項。
$ pscoast -R19.42/22.95/59.71/60.56 -JM6i -W0.1p,black -Gdarkseagreen2 -Scornflowerblue > archi_sea.ps
darkseagreen2
和 cornflowerblue
都跟 black
一樣,是 GMT 預先設定的顏色名字。可以看得出來現在指令已經有點長了,這是 GMT 的常態,尤其會在你嘗試調整預設值、畫出更漂亮的地圖時發生。在命令列操作時,這不是什麼大問題,終端機都會自動幫你換行,不過之後如果有要寫 GMT 腳本的需求,為了排版美觀,可以使用 UNIX 常見的接續符號 \
,換行繼續輸入指令。以下指令跟上面的指令效果一模一樣:
$ pscoast -R19.42/22.95/59.71/60.56 -JM6i -W0.1p,black -Gdarkseagreen2 \
-Scornflowerblue > archi_sea.ps
本文為了方便閱讀起見,也會使用 \
分隔過長的段落,但如果你想要在一行之內完成此道指令,則可以省略這個符號。
接下來我們要調整海岸線的解析度。由於有些島真的很小,我們可能要用最高等級解析度的海岸線資料,這些小島才會呈現在地圖上。pscoast
控制輸入資料解析度的選項是 -D
,接受的設定值有 f
(full,完整)、h
(high,高)、i
(intermediate,中)、l
(low,低) 和 c
(crude,粗糙),預設值是
l
。這裡我們要用最高等級的解析度,也就是 -Df
:
$ pscoast -R19.42/22.95/59.71/60.56 -JM6i -W0.1p,black -Gdarkseagreen2 \
-Scornflowerblue -Df > archi_sea.ps
畫出來的 .ps 檔就如下所示
由此可見,光是調整海岸線解析度,以及陸地與海洋的顏色,整張圖就會與脫胎換骨。
接下來,或許你已經注意到,每次出圖時,ps 檔總是會有一大塊空白的區域。這是因為 GMT 的運作機制並不是「產生地圖的影像檔」,而是「把地圖印在固定大小的版面上」。如果我們不做任何調整,GMT 的預設版面大小是橫向 A4 紙張,因此,配上我們約 15 公分的地圖,會有很大一塊留白是必然的。這裡我們暫時不對版面大小做任何調整,但由於很多的 ps 檔看圖軟體的預設版面都是直向紙張,所以輸出的地圖就會像上面一樣,不是以最「通俗」(北方朝上) 的方向呈現。為了讓我們操作時更方便一點,我們可以加上 -P
選項,命令 GMT
把地圖畫在直向 (Portrait) A4 紙張上。
$ pscoast -R19.42/22.95/59.71/60.56 -JM6i -W0.1p,black -Gdarkseagreen2 \
-Scornflowerblue -Df -P > archi_sea.ps
Tip
要更改紙張大小的話,得先了解 gmtdefaults
的相關設定。同樣的,從 gmtdefaults
中,也可以調整預設紙張的方向,這樣就不用每次都加 -P
了。與版面設定相關的教學,請看之後的章節。
目前主圖大致上都完成,剩下邊框需要加入。GMT 使用 -B
選項設定地圖的邊框與附屬要件,如格線、座標標誌、底色、標題等等,合起來稱為底圖 (Basemap) 設定。-B
選項是 GMT 中最複雜的選項之一,
有著五花八門的樣式組合可供選擇。這邊我們先講最簡單的兩種組合
-Ba座標數值間隔f座標刻度間隔g格線間隔
-B地圖四邊設定+t標題
第一種組合可以給定地圖邊框的數值、刻度與格線設定,而且使用與 -R
相同的座標單位,例如
-Ba1f1g1
代表數值、刻度與格線都是每隔 1 度畫一條,而 -Ba2f1
是「每隔 2 度標示座標、每隔 1 度標示刻度,然後不加格線」。第二種組合可以調整地圖的四邊配置,使用 W、S、E、N 來表示東、南、西、北,大寫表示加上邊框也加上數值,小寫表示只加上邊框而不加數值,如果不加就是不畫邊框。例如
-Bwsne
就是單純畫上邊框,不加上數值顯示 (前面的 a 設定會無效),而 -BWSe
則代表「在西方與南方畫邊框且標上數值、在東方單純畫邊框、在北方什麼都不做 (地圖上端會破一個洞)」。第二種組合可以透過 +t
來延伸,後方可以輸入此幅地圖的標題。兩種組合可以同時加在一個指令內,例如說我們的地圖如果這樣設計:
$ pscoast -R19.42/22.95/59.71/60.56 -JM6i -W0.1p,black -Gdarkseagreen2 \
-Scornflowerblue -Df -P -Ba2f0.5g1 -BWSne+t"Archipelago Sea" \
> archi_sea.ps
那麼,地圖四邊都會加上邊框,但只有西側和南側會標上經緯度,經緯度會以每 2 度標示一次,刻度 (黑白線區間) 以每 0.5 度標示一次,格線每 1 度就有一條,而且還會加上 Archipelago Sea 這個標題。畫出來的樣子如下所示:
Tip
事實上,-B
選項其實是另一個稱為 psbasemap
指令的精簡版。許多更複雜的邊框設定可以透過 psbasemap
來達成,如此一來,程式會先畫好邊框,我們再把其他圖層填到邊框內即可。有關進階的 -B
選項調整,像是自訂數值標記、各軸分開設定、主格線與次要格線、中文字標題與標記等等,
會在之後的章節說明。
你會發現,群島海的島實在太多,如果我們還想在上面標上其他資訊的話,這些群島很容易讓看地圖的人分心。為了精簡地圖,讓讀者聚焦在關鍵資訊上,pscoast
提供了 -A
選項,這個選項可以讓我們輸入島嶼面積 (單位是平方公里),然後 pscoast
會省略比這個面積還小的島嶼不畫。這裡我們要省略比 0.1 平方公里還小的島嶼:
$ pscoast -R19.42/22.95/59.71/60.56 -JM6i -W0.1p,black -Gdarkseagreen2 \
-Scornflowerblue -Df -P -Ba2f0.5g1 -BWSne+t"Archipelago Sea" \
-A0.1 > archi_sea.ps
島嶼比較少,看起來清爽多了,卻又不會喪失「群島海」名稱的霸氣。
我們的地圖目前已大致完成。最後,可以再使用 -U
選項在右下角加上 GMT 軟體的標誌。-U
選項和
-P
一樣,可以直接加在指令內,不用給定任何值。
本地圖的最終指令稿如下:
$ pscoast -R19.42/22.95/59.71/60.56 -JM6i -W0.1p,black -Gdarkseagreen2 \
-Scornflowerblue -Df -P -Ba2f0.5g1 -BWSne+t"Archipelago Sea" \
-A0.1 -U > archi_sea.ps
Note
「繪製海岸線圖 - 以 19.42E - 22.95E,59.71N - 60.56N 為邊界,麥卡托投影,地圖橫向寬 6 吋,海岸線的線條使用
0.1 點的黑色線,陸地使用 darkseagreen2
填色,海洋使用 cornflowerblue
填色,使用最高等級解析度的海岸線資料,直幅繪圖,四邊繪製邊框並在左側和下側標上刻度數值,數值間隔 2 度,刻度間隔 0.5 度,格線間隔 1 度,標題為 Archipelago Sea,存檔為 archi_sea.ps
。」
觀看最終版地圖
- 畫出蘇拉威西島 (Sulawesi) 的海岸線圖。蘇拉威西島是印尼第四大島,外觀非常有趣,像是字母 K 或是正在跳舞的人。座標可使用
118.34E 至 125.70E
,以及6.12S 至 2.08N
。