一无埃、簡介
地理位置特性能夠識別你所在的地理位置并且在你允許的情況下徙瓶,把位置信息分享給別人。
識別地理位置的方法:
-
通過 IP 地址
- 只能用于電腦上的位置信息定位
-
利用基站獲取去收集網(wǎng)絡的介入位置
- 大致位置嫉称,不夠精確
- 精確到用戶所屬的城市街區(qū)侦镇,獲取用戶房源一公里的范圍內(nèi)
-
通過衛(wèi)星定位獲得經(jīng)緯度信息的 GPS 設備
- 幾米的誤差內(nèi)準確定位
- 專用 GPS 芯片耗電快
- GPS 芯片默認關閉,開啟需要時間织阅,有延遲
注意:瀏覽器必須要在用戶允許的情況下才可以發(fā)送用戶的位置信息給服務器壳繁。
二、地理位置 API
2.1 調(diào)用位置函數(shù)
function get_location() {
navigator.geolocation.getCurrentPosition(show_map, handle_error, PositionOptions);
}
全局對象 navigator
的 geolocation
屬性的 getCurrentPosition()
方法荔棉,會觸發(fā)瀏覽器彈出信息條闹炉,讓用戶確定是否分享地理位置。
-
show_map
是成功獲取位置的回調(diào)函數(shù)润樱,必須 -
handle_erro
r 是獲取地理位置失敗的回調(diào)函數(shù)渣触,可選 -
PositionOptions
是獲取地理位置的設置對象,可選
2.2 show_map 獲取地理位置
function show_map(position) {
var latitude = position.coords.latitude;//獲取緯度
var longitude = position.coords.longitude;//獲取經(jīng)度
}
這個回調(diào)函數(shù)要傳入一個 position
對象壹若,就是獲取到的位置信息嗅钻。
position
對象的屬性:
-
coords.latitude
緯度,度 -
coords.longtitude
經(jīng)度店展,度 -
coords.altitude
海拔养篓,米 -
coords.accuracy
精確度,米 -
coords.altitudeAccuracy
海拔精確度赂蕴,米 -
coords.heading
方向柳弄,度,順時針概说,以正北為基準 -
coords.speed
速度碧注,米/秒 -
timestamp
時間戳,類似 Date() 對象
只有前三個屬性確保不為空席怪,其余屬性因用戶的設備和后臺定位服務器的不同应闯,可能屬性值為 null
纤控,其中 heading
挂捻、speed
是基于用戶前一次位置信息計算所得的。
2.3 handle_error 容錯處理
function handle_error(err) {
switch(err.code) {
case err.PERMISSION_DENIED:
//用戶拒絕對獲取地理位置的請求船万。
break;
case err.POSITION_UNAVAILABLE:
//位置信息是不可用的刻撒。
break;
case err.TIMEOUT:
//請求用戶地理位置超時骨田。
break;
case err.UNKNOWN_ERROR:
//未知錯誤。
break;
}
}
這個容錯處理的回調(diào)函數(shù)會傳入一個 PositionError
對象作為參數(shù)声怔,上面例子中是 err
态贤。
PositionError 對象:
-
code
錯誤類型,屬性值為:-
err.PERMISSION_DENIED
或者1
:用戶點擊了信息條的“不共享”按鈕或者直接拒絕被獲取位置信息醋火。 -
err.POSITION_UNAVAILABLE
或者2
:網(wǎng)絡不可用或者無法連接到獲取位置信息的衛(wèi)星悠汽。 -
err.TIMEOUT
或者3
:網(wǎng)絡可用但是花了太長的時間去計算。 -
err.UNKNOWN_ERROR
或者0
:發(fā)生其他未知錯誤芥驳。
-
-
message
錯誤信息柿冲,與終端用戶無關
2.4 PositionOptions 對象設置
navigator.geolocation.getCurrentPosition(show_map, handle_error, {enableHighAccuracy: true,timeoout: 175000, maximumAge: 75000})
屬性:
-
enableHighAccuracy
開啟高精度定位,默認 false -
timeout
獲取用戶位置信息的最長等待時間兆旬,指網(wǎng)絡請求時間假抄,毫秒 -
maximumAge
允許用戶將一定時間內(nèi)緩存的位置信息快速返回給 Web 應用,默認 0丽猬,毫秒
2.5 watchPosition() 持續(xù)獲取
watchPosition()
方法與 getCurrentPosition()
方法結構相同
你不用主動獲取用戶位置信息宿饱,每次用戶位置改變,這些回調(diào)函數(shù)就會調(diào)用脚祟。設備會確定一個最佳的時間間隔谬以,定時檢測用戶位置的改變。
watchPosition()
方法會返回一個數(shù)字愚铡,將它保存下來蛉签,當你想停止監(jiān)測用戶位置時就可以調(diào)用clearWatch()
方法,傳入保存的數(shù)字作為參數(shù)沥寥。
var watch = navigator.geolocation.watchPosition(show_map, handle_error, {enableHighAccuracy: true,timeoout: 175000, maximumAge: 75000})
clearWatch(watch);
2.6 geo.js 兼容性 javascript 庫
geo.js 封裝了 W3C 標準碍舍、Gears 以及移動平臺所提供的各種不同類型的地理位置 API,提供統(tǒng)一的調(diào)用接口邑雅。
準備:
<script src="gears_init.js"></script><!--用于初始化 Gears-->
<script src="geo.js"></script>
使用:
if (geo_position_js.init()) {
geo_position_js.getCurrentPosition(success, error)
}
geo.js
目前不支持 watchPosition()
方法片橡,只能通過定時調(diào)用實現(xiàn)。