一、简介
地理位置特性能够识别你所在的地理位置并且在你允许的情况下,把位置信息分享给别人。
识别地理位置的方法:
-
通过 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()
方法,只能通过定时调用实现。