天天看點

關于百度地圖坐标轉換接口的研究

這個世界的坐标系統已經讓人搞得昏頭轉向(請看這篇:國内各地圖API比較),而百度地圖還用了自家的坐标系統,今天偶然看到百度地圖批量轉換接口,心想看看代碼反轉一下,但嘗試無果。雖然将百度坐标轉換成火星坐标不成,但我還是有些東西想和大家分享,使用百度地圖坐标接口實作地球坐标轉換到火星坐标。

在說這個問題之前,我們還是普及一下坐标系統的概念。我們使用GPS系統獲得的坐标系統,基本為标準的國際通用的WGS84坐标系統,而我們的國測局出于安全考慮,推出了02坐标系統,就是在标準的WGS84坐标系統上進行了人為的偏移,并且還是非線性的,所有的導航軟體導航地圖都需要使用國家02坐标系統,比如Google地圖、騰訊SOSO地圖等就是直接使用了國家02坐标系統,我們有一個不成文的說法,前者叫地球坐标,後者叫火星坐标,并且,火星坐标是無法轉換成地球坐标的(網上雖然有一定的方法,但基本上都是基于偏移資料庫,精度較高的資料庫需要購買,當然這都是一種破解手段)。而百度地圖等,可能是出于商業化考慮,為了不讓自己的使用者流失,而推出了自家的坐标系統,就是誰也看不懂的百度坐标系統,在百度地圖上,沒有任何偏差,但你又無法将轉換後的百度坐标系統反轉回來,這樣你用百度地圖坐标就自然離不開百度了。對于這樣的行徑,很是無語,但作為一個公司的商業化手段,也算能了解。

說完坐标系統,我們自然能夠知道這裡的問題,我窮舉了六個問題,來說說我對此的研究。

1、地球坐标轉火星坐标

原則上,國家提供了保密插件,直接可算,但你必須通過正規的商業化管道才可以獲得,一般的個人是不可能從國測局取得保密插件代碼的。

這個問題不是沒有解決辦法,因為網絡地圖公司就一定會使用到這樣的接口,比如Google地圖、MapABC地圖等,網上一個朋友在iOS上實作了該轉換,用的是高德MapABC的接口(詳見這裡),我來說說百度地圖接口的做法。

接口位址:http://api.map.baidu.com/ag/coord/convert?x=121.583140&y=31.341174&from=0&to=2&mode=1

說明:x和y就是經緯度了,替換成你真實的經緯度即可,from和to表示坐标系,0表示地球坐标,2表示火星坐标,4表示百度坐标,是以這裡是從地球坐标轉換成火星坐标,mode參數未知。

結果:[{"error":0,"x":"MTIxLjU4NzM2NDA5NTA1","y":"MzEuMzM5MDI3NTA2NTE="}]

說明:error為0表示沒有錯誤,傳回的x和y是base64算法後的結果(可以自行Google加解密base64),解密後就是:121.58736409505和31.33902750651,這個就是火星坐标。

問題:我不知道官方是否提供了這個方法,但驗證下來基本沒有偏差(第六位同MapABC加密出來的不同,原因未知),第六位的偏差也可以基本忽略。

本想用這個接口自己來寫一個小軟體的,但想想過于麻煩,是以有心的朋友來寫一個吧,當然,也要注意,這個接口的調用最好是異步的,并且每次最多好像是20個。

2、火星坐标轉地球坐标

如上文所述,國家是不可能公開這個算法的,網上流傳的基本上都是基于資料庫的,而高精度的反算資料庫有人是賣錢的。

關于這方面的研究,三年前就已經是熱火朝天了,隻是個人有一兩個工具可用,是以也一直無心研究具體實作。至于資料庫,0.1的資料庫應該是比較容易獲得的,由于手頭看到的都已經加密成二進制,是以待我找到後再同大家分享吧。順便推薦一下這篇:一種根據糾偏資料對火星坐标進行完美拟合的方法,有興趣的朋友可以研究一下,或者做成一個工具。

3、地球坐标到百度坐标

百度已經提供了兩個示例:

坐标轉換示例:http://dev.baidu.com/wiki/static/map/API/examples/?v=1.3&0_6#0&6

批量坐标轉換示例:http://dev.baidu.com/wiki/static/map/API/examples/?v=1.3&0_7#0&7

雖然這兩個示例中,百度提供了一個js,但實際上也逃離不了第一點中描述的接口http://api.map.baidu.com/ag/coord/convert?x=121.583140&y=31.341174&from=0&to=2&mode=1,隻是變更為了from 0 to 4。以此類推,下述第四點即為from 2 to 4。

4、火星坐标到百度坐标

同第三點所述。

5、百度坐标到火星坐标

這是我本次所想破解的問題,結合上文所述,地球坐标到火星坐标是國家的方法,那麼火星坐标到百度坐标應該是自己的算法,既然搜狗能夠解密出百度的坐标(提供的也僅僅是接口,無實際算法),那麼按照道理根據規律也是可以進行解密。我做了幾個坐标,嘗試着看出其中的規律:

火星經度 火星緯度 百度經度(base64) 百度緯度(base64) 百度經度 百度緯度
121 31 MTIxLjAwNjU2MzI3ODQ2 MzEuMDA1ODIyNzk4NjUz 121.006563278460000 31.005822798653000
122 32 MTIyLjAwNjUzMTI0NjE= MzIuMDA1ODEyNjA1NDk0 122.006531246100000 32.005812605494000
123 33 MTIzLjAwNjQwMDk5OTQ1 MzMuMDA2MzY4OTk5ODUx 123.006400999450000 33.006368999851000
124 34 MTI0LjAwNjU2NzcwMzgy MzQuMDA1ODE4NTgwMTIy 124.006567703820000 34.005818580122000
121.00000000001 MTIxLjAwNjU2MzI3ODQ3 121.006563278470000
121.000000001 MTIxLjAwNjU2MzI3OTQ2 MzEuMDA1ODIyNzk4NjM3 121.006563279460000 31.005822798637000

可惜我不是學數學的,對于非線性的分析确實很難,隻好作罷。不知道有大俠可否分析出其中的規律來?很是期待。

6、百度坐标到地球坐标

這個問題基本無解,即便有解也需要先解決第五點和第二點。這裡就不多說了。

分類: Map, GPS

标簽: 坐标, 百度, 百度地圖, 火星坐标, 地球坐标, WGS84, 坐标轉換, 百度坐标, 糾偏, 地圖API

繼續閱讀