首先, 我們了解一下為什么要坐標(biāo)轉(zhuǎn)換
國(guó)際經(jīng)緯度坐標(biāo)標(biāo)準(zhǔn)為WGS-84,國(guó)內(nèi)必須至少使用國(guó)測(cè)局制定的GCJ-02,對(duì)地理位置進(jìn)行首次加密啼染。百度坐標(biāo)在此基礎(chǔ)上够傍,進(jìn)行了BD-09二次加密措施,更加保護(hù)了個(gè)人隱私。百度對(duì)外接口的坐標(biāo)系并不是GPS采集的真實(shí)經(jīng)緯度,需要通過(guò)坐標(biāo)轉(zhuǎn)換接口進(jìn)行轉(zhuǎn)換。
其次, 我們?cè)诰W(wǎng)上搜到有通過(guò)
http://api.map.baidu.com/ag/coord/convert?from=[0/2]&to=4&x=緯度&y=經(jīng)度
這種URL來(lái)進(jìn)行轉(zhuǎn)換的, 其中0
代表WGS-84
即標(biāo)準(zhǔn)GPS設(shè)備返回的坐標(biāo), 2
代表國(guó)測(cè)局的標(biāo)準(zhǔn), 顯然4
就是百度地圖認(rèn)的坐標(biāo)了. 但我遍搜網(wǎng)絡(luò), 這個(gè)接口是沒(méi)有文檔的(但是確實(shí)可用). 因?yàn)闀?huì)碰到跨域的問(wèn)題(CORS
), 所以就用了jQuery中script標(biāo)簽跨域的方式來(lái)執(zhí)行, 結(jié)果這個(gè)腳本也被百度”回收”了, 當(dāng)然, 網(wǎng)上還是有痕跡的, 我把它保存了一下, 見(jiàn)此gist.
我沒(méi)在這上面花太多時(shí)間, 并沒(méi)有測(cè)它支不支持批量轉(zhuǎn)換(看網(wǎng)友寫了一個(gè)transMore, 是必須批量送入, 但底層還是一次次分別請(qǐng)求, 不合我意).
而事實(shí)上, 百度已經(jīng)提供了文檔化的坐標(biāo)轉(zhuǎn)換接口, 并且原生就支持批量請(qǐng)求. 顯然, 我們應(yīng)該用文檔化的方法, 只是這種用法需要申請(qǐng)成為一個(gè)開(kāi)發(fā)者, 添加一個(gè)應(yīng)用. 這不是小事么, 于是我小包裝了一下, 見(jiàn)此gist.
僅僅有一點(diǎn)小要求, 就是傳入的坐標(biāo), 鍵名分別是lon
(經(jīng)度)和lat
和(緯度), 并且可以傳入一個(gè)(傳入一個(gè), 返回也是一個(gè)), 或者一組
轉(zhuǎn)換一個(gè)坐標(biāo):
BMap.Convertor.translate({lon:lon, lat:lat}, 1, 5, bdkey, function (point, status, message) {
if(status) return show(message || "轉(zhuǎn)換坐標(biāo)出錯(cuò):"+status, true);
var curmarker = new BMap.Marker(point);
baidumap.addOverlay(curmarker);
});
一組坐標(biāo):
BMap.Convertor.translate([{lon:lon, lat:lat},...], 1, 5, bdkey, function (points, status, message) {
if(status) return show(message || "轉(zhuǎn)換坐標(biāo)出錯(cuò):"+status, true);
// 遍歷points
});