Android開發中,偶然發現,用百度地圖分享出來的經緯度資訊,再次用高德地圖、騰訊地圖開啟,會出現幾百米甚至幾公里的偏移。
借用網路相關評論 分享出來的明明是山,換個地圖開啟變成海了
。
一、現象
開啟百度地圖
:在地圖上選擇一個地點,檢視其經緯度座標。
這裡以我的老東家 網易北京研發中心
為例。
開啟百度地圖座標拾取系統
,搜尋框輸入 網易北京研發中心
,獲取經緯度座標為:116.282314,40.049229
。
開啟高德地圖
,高德地圖逆地理編碼系統。
將百度地圖座標拾取的經緯度資訊
填入高德地圖逆地理編碼系統
中,如下圖所示,可以看到定位地址大約出現了一公里的偏移
。
開啟騰訊地圖
,騰訊位置服務系統。
將百度地圖座標拾取的經緯度資訊
填入騰訊位置服務系統
中,如下圖所示,可以看到定位地址同樣出現了大約一公里的偏移,但騰訊地圖、高德地圖最終的定位位置保持一致
。
高德地圖座標拾取器
https://lbs.amap.com/demo/javascript-api/example/geocoder/regeocoding
百度地圖座標拾取器
http://api.map.baidu.com/lbsapi/getpoint/index.html
騰訊地圖座標拾取器
https://lbs.qq.com/getPoint/
猜想:
現象:
百度地圖
分享出來的經緯度資訊,用高德地圖、騰訊地圖
開啟出現了相同的偏移量
;但高德地圖、騰訊地圖
分享出來的經緯度資訊,兩者之前可以互相使用。
這裡猜測:
高德、騰訊地圖應該使用了同一套座標系統;百度地圖可能在該地圖的基礎上,使用了一套新的座標系統,對座標系主動進行了某種偏移操作。
二、座標系
分別查詢高德地圖、騰訊地圖、百度地圖三家的開發者平臺,發現:
高德地圖、騰訊地圖採用的是 GCJ02 座標系
;百度地圖採用了 BD09 座標系
;
那麼 GCJ02、BD09 座標系有什麼區別?
想要了解 GCJ02、BD09 座標系的區別,先了解一下國內主流的座標系型別。
目前國內主流的座標系型別有 WGS84、GCJ02、BD09
。
- WGS84
世界大地測量系統(World Geodetic System 1984)
是一種用於地圖學、大地測量學和導航(GPS全球定位系統)的大地測量系統標準。 - GCJ02
中國國家測量局02號標準(Guojia Cehui Ju 02)
,也稱為火星座標系
。是中國國家測繪局制訂的地理資訊系統的座標系統,是在 WGS84 經緯度的基礎上執行加密演算法而成
。因GPS得到的經緯度
直接在 GCJ02 座標系下會定位到錯誤的地點
,有種到了火星的感覺,因此在坊間也將 GCJ02 戲稱為火星座標系
。 - BD09
百度座標系
,百度在GCJ02座標系基礎上再次加密而成
。
國內主流地圖預設採用的座標系?
瞭解了各座標系的大概定義,那麼目前國內主流的地圖都預設採用了什麼座標系統呢?
地圖 | 大陸、港澳 | 臺灣省 | 海外 |
---|---|---|---|
百度 | BD-09 | WGS84 | WGS84 |
高德 | GCJ-02 | WGS84 | WGS84 |
騰訊 | GCJ-02 | WGS84 | WGS84 |
總結一句話:
中國大陸、港澳,使用GCJ02座標系(百度除外,百度預設使用 BD09 座標系);台灣省使用 WGS84 座標系;海外地區使用 BD09 座標系
;
以上表格資料依據:
百度地圖資料依據
http://lbsyun.baidu.com/index.php?title=androidsdk/guide/coordtrans
高德地圖資料依據
https://lbs.amap.com/faq/advisory/others/39840/?wd=WGS84&cateId=&page=&detail=true
騰訊地圖資料依據
https://lbs.qq.com/mobile/androidMapSDK/developerGuide/attention
三、座標系轉換
檢視百度、高德、騰訊相關開發者平臺,發現對應開發者平臺均提供了GCJ02、BD09、WGS84
相關的座標系轉化API。
百度地圖
百度地圖 座標轉化API:
http://lbsyun.baidu.com/index.php?title=androidsdk/guide/coordtrans
高德地圖
高德地圖 座標轉化API:
https://lbs.amap.com/api/android-sdk/guide/computing-equipment/coordinate-transformation/