MATLAB地圖工具箱學習總結(四)自定義投影
MATLAB地圖工具箱學習總結系列:
(一)從地圖投影說起
(二)大圓和恆向線
(三)地圖工具箱的基本知識
(四)自定義投影
這是本系列的最後一篇文章,準備給大家講講自定義投影怎麼做。在做這項作業的時候,自己也是花了不少時間,將所有地圖投影原始檔都看了一遍,簡單分析了一下原始碼,就開始著手修改了。雖然也曾畫出了一些奇形怪狀的“藝術品”,但最終還是找到了畫圖的一些訣竅,使得自定義出來的投影即使會有bug,但大體上還算能看得過去。
在這裡呢,我就想以最簡單的一個地圖投影原始檔開始介紹怎麼修改。
首先,讓我們找到自己MATLAB安裝目錄,依次點選toolbox->map->mapproj目錄,可以看到,裡面是各種各樣地圖投影的原始碼m檔案呢。
然後我們們就點開一個來看看。原始碼有複雜的,也有簡單的,這裡我們點開一個最簡單之一的程式碼看看:正射投影ortho
接下來就要簡單分析一下程式碼。
第一段主要是呼叫3個需要的函式,包括orthoDefault,orthoFwd,orthoInv,設定投影的基本型別,最後applyProjection根據投影的型別,進行投影。
所有的原始碼中都會有Default、Fwd、Inv三個函式。讓我們先看看Default函式。可以看到,傳入了一個mstruct,這個在第三篇中講到了,是投影的性質設定。這裡設定了幾個引數,其中fromDegrees設定了地圖投影顯示範圍,這裡緯度是從負無窮89度,經度是從-180度到180度。mapparallels則可以設定地圖的標準緯線。方位投影沒有標準緯線,因此我們看到這裡nparallels為0,mapparallels為空。
接下來的Fwd函式就是最重要的投影變換正解函式了。我們看到這個函式傳入了三個值,分別是我們剛剛設定好的mstruct,rng和az。方位投影大多使用球面極座標系。因此,rng和az的含義就很容易明白了,rng是天頂距,而az則是方位角。通過和書上正射投影的公式對比,可以發現兩者形式很相似,仔細分析便能明白,在MATLAB中,x和y與書上的xy正好相反,而這裡的a正是地球橢球體的半徑。這裡用到了一個函式ellipsoidprops,並不是MATLAB中可以找到的函式,那麼就應該是一個隱藏的函式。事實上,這個函式在各個投影中都會見到,而其真身則同樣在mapproj資料夾下,不過是在private資料夾中。但不管怎麼樣,現在可以推出,這個函式所獲得的第一個值為地球橢球體半徑。
Inv函式和Fwd函式相反,是投影變換的反解函式公式。在這裡可以不做修改。
這樣,當我們需要自定義投影的時候,只需要將投影公式替換Fwd中的公式即可。
接下來我們再開啟一個稍微複雜一點的看看:墨卡託投影mercator
我們將程式碼拉到最後,會發現和正射投影相比,這裡多了一個函式:deriveParameters。事實上,大多數的地圖投影原始檔都會帶這個函式,這個函式用來求一些需要的引數。我們看一下程式碼,這裡又用到了ellipsoidprops函式,但不同的是,這裡還有一個e,也許是離心率。因此我最終還是找到了這個函式的程式碼,看了一下。
從這段程式碼可以看出,a是橢圓的半長軸,ecc是橢圓的離心率。接下來的程式碼中有toRadians和convertlat,分別是角度轉弧度和緯度轉換。最終獲得了標準緯線的弧度值,並傳回Fwd中進行計算。接下來的步驟就和前面相似了。
需要注意的是,不同地圖投影中的Fwd函式傳入的值不同,有的是Lat和Lon,有的是lambda和phi,有的是rng和az,所以需要仔細確認到底傳入的是什麼值,再進行計算。
當公式寫完之後,需要將投影註冊,才能和其他的投影一樣進行顯示。這裡需要看maplist檔案。開啟後大家便會明白為什麼要這麼做了。
我們只需要仿照前面的格式,將我們投影的名稱、類別等四個引數設定好,再將我們自己的投影檔案儲存在mapproj資料夾下即可。為了驗證註冊成功,還可以和我第一篇說的那樣,在命令列輸入maps檢視最後是否有新增成功,然後就可以愉快地用自己的投影了。
當然,真正的自定義投影設定過程中可能還會有各種各樣的錯誤。所以大家只能不斷地修改引數,如果一個地圖模版不行,再換一個模版。在選擇自定義投影的模版時,一定要選擇相似的投影。現在我這裡展示的不過是一些簡單的投影檔案,可能只有50行左右的程式碼,而一些複雜的投影可能會有100-200行的程式碼量,因此分析起來還是會存在很多的困難。對於Fwd函式傳入的引數也一定要理解清楚究竟代表什麼意思,然後才能知道究竟計算什麼值,返回什麼值。
最後,再給大家分享幾個我自己做的自定義投影圖片。
桑遜投影:
烏爾馬耶夫投影:
金茲布林格投影:
三葉梅花投影:
除了MATLAB自帶的工具箱之外,還有一個m_map第三方工具箱可以用。只要細細研讀其幫助文件,即可畫出更多自己想要的地圖。在這裡就不一一介紹了。
隨著課程的結束,本系列關於MATLAB地圖投影的學習總結也就算完結了。在我的學習過程中,所能反饋的資訊不過是感覺自己需要彌補、擴充的知識點實在太多。即使是我現在所講述和介紹的一些方法技巧,還是能夠感受到很多地方自己仍然不懂。因此我的這四篇簡短的介紹中也會存在錯誤,倘若發現了錯誤,希望能夠告知,謝謝!
天靖居士
2016.5.16
PS:6.11免考95分~
8.17更新說明:具體程式碼請參考:https://git.oschina.net/kkyyhh96/MapProjectInMatlab
有關地圖工具箱其他文章,請參看:
MATLAB地圖工具箱學習總結系列:
(一)從地圖投影說起
(二)大圓和恆向線
(三)地圖工具箱的基本知識
(四)自定義投影