Google Map,Baidu Map,latitude,longitude

美國GPS使用的是WGS84的座標系統,以經緯度的形式來表示地球平面上的某一個位置。但在我國,出於國家安全考慮,國內所有導航電子地圖必須使用國家測繪局制定的加密座標系統,即將一個真實的經緯度座標加密成一個不正確的經緯度座標,在業內將前者稱之爲地球座標,後者稱之爲火星座標。

《條例》要求地圖不得“危害國家統一、主權和領土完整;危害國家安全、損害國家榮譽和利益;國家祕密;影響民族團結、侵害民族風俗習慣”,規定互聯網地圖服務必須經過審批,要求“從事互聯網地圖服務的,應當將存放地圖數據的服務器設在中華人民共和國境內,建立互聯網地圖數據安全管理制度和保障措施,並具有經測繪行政主管部門考覈合格的互聯網地圖安全審校人員。”由於地圖涉及“國家機密”,中國官方要求地圖服務商加裝“國家保密插件”,以“保障國家安全”。此插件會將真實的座標加密成虛假的座標,且此加偏並非線性加偏,所以各地的偏移情況都會有所不同。

國家保密插件,也叫做加密插件或者加偏或者SM模組,其實就是對真實座標系統進行人爲的加偏處理,按照幾行代碼的算法,將真實的座標加密成虛假的座標,而這個加偏並不是線性的加偏,所以各地的偏移情況都會有所不同。而加密後的座標也常被人稱爲火星座標系統。

所有的電子地圖所有的導航設備,都需要加入國家保密插件。第一步,地圖公司測繪地圖,測繪完成後,送 到國家測繪局,將真實座標的電子地圖,加密成“火星座標”,這樣的地圖纔是可以出版和發佈的,然後纔可以讓GPS公司處理。第二步,所有的GPS公司,只要需要汽車導航的,需要用到導航電子地圖的,統統需要在軟件中加入國家保密算法,將COM口讀出來的真實的座標信號,加密轉換成國家要求的保密的座標,這樣,GPS導航儀和導航電子地圖就可以完全匹配,GPS也就可以正常工作。

一、國內各地圖服務商的座標系比較

如果你認爲國內的所有座標系都是採用的“火星座標”那麼你就錯了。大多是公司爲了維護自己的商業利益,通常會在“火星座標”基礎上在做一次加密,拿百度爲例:國際經緯度座標標準爲WGS-84,國內必須至少使用國測局制定的GCJ-02,對地理位置進行首次加密。百度座標在此基礎上,進行了BD-09二次加密措施。。百度對外接口的座標系並不是GPS採集的真實經緯度,需要通過座標轉換接口進行轉換。一些爲國內的一些地圖服務提供商使用的座標系情況:

地圖經緯度及座標系統轉換

 二、不同座標系之間的轉化

上面說了那麼多,最終需要引出的是,如何進行不同座標系之間的轉化。先來介紹幾個常用的工具。

1、百度地圖座標轉換接口

先前博客上介紹的百度地圖API經緯度轉換接口,支持所有座標系之間的互轉,但是目前此藉口已經不能再使用了。非常的可惜,取而代之的是百度的另外一個接口:http://api.map.baidu.com/ag/coord/convert?from=0&to=4&x=longitude&y=latitude

其中

from: 來源座標系 (0表示原始GPS座標,2表示Google座標)

to: 轉換後的座標 (4就是百度自己啦,好像這個必須是4纔行)

x: 精度

y: 緯度

返回的結果是一個json字符串: {“error”:0,”x”:”MTIxLjUwMDIyODIxNDk2″,”y”:”MzEuMjM1ODUwMjYwMTE3″}

error:是結果是否出錯標誌位,”0″表示OK

x: 百度座標系的精度(Base64加密)

y: 百度座標系的緯度(Base64加密)

2、百度地圖API(iOS版)座標轉換服務

作用:將其他座標系轉換到百度座標系

文件:BMKGeometry.h

接口說明:

BMKBaiduCoorForWgs84() 從gps座標系或mapbar座標系轉換到百度座標系,返回結果爲經過Base64加密之後字符串。

BMKBaiduCoorForGcj() 從google座標系、51地圖座標系、mapcabc座標系轉換到百度座標系(51地圖座標需要先除10000),返回結果爲經過Base64加密之後的字符串。

BMKCoorDictionaryDecode() base64加密後的座標字典解密函數。

3、Google 中國地圖偏移接口

經確認,目前此接口(http://ditu.google.cn/maps/vp?spn=0.0,0.0&z=18&vp=39.111195,117.148067)返回的內容已經改變,所以已不可用。

4、搜狗地圖轉換接口

作用:將google座標和百度座標轉換爲搜狗座標的服務。

詳細使用方法,請參照:http://map.sogou.com/api/documentation/javascript/api2.5/interface_translate.html

5、地球座標轉化成火星座標

按理,只要使用國家提供的保密插件就可以將地球座標轉化爲火星座標。關於加密模塊可能我們接觸不到,但是網上給座標加密的算法確實可以找到:https://on4wp7.codeplex.com/SourceControl/changeset/view/21483#353936

6、火星座標到地球座標

由於上面的加密算法是不可逆的。這個基本上是無解的。不然這個也不會成爲國家機密了!

7、百度座標與火星座標的互換

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

?

#include <math.h>

 

const double x_pi = 3.14159265358979324 * 3000.0 / 180.0;

 

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

{

    double x = gg_lon, y = gg_lat;

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

    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);

}

引用地址:http://www.biaodianfu.com/coordinate-system.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章