百度地圖API提供了Geolocation 和 LocalCity兩個服務類。
這倆API可以分別供用戶在JavaScript中進行定位和城市確認。
1 本質上,Geolocation這個類是使用了支持HTML5瀏覽器提供的Geolocation API 來進行定位的。目前Internet Explorer 9、Firefox、Chrome、Safari 以及 Opera 支持地理定位(因為他們支持HTML5)。
2 本質上,LocalCity這個類是利用用戶IP地址去百度數據庫里查詢得到IP所在的城市。
關於第一點的原理,在此解釋下:在支持HTML5的瀏覽器下,navigator對象下有一個屬性----geolocation,而 geolocation屬性又有個方法getCurrentPosition(回調函數1,回調函數2)可以通過瀏覽器向設備發起定位請求,瀏覽器就會讓 設備發送相關指令到附近上網設備,上網設備返回定位信息給用戶設備,瀏覽器就獲得了用戶位置。
當瀏覽器獲得定位信息成功,則navigator.geolocation.getCurrentPosition(回調函數1,回調函數2); 中的回調函數1執行,如果定位失敗,則回調函數2執行。
若定位成功,則自動把定位結果對象作為參數傳遞給回調函數1,。 若定位失敗,則自動把錯誤對象傳遞給回調函數2. 所以在回調函數2中可通過error.code 獲取到錯誤碼。(假設形參名為error)。
如下代碼就是用HTML5獲取定位信息,並把成功定位交給showPosition處理,把錯誤定位交給showError處理。
function getLocation() { if (navigator.geolocation) { navigator.geolocation.getCurrentPosition(showPosition,showError); } else{x.innerHTML="Geolocation is not supported by this browser.";} //瀏覽器不支持HTML5. }
注意:百度地圖提供的API使用起來與HTML5原生的定位代碼是不同的。
下面是百度定位代碼:
<script type="text/javascript"> var map = new BMap.Map("allmap"); var point = new BMap.Point(116.331398,39.897445); map.centerAndZoom(point,12); var geolocation = new BMap.Geolocation(); //實例化瀏覽器定位對象。 //下面是getCurrentPosition方法。調用該對象的 getCurrentPosition(),與HTML5不同的是,這個方法原型是 getCurrentPosition(callback:function[, options: PositionOptions]),也就是說無論成功與否都執行回調函數1,第二個參數是關於位置的選項。 因此能否定位成功需要在回調函數1中自己判斷。 geolocation.getCurrentPosition(function(r){ //定位結果對象會傳遞給r變量 if(this.getStatus() == BMAP_STATUS_SUCCESS){ //通過Geolocation類的getStatus()可以判斷是否成功定位。 var mk = new BMap.Marker(r.point); //基於定位的這個點的點位創建marker map.addOverlay(mk); //將marker作為覆蓋物添加到map地圖上 map.panTo(r.point); //將地圖中心點移動到定位的這個點位置。注意是r.point而不是r對象。 alert('您的位置:'+r.point.lng+','+r.point.lat); //r對象的point屬性也是一個對象,這個對象的lng屬性表示經度,lat屬性表示緯度。 } else { alert('failed'+this.getStatus()); } },{enableHighAccuracy: true}) //關於狀態碼 //BMAP_STATUS_SUCCESS 檢索成功。對應數值“0”。 //BMAP_STATUS_CITY_LIST 城市列表。對應數值“1”。 //BMAP_STATUS_UNKNOWN_LOCATION 位置結果未知。對應數值“2”。 //BMAP_STATUS_UNKNOWN_ROUTE 導航結果未知。對應數值“3”。 //BMAP_STATUS_INVALID_KEY 非法密鑰。對應數值“4”。 //BMAP_STATUS_INVALID_REQUEST 非法請求。對應數值“5”。 //BMAP_STATUS_PERMISSION_DENIED 沒有權限。對應數值“6”。(自 1.1 新增) //BMAP_STATUS_SERVICE_UNAVAILABLE 服務不可用。對應數值“7”。(自 1.1 新增) //BMAP_STATUS_TIMEOUT 超時。對應數值“8”。(自 1.1 新增) </script>
IP獲取城市就簡單了,如下:
<script type="text/javascript"> var map = new BMap.Map("allmap"); var point = new BMap.Point(116.331398,39.897445); map.centerAndZoom(point,12); function myFun(result){ var cityName = result.name; map.setCenter(cityName); //關於setCenter()可參考API文檔---”傳送門“ alert(cityName); } var myCity = new BMap.LocalCity(); myCity.get(myFun); //創建一個LocalCity對象myCity,然后調用其get()方法,就得到了用戶IP對應的城市。該城市結果會以參數形式傳遞給回調函數myFun。接下來就是myFun(結果城市result)來執行了----即上文紅色代碼。 </script>