首先, 我們了解一下為什么要坐標轉換
國際經緯度坐標標準為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
});