html5 笔记4 地理定位(Geolocation)

时间:2022-11-22 15:29:14

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 ,可以被清除掉。

clearWatch() :清除watchPosition,参数为watchPosition返回的ID值。