很久之前幫大叔解決了一個gps坐標轉換為百度地圖坐標的問題。今天大叔又給我講百度地圖定位不准。我查了一下api,用了官方給出的這樣一組函數。
1 //創建查詢對象 2 var geolocation = new BMap.Geolocation(); 3 4 //調用getCurrentPosition函數 5 geolocation.getCurrentPosition(function (position) { 6 7 //如果查詢成功 8 if (this.getStatu() == 'BMAP_STATU_SUCCESS') { 9 10 //根據point對象創建標記遮擋物,並添加到地圖中 11 var marker = new BMap.Marker(position.point); 12 map.addOverlay(marker); 13 14 //將地圖中心設置為獲得的當前位置 15 map.panTo(position.point) 16 } 17 })
我自己試的完全不行,和實際地址偏差很大,偏差有幾公里,這肯定是不行的。所以我在網上查資料知道了百度地圖的定位都是有偏移量的。
當然我最終的解決方案並非通過這個api然后去掉偏移量,我是用另一種方法。
也就是用html5自帶的定位。之前我給大叔解決的問題就是把gps坐標轉換為百度地圖坐標,所以我就想html5的定位獲取的是不是gps坐標。
事實證明這是可以的。
也就是說,不使用百度自身提供的api,而使用html5的api,並把得到的結果去用百度的轉換坐標的api去轉換一下。這話說着聽繞口的。
1、調用navigator.geolocation.getCurrentPosition(callback); 函數
2、注冊回調函數,在回調函數中調用百度的坐標轉換的api,這個api大叔知道,我沒有細查,只知道能通過url去請求並注冊一個回調,但是BMap提供了一個這樣的函數,我這里先假設是convgps(x,y,from,to,callback);
這幾個參數是什么意思呢
x:經度
y:緯度
from:要轉換的坐標類型,百度官網有1為國際gps坐標,2為國際gps米度坐標,這個可以去官網看,取值范圍是1-7
to:要轉換成的坐標類型,只能是5或者6,5為百度地圖坐標,6為百度地圖米度坐標(別問我什么是米度坐標,我不知道...)
callback:回調
當然這里只是假設是這樣的。
3、在convgps的回調中注冊,使用轉換好的經緯度創建一個marker並將地圖中心放在這個經緯度上,也就是和前面代碼一樣的
注意,以下代碼請勿直接使用,只是提供一個思路的代碼,因為我沒有去查那個函數的名字。
1 navigator.geolocation.getCurrentPosition(function (position) { 2 3 //得到html5定位結果 4 var x = position.coords.longitude; 5 var y = position.coords.latitude; 6 7 //由於html5定位的結果是國際標准gps,所以from=1,to=5 8 //下面的代碼並非實際是這樣,這里只是提供一個思路 9 BMap.convgps(x, y, 1, 5, function (convRst) { 10 var point = new BMap.Point(convRst.x, convRst.y); 11 12 //這個部分和上面的代碼是一樣的 13 var marker = new BMap.Marker(point); 14 map.addOverlay(marker); 15 map.panTo(point); 16 }) 17 18 })