在新的API標准中,可以通過navigator.geolocation來獲取設備的當前位置,返回一個位置對象,用戶可以從這個對象中得到一些經緯度的相關信息。
navigator.geolocation的三個方法:
1. getCurrentPosition()
2. watchPosition()
3. clearWatch()
getCurrentPosition()
使用方法:navigator.geolocation.getCurrentPosition(successCallback, [errorCallback] , [positionOptions]);
A) successCallback 獲取定位成功時執行的回調函數 eg: function(position){alert("緯度:"+position.coords.latitude+";經度:"+position.coords.longitude)};
successCallback返回一個地理數據對象position作為參數,該對象有屬性timestamp和coords。timestamp表示該地理數據創建時間(時間戳);coords包括另外七個屬性:
1. coords.latitude:估計緯度
2. coords.longitude:估計經度
3. coords.altitude:估計高度
4. coords.accuracy:所提供的以米為單位的經度和緯度估計的精確度
5. coords.altitudeAccuracy:所提供的以米為單位的高度估計的精確度
6. coords.heading: 宿主設備當前移動的角度方向,相對於正北方向順時針計算
7. coords.speed:以米每秒為單位的設備的當前對地速度
PS:firefox下還有address屬性,可以獲取詳細地址,不過我得到的地址是錯誤的,使用方法:position.address.city,具體如下:
QueryInterface:function QueryInterface() { [native code] } streetNumber:200號 street:人民大道 premises:null city:上海市 county:null region:上海市 country:中國 countryCode:CN postalCode:null getInterfaces:function getInterfaces() { [native code] } getHelperForLanguage:function getHelperForLanguage() { [native code] } contractID:null classDescription:null classID:null implementationLanguage:2 flags:8 SINGLETON:1 THREADSAFE:2 MAIN_THREAD_ONLY:4 DOM_OBJECT:8 PLUGIN_OBJECT:16 CONTENT_NODE:64 RESERVED:2147483648
B) errorCallback 定位失敗時執行的回調函數 eg: function(error){alert(error.message);}
errorCallback返回一個錯誤數據對象error作為參數,該對象有屬性:
1.code :表示失敗原因,返回1 or 2 or 3 ,具體為
PERMISSION_DENIED
(數值為1) 表示沒有權限使用地理定位API
POSITION_UNAVAILABLE (數值為2) 表示無法確定設備的位置,例如一個或多個的用於定位采集程序報告了一個內部錯誤導致了全部過程的失敗
TIMEOUT (數值為3) 表示超時
詳情查看 http://dev.w3.org/geo/api/spec-source.html#permission_denied_error
2.message :錯誤提示內容
C) positionOptions 用來設置positionOptions來更精細的執行定位,positionOptions擁有三個屬性{enableHighAccuracy:boolean , timeout:long , maximumAge:long}。
enableHighAccuracy 【true or false(默認)】是否返回更詳細更准確的結構,默認為false不啟用,選擇true則啟用,但是會導致較長的響應時間及增加功耗,這種情況更多的用在移動設備上。
timeout 設備位置獲取操作的超時時間設定(不包括獲取用戶權限時間),單位為毫秒,如果在設定的timeout時間內未能獲取位置定位,則會執行errorCallback()返回code(3)。如果未設定timeout,那么timeout默認為無窮大,如果timeout為負數,則默認timeout為0。
maximumAge 設定位置緩存時間,以毫秒為單位,如果不設置該值,該值默認為0,如果設定負數,則默認為0。該值為0時,位置定位時會重新獲取一個新的位置對象;該值大於0時,即從上一次獲取位置時開始,緩存位置對象,如果再次獲取位置時間不超過maximumAge,則返回緩存中的位置,如果超出maximumAge,則重新獲取一個新的位置。
watchPosition()
功能getCurrentPosition()相似,watchPosition()是定期輪詢設備的位置,同樣擁有3個參數,與getCurrentPosition()相同。
使用方法:navigator.geolocation.watchPosition(successCallback, [errorCallback] , [positionOptions]);
執行步驟:
1.首先初始化positionOptions內的屬性(詳細同上)。
2.判斷是否有緩存位置對象,該對象年齡是否可用、是否超出maximumAge ,如果可用且未超出,返回緩存位置,否則重新確定設備位置。
3.位置定位操作:
i.建立一個計時器,進行位置獲取操作,如果在timeout之前完成,執行下一步;如果未在timeout之前完成,則執行errorCallback(),code為3,跳出步驟做等待重新激活。
ii.如果在timeout之前獲得位置成功,則執行successCallback(),然后重置計時器(從獲取位置成功時刻重新算起),繼續掛起獲取新位置。當有與之前位置有明顯不同位置出現時,再次執行successCallback(),並重復操作,該循環直到timeout超時或者獲取操作中遇到POSITION_UNAVAILABLE錯誤執行errorCallback()為止,亦或者執行clearWatch()操作。
clearWatch()
配合watchPosition()使用,用於停止watchPosition()輪詢。
watchPosition()需要定義一個watchID,var watchID = watchPosition(...),通過clearWatch(watchID)來停止watchPosition(),使用方法類似setInterval。
相關資料: