PROJ.4學習——地圖投影(座標系投影)linux
前言git
PROJ是由大量的基礎投影庫構成。這裏主要討論學習PROJ庫的相關參數。windows
這裏大部分是講如何將3D座標系投影到2D平面上。投影時,涉及到基準線,單位,比例英子,偏移量,軸轉換等。app
不少實際操做中卻涉及到3D座標系轉換爲其餘3D座標系(下一篇更新)。工具
參數列表學習
下面是能夠應用於大多數座標系定義的PROJ參數列表。此表不嘗試描述特定於特定投影類型的參數。spa
參數 | 描述 |
+a | 橢球體長半軸長度 |
+axis | 軸防線 |
+b | 橢球體短半軸長度 |
+ellps | 橢球體名稱,在cmd中輸入:proj -le 查看支持哪些橢球體 |
+k | 比例係數(比例因子),舊版本,不同意使用 |
+k_0 | 比例係數(比例因子) |
+lat_0 | 維度起點 |
+lon_0 | 中央經線 |
+lon_wrap | 中央經線的包裝參數(詳見下面的說明) |
+no_defs | 不要使用proj庫中的缺省定義文件。翻譯 在linux中路徑爲:/usr/share/proj/proj_def.dat3d windows中爲安裝路徑下的:E:\SvnWorkspace\LY_WEB_GIS\branches\Documents\ms4w-mapserver-for-wimdows\release-1911-x64-gdal-2-3-3-mapserver-7-2-1\bin\proj\SHARE\proj_def.datcode 標紅處是我安裝MapServer是自帶安裝Proj的路徑 |
+over | 容許經度輸出在-180到180範圍以外,禁用wrapping(詳見下面的說明) |
+pm | 備用本初子午線(一般是一個城市名稱,見下文) |
+proj | 投影名稱,在cmd中輸入:proj -l 查看數據支持 |
+units | 水平單位,meters(米)、 US survey feet, etc(英尺等 us-ft). |
+vunits | 垂直單位 |
+x_0 | 東(僞)偏移量 |
+y_0 | 北(僞)偏移量 |
units
可使用+units關鍵字指定水平單位,該關鍵字具備單位的符號名稱(如:+units=us-ft)。另外換算單位米能夠用+to_meter關鍵字(如:美國一英尺爲0.304800609601219米)。
在cmd中輸入: cs2cs -lu 或者 proj -lu 查看PROJ支持的單位。
下面來了解一下 +to_meter 關鍵字的使用
#在cmd中輸入:
cs2cs +proj=merc +lat_ts=56.5 +ellps=GRS80 +to +proj=utm +zone=32 +units=km
#再輸入參數 1699741.9 376042.8
#獲得 2594.43 715.50 0.00
#在cmd中輸入:
cs2cs +proj=merc +lat_ts=56.5 +ellps=GRS80 +to_meter=0.5 +to +proj=utm +zone=32 +units=km
#再輸入參數
3399483.80 752085.60
#獲得
2594.43 715.50 0.00
從兩個命令比較,第二個增長了 +to_meter=0.5
第二個參數範圍是第一個的兩倍
可是投影出來的位置倒是同一個
由於第二個在投影轉換是,將1米轉換爲了0.5倍,即範圍縮小了一半
因此獲得的結果是同樣的
一樣,垂直單位可使用 +vunits 關鍵字。若是沒有指定垂直單位,則垂直單位將默認與水平座標相同。
注意:proj根本不處理垂直單元,所以+vto_meter參數將被忽略。
能夠經過應用+k_0參數來縮放輸出單元。返回的座標(經緯度、米、公里等,按照定義的 +units 輸出)按使用+k_0參數分配的值進行縮放。
#tmerc 橫墨卡託高斯投影
proj +proj=tmerc +lat_0=0 +lon_0=-55.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs
#輸入
12.2 -58.5
#獲得
3664306.25 -8536230.41
東北(僞)偏移量
幾乎全部的座標系都容許存在一個假的東偏移 (+x_0)和一個假的北偏移 (+y_0)。請注意,這些值老是以米表示,即便座標系是其餘一些單位。有些座標系(如UTM)具備隱式的假東向和北向值。
經度覆蓋/邊界設置(Longitude Wrapping)
我把Wrap翻譯爲覆蓋或邊界,也不知道準確與否。
默認狀況下,PROJ將輸出經度覆蓋/邊界值在-180到180之間。可使用+over開關禁用在pj_inv()中較低級別執行的默認覆蓋/邊界。這對於等距圓柱投影特別有用,在等距圓柱投影中,X值通過-20000000(大體)後繼續通過-180,而不是覆蓋/邊界到+180。
可使用+lon_wrap選項在pj_transform()中提供一種進行經度邊界設置的替代方法。此選項的參數是一箇中心經度。因此+lon_wrap=180表示在0到360範圍內的經度。注意+over不會禁用+lon_wrap。
本初子午線Prime Meridian
本初子午線的定義是基於格林尼治的本初子午線與當前座標系統本初子午線之間的偏移量定義的(格林尼治的本初子午線是基準,設置 +pm=經度偏移量 表示當前座標系統的本初子午線;或者是一個符號名稱)。
如:EPSG:27500,它的本初子午線就是基於格林尼治的本初子午線加上西偏2.337208333333333構成
# ATF (Paris) / Nord de Guerre
<27500> +proj=lcc +lat_1=49.50000000000001 +lat_0=49.50000000000001 +lon_0=5.399999999999999 +k_0=0.99950908 +x_0=500000 +y_0=300000 +a=6376523 +b=6355862.933255573 +pm=2.337208333333333 +units=m +no_defs <>
再如:EPSG:27395,它的本初子午線就是一個符號定義
# NGO 1948 (Oslo) / NGO zone V
<27395> +proj=tmerc +lat_0=58 +lon_0=6.166666666666667 +k=1 +x_0=0 +y_0=0 +a=6377492.018 +b=6356173.508712696 +towgs84=278.3,93,474.5,7.889,0.05,-6.61,6.21 +pm=oslo +units=m +no_defs <>
當前子午線聲明只被pj_transform() API利用,而不被pj_inv()和pj_fwd()利用。所以用戶工具cs2cs遵照本初子午線參數,可是proj程序忽略它.
在cmd中輸入:cs2cs -lm 查詢支持的本初子午線
好比,使用的例子。在格林尼治基於lat/long座標的位置long=0, lat=0被轉換爲以馬德里爲本初子午線的lat/long座標。
#在cmd中輸入: cs2cs +proj=latlong +datum=WGS84 +to +proj=latlong +datum=WGS84 +pm=madrid #輸入參數 0 0 #獲得
3d41'16.58"E 0dN 0.000
軸方向切換
從PROJ 4.8.0開始,+axis參數可用於控制座標系的軸向。默認的方向是「向東,向北,向上」,可是方向能夠翻轉,或者使用+axis開關中的軸的組合來翻轉軸。值分別是:
其組合格式以下:
注意 +axis不適用與 proj 命令,只適用於 cs2cs 命令(3D投影到2D上面是不行的,只能是3D座標系轉其餘3D座標系)。