1、位置信息前述
请求一个位置信息,浏览器返回位置信息(用户同意)。该位置信息通过支持HTML5地理定位功能的底层设备提供给浏览器的。位置信息由维度、经度坐标和一些其它的元数据组成。这些信息就可以定位到具体的位置。
元素据包括海拔、海拔准确度、行驶方向和速度等(具体的取决于浏览器所在的硬件设备),如果这些元数据不存在则返回null。html5 位置api不指定设备使用的是哪种底层及时来定位,只是用于检索位置信息的api,而且不能呢个保证完全的准确性。
2、定位数据源
1)IP地址定位数据
自动查找用户的IP地址,然后检索其注册的物理地址(如果IP地址由isp提供,显示的是isp的地址)。
优点:任何地方都可用;在服务器端处理
缺点:不精确;运算代价大
2)GPS地理定位数据
定位精准;但是定位时间长(不适合需要快速响应的应用程序),室内效果不好。
3)Wi-Fi地理定位数据
通过三角距离计算出来的,三角距离指的是用户当前位置到已知的多个wi-fi接入点的距离。
优点:精准、在室内的效果也蛮好的、简单快速
缺点:在wi-fi无线接入点的地区效果不好
4)手机地理定位数据
通过用户到一些基站的三角距离确定的。通常同基于wi-fi和基于gps的地理定位结合使用。
优缺点和通过wi-fi方式的类似。
5)用户自定义的地理定位数据
用户输入自己的地址、邮政编码和其他一些详细信息,应用程序可以利用这些信息来提供位置感知服务。
优点:用户可获得比程序定位服务更精确的位置、速度更快
缺点:在实际的使用中,无法提供这些详细信息
3、隐私控制
1)用户从浏览器中打开位置感知应用程序;
2)应用程序web页面加载,然后通过Geolocation函数调用请求位置坐标。
3)浏览器拦截位置请求,请求用户授权;
4)浏览器从其宿主设备中检索坐标定位所需数据(浏览器内部实现);
5)浏览器将坐标发送给受信任的外部定位服务,并将该位置信息发回给应用程序
4、浏览器支持性检查
function loadDemo() {
if(navigator.geolocation) {
document.getElementById("status").innerHTML = "HTML5 Geolocation is supported in your browser.";
} else{
document.getElementById("status").innerHTML = "HTML5 Geolocation is not supported in your browser.";
}
}
如果存在地理定位对象,navigator.geolocation调用将返回该对象,否则将触发错误。
5、单次定位请求
getCurrentPosition():用来获取用户当期的位置信息
successCallback:成功获取用户位置信息后的回调函数。带一个参数,位置对象,表示获取到的用户位置数据。该对象包含两个属性coords和timestamp。
其中 coords 属性包含以下7个值:
1、accuracy:精确度
2、latitude:纬度
3、longitude:经度
4、altitude:海拔
5、altitudeAcuracy:海拔高度的精确度
6、heading:朝向
7、speed:速度
errorCallback:获取用户位置信息失败时的回调函数。有一个参数,位置对象,表示返回的错误代码。包含两个属性message和code
其中错误代码包括以下四个值:
0 — UNKNOW_ERROR:表示不包括在其它错误代码中的错误,这里可以在 message 中查找错误信息
1 — PERMISSION_DENIED:表示用户拒绝浏览器获取位置信息的请求
2 — POSITION_UNAVALIABLE:表示网络不可用或者连接不到卫星
3 — TIMEOUT:表示获取超时。必须在options中指定了timeout值时才有可能发生这种错误
positionOptions:数据格式为json,包含三个可选属性:
enableHighAccuracy:布尔值,表示是否启用高精度模式(启用的话,会耗费更多的时间)
timeout:整数,表示浏览器在指定的时间内获取位置信息,否则触发errorCallback
maximunAge:整数,表示浏览器重新获取位置信息的时间间隔
<script type="text/javascript">
function showLocation(position) {
var latitude = position.coords.latitude;
var longitude = position.coords.longitude;
alert("Latitude : " + latitude + " Longitude: " + longitude);
}
function errorHandler(err) {
if(err.code == 1) {
alert("Error: Access is denied!");
}else if( err.code == 2) {
alert("Error: Position is unavailable!");
}
}
function getLocation(){
if(navigator.geolocation){
var options = {timeout:60000};
navigator.geolocation.getCurrentPosition(showLocation,
errorHandler,
options);
}else{
alert("Sorry, browser does not support geolocation!");
}
}
</script>
6、重复性的位置更新请求
watchPosition():这个方法和getCurrentPosition()完全一样,不同的是watchPosition()可以实时获取用户的位置信息,只要发生变化,浏览器就会触发watchPosition的回调函数。成功则触发successCallback,否则触发errorCallback。
和 getCurrentPosition 不同的地方就是有返回值。类似于延迟函数/间隔函数(setTimeout/setInterval)那样,返回一个 ID ,可以被清除掉。