定位與座標系算法

IOS定位與座標系算法

 

  在開始這個題目以前,先給你們再次掃掃盲,掃的不是座標系統的盲,而是咱們國家所使用的座標系統。你們都知道,美國GPS使用的是WGS84的座標系統,以經緯度的形式來表示地球平面上的某一個位置,這應該是國際共識。但在我國,出於國家安全考慮,國內全部導航電子地圖必須使用國家測繪局制定的加密座標系統,即將一個真實的經緯度座標加密成一個不正確的經緯度座標,咱們在業內將前者稱之爲地球座標,後者稱之爲火星座標,具體的說明能夠參看百度百科中關於火星座標系統的解釋。html

1.國內各地圖API座標系統比較

參考http://rovertang.com/labs/map-compare/算法

結論是:安全

API 座標系
百度地圖API 百度座標
騰訊搜搜地圖API 火星座標
搜狐搜狗地圖API 搜狗座標*
阿里雲地圖API 火星座標
圖吧MapBar地圖API 圖吧座標
高德MapABC地圖API 火星座標
靈圖51ditu地圖API 火星座標

 

 

2.下面是百度官方對百度座標爲什麼有偏移的解釋

  國際經緯度座標標準爲WGS-84,國內必須至少使用國測局制定的GCJ-02,對地理位置進行首次加密。百度座標在此基礎上,進行了BD-09二次加密措施,更加保護了我的隱私。百度對外接口的座標系並非GPS採集的真實經緯度,須要經過座標轉換接口進行轉換。post

3.火星座標系 (GCJ-02) 與百度座標系 (BD-09) 的轉換算法

GCJ-02(火星座標) 和 BD-09 (百度座標)google

算法代碼以下,其中 bd_encrypt 將 GCJ-02 座標轉換成 BD-09 座標, bd_decrypt 反之。阿里雲

void bd_encrypt(double gg_lat, double gg_lon, double &bd_lat, double &bd_lon)加密

{url

    double x = gg_lon, y = gg_lat;spa

    double z = sqrt(x * x + y * y) + 0.00002 * sin(y * x_pi);.net

    double theta = atan2(y, x) + 0.000003 * cos(x * x_pi);

    bd_lon = z * cos(theta) + 0.0065;

    bd_lat = z * sin(theta) + 0.006;

}

 

void bd_decrypt(double bd_lat, double bd_lon, double &gg_lat, double &gg_lon)

{

    double x = bd_lon - 0.0065, y = bd_lat - 0.006;

    double z = sqrt(x * x + y * y) - 0.00002 * sin(y * x_pi);

    double theta = atan2(y, x) - 0.000003 * cos(x * x_pi);

    gg_lon = z * cos(theta);

    gg_lat = z * sin(theta);

}

4.地球座標系 (WGS-84) 到火星座標系 (GCJ-02) 的轉換算法

WGS-84 到 GCJ-02 的轉換(即 GPS 加偏)算法是一個普通青年輕易沒法接觸到的「公開」的祕密。這個算法的代碼在互聯網上是公開的,詳情請使用 Google 搜索 "wgtochina_lb" 。

整理後的算法代碼請參考 https://on4wp7.codeplex.com/SourceControl/changeset/view/21483#353936 。知道了這個算法以後,就能夠離線進行 Google 地圖偏移校訂,沒必要像以前那麼麻煩。

至於 GCJ-02 到 WGS-84 的轉換(即 GPS 糾偏),能夠使用二分法。

相關文章
相關標籤/搜索