Geolocation可以实现对访客地理定位,当然,这种定位并不是说判断用户在那个国家,或是哪个国家的哪个城市,而是确定用户在城市的那个街道上,甚至是用户正在拿着手机在哪里上网,给出这个地点的坐标位置。
下面列出了支持地理定位的浏览器
IE |
Firefox |
Chrome |
Safari |
Opera |
Safari iOS |
Andriod |
|
最低版本 |
9 |
3.5 |
5 |
3 |
10.6 |
3.2 |
2.1 |
问题最严重仍然是IE“老大哥”,比如IE7、IE8,要想在浏览器上实现地理定位功能,可以借助Google Gears,Google Gears只是对老版本浏览器的一个补救措施,Google现放弃对它的维护。补救的方法是:像安装其它浏览器插件一样,让访客在自己的浏览器上安装Google Gears。如果访客计算机中没有安装Google Gears,还可以使用Chrome Fram,或是让访客自己输入当前位置。
地理定位的基本原理
为了得到用户的位置信息,浏览器会争取位置提供商(location provider)的帮助。比如Firefox浏览器使用的是Google Location Services。当然,即使浏览器支持地理定位功能,如果你不允许,也不会把你的位置透漏给浏览器。
对于通过网线(不是无线)上网的桌面计算机来说,办法很简单,就是定位不太准确。用户一上网,他的信息就会通过双绞线在计算机或本地网上传输。这个设备有唯一的IP地址(注意地理定位不使用局域网内的私有IP地址),靠这个IP就能在Internet上找到他。与IP地址对应,还有一个现实中的邮政编码。
位置提供商会把这两个信息综合起来。首先,找到你连接的IP地址,然后,确定使用该IP地址的路由器的位置。因为这个信息是间接的,所以使用桌面计算机的地理定位并不准确,但毕竟可以确定你所在的街道的位置。
如果使用笔记本或是移动设备无线上网,位置提供商会寻找你附近的无线接入点。理想情况下,位置提供商会查询一个大型数据库,以确定你周围几个接入点的确切位置,然后再使用三角测量法算出你的位置。
如果是使用手机上网,位置提供商还会采用类似的三角测量法,但是使用的信号发射塔的位置。经过迅速而相对准确的计算,最终得到的位置误差大约在1000米左右。如果在高楼林立的市中心,由于信号发射塔相对较多,地理定位的结果也会更准确。
还有很多的移动设备都配有专用的GPS组件,GPS使用的是卫星定位,误差只有几米。但GPS速度慢,耗电多。而且GPS在高楼林立的地区不好使,因为高大的建筑会屏蔽信号。
另外还有其它的技术可以用于地理定位。位置提供商会想更多的办法获得位置信息,比如RFID芯片、蓝牙设备以及Google Maps设置的cookie等。
注意,无论你通过什么方式上网―就算是台式机,地理定位都可以大概找到你。而如果使用能接受电话信号或是配有GPS芯片的设备,地理定位的坐标的准确性更是惊人。
查找访客的坐标
地理定位的功能实际上是非常简单的,主要就是navigator.geolocation对象的三个方法:
getCurrentPosition();
watchPosition();
clearWatch();
getCurrentPosition()方法取得访客的位置。当然,查找位置不会立即返回结果,浏览器也不想锁定页面等待位置数据。所以getCurrentPosition()方法是异步,它会立即执行,但不会阻塞其它的代码。完成地理定位后,它会触发另一段代码来处理返回的结果。
测试地理定位的时候,需要使用支持地理定位的浏览器(我使用的Firefox),并且允许网页访问你的数据。在学会使用错误处理和地理定位设置的知识。
错误处理
如果访客不愿意共享他们的位置数据,那地理定位就不会返回位置信息。在这样的情况下,根本不会调用完成函数,而页面也没有办法告诉你浏览器是在继续挖掘数据,还是遇到了错误。为解决这个问题,可以在调用getCurrentPosition()时传入两个参数,第一个是函数在页面成功取得数据时调用,第二个函数在地理定位因错误而终止时调用。
以下是一个同时传入完成函数和错误函数的例子:
window.onload = function() { results = document.getElementById("results"); var myOptions = { zoom: 13, mapTypeId: google.maps.MapTypeId.ROADMAP }; map = new google.maps.Map(document.getElementById("mapSurface"), myOptions); if (navigator.geolocation) { navigator.geolocation.getCurrentPosition( geolocationSuccess, geolocationFailure ); results.innerHTML = "定位已开始."; } else { results.innerHTML = "该浏览器不支持地理定位"; } }; function geolocationSuccess(position) { results.innerHTML = "你的位置("+position.coords.latitude+","+position.coords.longitude+")"; } function geolocationFailure(positionError) { results.innerHTML = "地理定位失败"; }
调用错误函数时,浏览器会给错误函数传入一个错误对象,这个对象有两个属性:code和message。code属性是一个数值,表示问题类型;message中包含着对问题的简短描述。一般来说,message属性多用于测试,而code属性用于确定如何进行下一步的处理。下面是修改后的错误函数,检测了code属性所有可能的值:
function geolocationFailure(positionError) { if (positionError.code == 1) { results.innerHTML = "你已拒绝位置信息共享"; } else if (positionError.code == 2) { results.innerHTML = "网络连接失败或位置服务不可用。"; } else if (positionError.code == 3) { results.innerHTML = "获取位置超时,请重试。"; } else { results.innerHTML = "Sorry !发生未知的错误。"; } }