轉自博文:百度地圖API的IP定位城市和瀏覽器定位 http://blog.csdn.net/suixufeng/article/details/13511761
百度地圖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>
