天天看點

關于地圖坐标和定位偏差

關于地圖偏移值的一些讨論說明。

實驗背景:

  研究并比較,三種定位結果(主要是讨論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

關于地圖坐标和定位偏差