首先, 咱們瞭解一下爲何要座標轉換php
國際經緯度座標標準爲WGS-84,國內必須至少使用國測局制定的GCJ-02,對地理位置進行首次加密。百度座標在此基礎上,進行了BD-09二次加密措施,更加保護了我的隱私。百度對外接口的座標系並非GPS採集的真實經緯度,須要經過座標轉換接口進行轉換。
其次, 咱們在網上搜到有經過http://api.map.baidu.com/ag/coord/convert?from=[0/2]&to=4&x=緯度&y=經度
這個URL來進行轉換的, 其中0表明WGS-84即標準GPS設備返回的座標, 2表明國測局的標準, 顯然4就是百度地圖認的座標了. 但我遍搜網絡, 這個接口是沒有文檔的(可是確實可用). 由於會碰到跨域的問題(CORS), 因此就用了jQuery中script標籤跨域的方式來執行, 結果這個腳本也被百度」回收」了, 固然, 網上仍是有痕跡的, 我把它保存了一下, gist. 我沒在這上面花太多時間, 並無測它支不支持批量轉換(看網友寫了一個transMore, 是必須批量送入, 但底層仍是一次次分別請求, 不合我意).git
而事實上, 百度已經提供了文檔化的座標轉換接口, 而且原生就支持批量請求. 顯然, 咱們應該用文檔化的方法, 只是這種用法須要申請成爲一個開發者, 添加一個應用. 這不是小事麼, 因而我小包裝了一下, 見此gist.github
僅僅有一點小要求, 就是傳入的座標, 鍵名分別是lon
(經度)和lat
和(緯度), 而且能夠傳入一個(傳入一個, 返回也是一個), 或者一組web
轉換一個座標:api
BMap.Convertor.translate({lon:lon, lat:lat}, 1, 5, bdkey, function (point, status, message) { if(status) return show(message || "轉換座標出錯:"+status, true); var curmarker = new BMap.Marker(point); baidumap.addOverlay(curmarker); });
一組座標:跨域
BMap.Convertor.translate([{lon:lon, lat:lat},...], 1, 5, bdkey, function (points, status, message) { if(status) return show(message || "轉換座標出錯:"+status, true); // 遍歷points });