首先, 我們了解一下為什么要坐標轉換
國際經緯度坐標標准為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, 是必須批量送入, 但底層還是一次次分別請求, 不合我意).
而事實上, 百度已經提供了文檔化的坐標轉換接口, 並且原生就支持批量請求. 顯然, 我們應該用文檔化的方法, 只是這種用法需要申請成為一個開發者, 添加一個應用. 這不是小事么, 於是我小包裝了一下, 見此gist.
僅僅有一點小要求, 就是傳入的坐標, 鍵名分別是lon(經度)和lat和(緯度), 並且可以傳入一個(傳入一個, 返回也是一個), 或者一組
轉換一個坐標:
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
});
