一、簡介
地理位置特性能夠識別你所在的地理位置并且在你允許的情況下,把位置信息分享給別人。
識別地理位置的方法:
-
通過 IP 地址
- 只能用于電腦上的位置信息定位
-
利用基站獲取去收集網絡的介入位置
- 大致位置,不夠精確
- 精確到用戶所屬的城市街區,獲取用戶房源一公里的范圍內
-
通過衛星定位獲得經緯度信息的 GPS 設備
- 幾米的誤差內準確定位
- 專用 GPS 芯片耗電快
- GPS 芯片默認關閉,開啟需要時間,有延遲
注意:瀏覽器必須要在用戶允許的情況下才可以發送用戶的位置信息給服務器。
二、地理位置 API
2.1 調用位置函數
function get_location() {
navigator.geolocation.getCurrentPosition(show_map, handle_error, PositionOptions);
}
全局對象 navigator
的 geolocation
屬性的 getCurrentPosition()
方法,會觸發瀏覽器彈出信息條,讓用戶確定是否分享地理位置。
-
show_map
是成功獲取位置的回調函數,必須 -
handle_erro
r 是獲取地理位置失敗的回調函數,可選 -
PositionOptions
是獲取地理位置的設置對象,可選
2.2 show_map 獲取地理位置
function show_map(position) {
var latitude = position.coords.latitude;//獲取緯度
var longitude = position.coords.longitude;//獲取經度
}
這個回調函數要傳入一個 position
對象,就是獲取到的位置信息。
position
對象的屬性:
-
coords.latitude
緯度,度 -
coords.longtitude
經度,度 -
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;
}
}
這個容錯處理的回調函數會傳入一個 PositionError
對象作為參數,上面例子中是 err
。
PositionError 對象:
-
code
錯誤類型,屬性值為:-
err.PERMISSION_DENIED
或者1
:用戶點擊了信息條的“不共享”按鈕或者直接拒絕被獲取位置信息。 -
err.POSITION_UNAVAILABLE
或者2
:網絡不可用或者無法連接到獲取位置信息的衛星。 -
err.TIMEOUT
或者3
:網絡可用但是花了太長的時間去計算。 -
err.UNKNOWN_ERROR
或者0
:發生其他未知錯誤。
-
-
message
錯誤信息,與終端用戶無關
2.4 PositionOptions 對象設置
navigator.geolocation.getCurrentPosition(show_map, handle_error, {enableHighAccuracy: true,timeoout: 175000, maximumAge: 75000})
屬性:
-
enableHighAccuracy
開啟高精度定位,默認 false -
timeout
獲取用戶位置信息的最長等待時間,指網絡請求時間,毫秒 -
maximumAge
允許用戶將一定時間內緩存的位置信息快速返回給 Web 應用,默認 0,毫秒
2.5 watchPosition() 持續獲取
watchPosition()
方法與 getCurrentPosition()
方法結構相同
你不用主動獲取用戶位置信息,每次用戶位置改變,這些回調函數就會調用。設備會確定一個最佳的時間間隔,定時檢測用戶位置的改變。
watchPosition()
方法會返回一個數字,將它保存下來,當你想停止監測用戶位置時就可以調用clearWatch()
方法,傳入保存的數字作為參數。
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,提供統一的調用接口。
準備:
<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()
方法,只能通過定時調用實現。