關於百度地圖坐標轉換接口的研究


這個世界的坐標系統已經讓人搞得昏頭轉向(請看這篇:國內各地圖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 31 MTIxLjAwNjU2MzI3ODQ3 MzEuMDA1ODIyNzk4NjUz 121.006563278470000 31.005822798653000
121.000000001 31 MTIxLjAwNjU2MzI3OTQ2 MzEuMDA1ODIyNzk4NjM3 121.006563279460000 31.005822798637000

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

6、百度坐標到地球坐標

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

這就是我一個晚上對此問題的研究,歡迎大家繼續研究討論。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM