地理坐标转换 - 地理信息系统(3)
在百度地圖中,地址“哈爾濱市道里區通達街138號”的經緯度解析為(126.616759, 45.74989),而在高德地圖中,相同地址的經緯度則解析為(126.609207, 45.740142)。原因是百度和高德采用的地理坐標系統不同。
本文介紹國內常用網絡地圖API坐標系統特點,并提供不同坐標間的批量轉換解決方案。
一、常用地理坐標體系及分類
地理數據的坐標系一般有兩大類,一是地理坐標系(GCS)、是經緯度單位的橢球坐標系;二是投影坐標系(PCS)、是平面直角坐標系。
投影坐標系(PCS)的定義一般會包含兩方面的定義信息:
基準面/Datum — 與GCS相應 投影方法/Projection Method1、WGS-84原始坐標體系
WGS-84坐標體系又稱世界大地坐標系或地球坐標。
國際通用標準,規定GPS 設備中取出的原始數據應該是地球坐標。
“ 世界大地坐標系是美國國防部制圖局(Defence Mapping Agency, DMA)為統一世界大地坐標系統,實現全球測量標準的一致性,定義用于制圖、大地、導航的坐標基準。它包括標準地球坐標框架、用于處理原始觀測數據的標準橢球參考面(即基準和參考橢球)和定義標準海平面的重力等勢面(大地水準面)。
定義一個坐標系絕對是一個復雜浩大的數學工程。 我們經常聽說的 WGS 1984 (或 WGS 84)就是其中一個世界大地坐標系統。我們經常使用的 GPS 的坐標參考系統也是它。一般用國際標準的GPS記錄儀記錄下來的坐標,都是GPS的坐標。很可惜,在中國,任何一個地圖產品都不允許使用GPS坐標,據說是為了保密。
WGS 1984 是一個長半軸(a)為6378137,短半軸(b)為6356752.314245179 的橢球體,扁率(f)為298.257223563,\(f=\frac{a-b}{a}\)。
2、GCJ-02坐標體系
GCJ-02國測局2002年發布的坐標體系,又稱“火星坐標”。適用于國內,國內地圖供應商基本使用該坐標系對位置進行加密。在中國,很多時候必須使用GCJ-02的坐標體系。比如谷歌,騰訊,高德都在用這個坐標體系。GCJ-02也是國內最廣泛使用的坐標體系。
火星坐標系統的原理是這樣的:國測局開發了一個系統,能將實際的坐標轉換成虛擬的坐標。所有在中國銷售的數字地圖必須使用這個系統進行坐標轉換之后方可上市。這是生產環節,這種電子地圖被稱為火星地圖。在使用環節,GPS終端設備必須集成國測局提供的加密算法,把從GPS衛星那里得到的坐標轉換成虛擬坐標,然后再去火星地圖上查找,這樣就在火星坐標系上完成了地圖的匹配。推出這個系統的名義是為了國家安全。然后呢,可以收取一定的費用。
3、其它坐標體系
一般都是由GCJ-02進過偏移算法得到的。這種體系就根據每個公司的不同,坐標體系都不一樣了。比如,百度和搜狗就使用自己的坐標體系,與其他坐標體系不兼容。
互聯網在線地圖使用的坐標系
火星坐標系:
iOS 地圖(其實是高德) Gogole地圖 騰訊搜搜地圖 阿里云地圖 高德地圖 搜狐搜狗地圖百度坐標系:
當然只有百度地圖WGS84坐標系(GPS原始坐標系):
國際標準,谷歌國外地圖、osm地圖等國外的地圖二、地理坐標系與投影原理
地理坐標系(Geographic Coordinate System),是使用三維球面來定義地球表面位置,以實現通過經緯度對地球表面點位引用的坐標系。一個地理坐標系包括角度測量單位、本初子午線和參考橢球體三部分。
地理坐標系為球面坐標。 參考平面地是橢球面,坐標單位為經緯度;投影坐標系為平面坐標。參考平面地是水平面,坐標單位為米、千米等;地理坐標轉換到投影坐標的過程可理解為投影。(投影:將不規則的地球曲面轉換為平面)。
1、地理坐標
地理坐標系可以確定地球上任何一點的位置。首先將地球抽象成一個規則的逼近原始自然地球表面的橢球體,稱為參考橢球體,然后在參考橢球體上定義一系列的經線和緯線構成經緯網,從而達到通過經緯度來描述地表點位的目的。需要說明的是經緯地理坐標系不是平面坐標系,因為度不是標準的長度單位,不可用其直接量測面積長度。
經緯度通常分為天文經緯度、大地經緯度和地心經緯度。常用的經度和緯度是從地心到地球表面上某點的測量角。通常以度或百分度為單位來測量該角度。
在球面系統中,位于兩極點中間的緯線稱為赤道。它定義的是零緯度線。零經度線稱為本初子午線。對于絕大多數地理坐標系,本初子午線是指通過英國格林尼治的經線。其他國家/地區使用通過伯爾尼、波哥大和巴黎的經線作為本初子午線。經緯網的原點 (0,0) 定義在赤道和本初子午線的交點處。這樣,地球就被分為了四個地理象限,它們均基于與原點所成的羅盤方位角。南和北分別位于赤道的下方和上方,而西和東分別位于本初子午線的左側和右側。
通常,經度和緯度值以十進制度為單位或以度、分和秒 (DMS) 為單位進行測量。緯度值相對于赤道進行測量,其范圍是 -90°(南極點)到 +90°(北極點)。經度值相對于本初子午線進行測量。其范圍是 -180°(向西行進時)到 180°(向東行進時)。如果本初子午線是格林尼治子午線,則對于位于赤道南部和格林尼治東部的澳大利亞,其經度為正值,緯度為負值。
2、投影坐標
將球面坐標轉化為平面坐標的過程便稱為投影。
投影坐標系在二維平面中進行定義。與地理坐標系不同,在二維空間范圍內,投影坐標系的長度、角度和面積恒定。投影坐標系始終基于地理坐標系,而后者則是基于球體或旋轉橢球體的。在投影坐標系中,通過格網上的 x,y 坐標來標識位置,其原點位于格網中心。每個位置均具有兩個值,這兩個值是相對于該中心位置的坐標。一個指定其水平位置,另一個指定其垂直位置。這兩個值稱為 x 坐標和 y 坐標。采用此標記法,原點坐標是 x = 0 和 y = 0。
在等間隔水平線和垂直線的格網化網絡中,中央水平線稱為 x 軸,而中央垂直線稱為 y 軸。在 x 和 y 的整個范圍內,單位保持不變且間隔相等。原點上方的水平線和原點右側的垂直線具有正值;下方或左側的線具有負值。四個象限分別表示正負 X 坐標和 Y 坐標的四種可能組合。在地理坐標系中處理數據時,有時用 X 軸表示經度值并用 Y 軸表示緯度值很有用。
3、墨卡托投影坐標
墨卡托投影,是正軸等角圓柱投影。由荷蘭地圖學家墨卡托(G.Mercator)于1569年創立。假想一個與地軸方向一致的圓柱切或割于地球,按等角條件,將經緯網投影到圓柱面上,將圓柱面展為平面后,即得本投影。墨卡托投影在切圓柱投影與割圓柱投影中,最早也是最常用的是切圓柱投影。
假設地球被圍在一中空的圓柱里,其基準緯線與圓柱相切(赤道)接觸,然后再假想地球中心有一盞燈,把球面上的圖形投影到圓柱體上,再把圓柱體展開,這就是一幅選定基準緯線上的“墨卡托投影”繪制出的地圖。 墨卡托投影沒有角度變形,由每一點向各方向的長度比相等,它的經緯線都是平行直線,且相交成直角,經線間隔相等,緯線間隔從基準緯線處向兩極逐漸增大。墨卡托投影的地圖上長度和面積變形明顯,但基準緯線處無變形,從基準緯線處向兩極變形逐漸增大,但因為它具有各個方向均等擴大的特性,保持了方向和相互位置關系的正確。在地圖上保持方向和角度的正確是墨卡托投影的優點,墨卡托投影地圖常用作航海圖和航空圖,如果循著墨卡托投影圖上兩點間的直線航行,方向不變可以一直到達目的地,因此它對船艦在航行中定位、確定航向都具有有利條件,給航海者帶來很大方便。
墨卡托投影坐標系取零子午線或自定義原點經線(L0)與赤道交點的投影為原點,零子午線或自定義原點經線的投影為縱坐標X軸,赤道的投影為橫坐標Y軸,構成墨卡托平面直角坐標系。
三、地理坐標轉換
當您獲得的經緯度坐標和使用的地理信息系統不一致時,如使用的是百度地圖,但經緯度數據卻不是百度經緯度,這時必須首先將其它經緯度坐標系轉換為百度坐標系,反之亦然。
1、火星坐標轉百度坐標
屬于火星坐標的地理信息系統主要有高德、Gogole地圖、搜搜地圖等。
火星坐標:?經度??緯度??坐標轉換 百度坐標:?經度??緯度?注:輸入火星坐標經緯度,點擊“坐標轉換”按鈕,可獲得百度經緯度。火星坐標經緯度(126.609207, 45.740142)樣例
代碼樣例
注:代碼樣例代碼摘自百度地圖API示例文檔
2、GPS原始坐標轉百度坐標
原始坐標:?經度??緯度??坐標轉換 百度坐標:?經度??緯度?注:代碼樣例和火星坐標轉百度坐標代碼相同,最后一行代碼修改為:
“convertor.translate(pointArr, 1, 5, translateCallback)”
3、火星坐標轉和GPS原始坐標批量轉百度坐標
[[116.307852,40.057031],[116.313082,40.047674],[116.328749,40.026922],[116.347571,39.988698],[116.316163,39.997753],[116.345867,39.998333],[116.403472,39.999411],[116.307901,40.05901]]火星坐標??原始坐標 ????
注:按數組格式批量添加經緯度,然后運行“批量坐標轉換”按鈕。每次最多轉換10組經緯度
代碼樣例
注:代碼樣例代碼摘自百度地圖API示例文檔
4、百度經緯度批量轉換為墨卡托坐標
[[116.307852,40.057031],[116.313082,40.047674],[116.328749,40.026922],[116.347571,39.988698],[116.316163,39.997753],[116.345867,39.998333],[116.403472,39.999411],[116.307901,40.05901]]?
在百度地圖API中,墨卡托坐標(平面坐標)是以最大級別18級為基準的。在18級條件下,平 面坐標的一個單位就代表了屏幕上的1個像素。平面坐標與地圖所展示的級別沒有關系,也就是說在1級和18級下,天安門位置的平面坐標都是一致的。
分級地圖展示示例如下:
初始化展示中心點經度??緯度? ?級別?123456789101112131415161718注:在級別下拉框中選擇1-18級觀察地圖變化效果
5、墨卡托坐標批量轉換為百度經緯度
[[12947471.74,4846477.11],[12948053.94,4845121.73],[12949798.01,4842116.43],[12951893.28,4836583.24],[12948396.92,4837893.73],[12951703.59,4837977.68],[12958116.22,4838133.71],[12947477.19,4846763.79]]?
百度經緯度轉換為摩卡托
var pt = new BMap.Point(116.316163,39.997753); var projection = map.getMapType().getProjection(); var worldCoordinate = projection.lngLatToPoint(pt);worldCoordinate.x和worldCoordinate.y就是平面(墨卡托)坐標的x和y。
摩卡托轉換為百度經緯度
var xy = new BMap.Pixel(12948396.92,4837893.73); var projection = map.getMapType().getProjection(); var LngLat = projection.pointToLngLat(xy);LngLat.lng和LngLat.lat就是經緯度。
6、百度地圖API的像素坐標
平面坐標系的原點與經緯度的原點一致,即赤道與0度經線相交的位置。對于地球上某一個固定的點(如天安門:經度116.403875、緯度39.915168),在不同級別地圖圖片上該點到平面坐標原點的像素坐標是不同的。在第18級下,直接將平面坐標向下取整就得到了像素坐標,而在其他級別下可以通過如下公式進行換算(這里取整為向下取整):
\[像素坐標 = |平面坐標\times 2^{zoom - 18}|\]
例如,經過計算,在第4級天安門位置的像素坐標是:790, 294。
天安門的經度為116.403875、緯度為39.915168,轉換為墨卡托坐標為X=12958161.09、Y=4825948.05。
在第18級地圖中,直接將平面坐標向下取整就得到了像素坐標,即(12958161,4825948)。
在第4級地圖中,
\[像素坐標X = |12958161.09\times 2^{4 - 18}| = |790.9034|=790\]
\[像素坐標Y = |4825948.05\times 2^{4 - 18}| = |295.5525|=294\]
注:計算結果向下取整
7、百度地圖API的圖塊坐標
百度地圖API在展示地圖時是將整個地圖圖片切割成若干圖塊來顯示的,當地圖初始化或是地圖級別、中心點位置發生變化時,地圖API會根據當前像素坐標計算出視野內需要的圖塊坐標(也叫圖塊編號),從而加載對應的圖塊用以顯示地圖。通常,百度地圖分辨率越高、顯示級別越大,需要的地圖圖片就越多。
百度地圖的圖塊坐標原點與平面坐標一致,從原點向右上方開始編號為0, 0:
如何知道某個位置的圖塊坐標呢?通過如下公式計算即可(這里為向下取整):
圖塊坐標 = |像素坐標 ÷ 256|256實際上是每個圖塊的像素寬度和高度,我們用像素坐標除以這個數就知道圖塊坐標了。
還以天安門為例,在第4級下天安門所在的圖塊編號為(3,1):
\[圖塊坐標X = |790 ÷ 256| = |3.086| = 3 (px)\]
\[圖塊坐標Y = |294 ÷ 256| = |1.1484| = 1 (px)\]
而在第18級下,圖塊編號為(50617, 18851)
\[圖塊坐標X = |12958161 ÷ 256| = |50617.82| = 50617 (px)\]
\[圖塊坐標Y = |4825948 ÷ 256| = |18851.36| = 18851 (px)\]
8、運用Javascript函數進行坐標批量轉換
前面給出的國測局坐標(火星坐標,GCJ02)、和GPS坐標(原始坐標,WGS84)轉換為百度坐標(BD09)的方法由百度地圖API提供。下面的Javascript代碼可以更方便地進行不同坐標系的轉換。項目細節參考GitHub地址:https://github.com/wandergis/coordtransform。
[[116.307852,40.057031],[116.313082,40.047674],[116.328749,40.026922],[116.347571,39.988698],[116.316163,39.997753],[116.345867,39.998333],[116.403472,39.999411],[116.307901,40.05901]]由?火星坐標(GCJ02)原始坐標(WGS84)百度坐標(BD09)?轉換為??
注:按數組格式批量添加經緯度,選擇相互轉換的坐標,然后運行“批量坐標轉換”按鈕。每次轉換數量不受限制,可進行大批量地址轉換。
本文提供的各種坐標轉換工具僅用于個人學習或教學研究用途,不支持大批量商業用途坐標轉換(由于百度地圖key的限制)。
轉載于:https://www.cnblogs.com/cloudtj/p/7128537.html
總結
以上是生活随笔為你收集整理的地理坐标转换 - 地理信息系统(3)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: dya-11(周一)新的知识点
- 下一篇: ERP流程二 实体类大全