關于地圖偏移值的一些讨論說明。
實驗背景:
研究并比較,三種定位結果(主要是讨論GPS定位):
1Google Maps + Android API的定位
2.百度地圖SDK+百度定位SDK
3.高德地圖SDK+高德定位SDK
測試條件:國産Android手機。
定位結果:
2和3都比較靠譜,定位精度符合預期(室外GPS定位誤差在10米以内),當然由于百度和高德的定位SDK中一般是混合定位,會結合利用網絡定位和背景資料支援什麼的。
1的定位結果基本無效,顯示的位置和在地圖上标記的位置會有幾十米的差距。
雖然谷歌地圖可以同時注冊多種定位方式,比如GPS和網絡定位同時開啟,然後手動程式設計選擇最佳位置,但是網絡定位的精度太低,GPS的精度雖然高但是存在固有偏差(精确但不準确),是以無法拯救這種位置偏差。
原因分析:
由于國家測繪局的規定,地圖坐标必須加密,加入随機的偏移。至少需要滿足的一個标準叫GCJ-02。
GCJ-02參見百度百科:
GCJ-02是由中國國家測繪局制訂的地理資訊系統的坐标系統。
它是一種對經緯度資料的加密算法,即加入随機的偏差。
國内出版的各種地圖系統(包括電子形式),必須至少采用GCJ-02對地理位置進行首次加密。
Google Maps為什麼出錯:
Google Maps的原生坐标是WGS-84,國際坐标,但是中國區域的部分,為了符合中國測繪法律規定,加入了偏移,滿足了GCJ-02标準。
而Android API得出的定位結果值,是GPS讀出的,是沒有加入偏移的,是WGS-84坐标。
是以坐标體系的不對應導緻了誤差。
百度地圖為什麼是對的:
百度定位SDK部分介紹
(http://developer.baidu.com/map/geosdk-android-classv4.0.htm#import.E7.9B.B8.E5.85.B3.E7.B1.BB)
可以通過public void setCoorType ( String )方法定義傳回位置值的坐标類型。
支援傳回若幹種坐标系,包括國測局坐标系、百度坐标系,需要更多坐标系請聯系百度。
目前這些參數的代碼為
傳回國測局經緯度坐标系 coor=gcj02
傳回百度墨卡托坐标系 coor=bd09
傳回百度經緯度坐标系 coor=bd09ll
百度手機地圖對外接口中的坐标系預設是bd09ll,如果配合百度地圖産品的話,需要注意坐标系對應問題。
相關問題:
(http://developer.baidu.com/map/geosdk-android-qa.htm#.E7.99.BE.E5.BA.A6.E5.9C.B0.E5.9B.BE.E5.AE.9A.E4.BD.8DAPI.E4.BD.BF.E7.94.A8.E4.BB.80.E4.B9.88.E5.9D.90.E6.A0.87.E7.B3.BB.EF.BC.9F)
國際經緯度坐标标準為WGS-84,國内必須至少使用國測局制定的GCJ-02,對地理位置進行首次加密。
百度坐标在此基礎上,進行了BD-09二次加密措施,更加保護了個人隐私。
百度對外接口的坐标系并不是GPS采集的真實經緯度,需要通過坐标轉換接口進行轉換。
高德地圖的處理方式
大緻也是和百度類似的:
http://developer.amap.com/location/faq
高德地圖的對外提供的坐标都是經過國家測繪局加密處理的,符合國家測繪局對地理資訊保密要求,是以如果使用GPS獲得的原始坐标在高德地圖顯示,會有偏差,需要将原始坐标經過加密轉換,轉化為高德坐标。
一些參考資料:
(也不知道靠譜不)
http://kongxz.com/2013/10/wgs-cgj/
轉換算法:http://blog.csdn.net/coolypf/article/details/8686588
作者: 聖騎士Wind
出處: 部落格園: 聖騎士Wind
Github: https://github.com/mengdd
微信公衆号: 聖騎士Wind
