Skip to content

Latest commit

 

History

History
306 lines (212 loc) · 16.6 KB

making_first_map.rst

File metadata and controls

306 lines (212 loc) · 16.6 KB

製作第一張地圖

說到 GMT 中最簡單的繪圖指令,那非 pscoast 莫屬。在本章中,我們要來解說如何用 pscoast 製作海岸線地圖、GMT 本身的參數輸入風格,以及如何調整這些參數。

目標

製作一張群島海 (Archipelago Sea) 的地圖,如下圖所示。群島海位於北歐,是波羅的海的一個附屬海,海如其名,被大小不等的眾多島嶼給佔據。事實上,群島海很有可能是擁有最多島嶼的海,雖然大部分的島都很小就是了。西邊的最大島嶼叫做奧蘭島 (Åland),屬於芬蘭下轄的自治區。這麼多島嶼的地方,用來觀察 pscoast 的各種調整效果再適合不過了。

making_first_map/archi_sea.png

直接觀看指令稿

使用的指令與概念

  • pscoast - 繪製海岸線
  • GMT 共用選項:-B -J -P -R -U
  • GMT 的命令列參數調整
  • 調整地圖邊框的簡單方法
  • GMT 的輸出與轉存

操作流程

繪製地圖的第一步,是決定我們繪製的地區。雖然我們已經知道要畫的是群島海了,但沒有詳細的經緯度是不行的。最方便取得經緯度的作法,就是去 Google Map 網站,搜尋 Archipelago Sea,然後視窗就會移到這片海域的附近。以右鍵在你想要當作地圖邊界的區域底點一下,選「這是哪裡?」,底下就會出現點選區域的名稱和經緯度。

making_first_map/making_first_map_fig1.png

注意一下經緯度的表示法,跳出來的視窗中有兩個數字,第一個 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 看圖軟體`來打開此檔案了:

making_first_map/making_first_map_fig2.png

為方便閱讀,上圖已旋轉到北方朝上的角度,實際上的出圖應該會是直向的。不管怎麼說,這張圖看來幾乎完全不像目標區域的實際樣子,那是因為它只使用了最低限度的參數,尤其是海岸線的數據看起來太過粗糙了。現在我們要來加上一些額外的參數,讓畫出的地圖更能描述實際情況。首先先來為陸地和海洋加上顏色,使用的分別是 -G (Ground) 和 -S (Sea) 選項。

$ pscoast -R19.42/22.95/59.71/60.56 -JM6i -W0.1p,black -Gdarkseagreen2 -Scornflowerblue > archi_sea.ps

darkseagreen2cornflowerblue 都跟 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 檔就如下所示

making_first_map/making_first_map_fig3.png

由此可見,光是調整海岸線解析度,以及陸地與海洋的顏色,整張圖就會與脫胎換骨。

接下來,或許你已經注意到,每次出圖時,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 這個標題。畫出來的樣子如下所示:

making_first_map/making_first_map_fig4.png

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

島嶼比較少,看起來清爽多了,卻又不會喪失「群島海」名稱的霸氣。

making_first_map/making_first_map_fig5.png

我們的地圖目前已大致完成。最後,可以再使用 -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。」

觀看最終版地圖

習題

  1. 畫出蘇拉威西島 (Sulawesi) 的海岸線圖。蘇拉威西島是印尼第四大島,外觀非常有趣,像是字母 K 或是正在跳舞的人。座標可使用 118.34E 至 125.70E,以及 6.12S 至 2.08N