PROJ.4學習——地圖投影(坐標系投影)
前言
PROJ是由大量的基礎投影庫構成。這里主要討論學習PROJ庫的相關參數。
這里大部分是講如何將3D坐標系投影到2D平面上。投影時,涉及到基准線,單位,比例英子,偏移量,軸轉換等。
很多實際操作中卻涉及到3D坐標系轉換為其他3D坐標系(下一篇更新)。
參數列表
下面是可以應用於大多數坐標系定義的PROJ參數列表。此表不嘗試描述特定於特定投影類型的參數。
參數 | 描述 |
+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.dat 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.dat 標紅處是我安裝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開關中的軸的組合來翻轉軸。值分別是:
- "e" - Easting
- "w" - Westing
- "n" - Northing
- "s" - Southing
- "u" - Up
- "d" - Down
其組合格式如下:
- +axis=enu easting,northing,up - 默認值。
- +axis=neu northing,easting, up - 適用於“lat/long”地理坐標,或向南橫向墨卡托。
- +axis=wnu westing,northing,up - 有些具有“西正”坐標的行星坐標系。
注意 +axis不適用與 proj 命令,只適用於 cs2cs 命令(3D投影到2D上面是不行的,只能是3D坐標系轉其他3D坐標系)。