读书人

Geolocation 对象全面解析 - 基于浏览

发布时间: 2012-11-15 15:16:15 作者: rapoo

Geolocation 对象全面解析 --- 基于浏览器的定位与追踪服务
完整阅读本贴,你将能够(在用户的许可之下):
1. 实现基于浏览器(无需后端支持)获取用户的地理位置技术
2. 精确定位用户的地理位置( 精度最高达10m之内,依赖设备 )
3. 持续追踪用户的地理位置
4. 与 Google Map 交互呈现位置信息。

原文地址:http://www.jsmix.com/html5/try-out-geolocation.html

本贴属于 HTML 5 技术范围,目前尚无在 IE 6/7/8 中可行与可替换方案,请专注于 IE 环境下开发,并对新一代 HTML 标准不感冒的同学绕行。

下面的链接指向本贴的最终 Demo ,但是强烈建议在至少看完本贴第一部分后再点击。
------ DEMO ------


1. 关于 Geolocation 对象

随着 Opera 10.6 和 Safari 5的相继发布,截止到目前为止,W3C 中一个名为 Geolocation 的 API 规范在所有非 IE 浏览器中都得到了实现。简单地说,Geoloaction 的作用就是通过浏览器感知用户的地理位置。事实上,对于用户地理位置的探测在互联网上早已经有了很多案例,其中一个最常见的应用就是当在地址栏输入 google.com 并按下回车键的时候,google 并没有把我们带向刚才输入的地址,而是转向了 google 在我们所处地区的页面,比如大陆和香港用户会到达 google.com.hk,当然我们很怀念 google.cn,但这并不是今天所要讨论的话题。

如果说地理位置的感知已经成为了一项成熟的技术,那么紧接着的问题就是 Geolocation 存在的意义是什么?就我目前对 Geolocation 的理解,我认为它存在的理由至少包含以下两点:
1. 公共数据:目前的地理位置探测,其资料往往来源于服务商各自的数据,而使用浏览器内置的统一接口,将高效整合这一信息。
2. 精确定位:无论是谷歌还是谷姐们,实现定位的原理无非是通过 IP 地址来探测用户的所在位置,众所周知,IP 的定位能力是比较差的,绝大多数情况下,它的精确度能达到数十公里就已经不错了,除此之外,没有别的任何办法,无论是服务器端语言还是客户端的 JavaScript 脚本,都无法从用户那里获取到更多对定位有所帮助的信息。然而作为用户机器上更为底层的浏览器,它将有权利支配其他有助于定位的设备,比如 GPS 和 WIFI。GPS 大家都已经很熟悉了,在信号良好的情况下,它可以精确到数米之内。而 WIFI 在国内基本上被废了,对于这项技术普及的国家,WIFI 的定位基本上可以精确到百米左右,据说经常可以见到一些公司的人,整天什么都不干,就开着小车到处晃,到一个热点( Hot Spot ),就记录下当前的地理位置,然后传回到公司的数据库。

该对象位于我们非常熟悉的 Navigator 对象下面,可以通过 navigator.geolocation 来访问,当然前面也可以加上 window.。不支持 geolocation 的浏览器并不包含这一对象,那么可以通过下面的代码来做能力检测,对不同的浏览器做不同的处理。




2. 获取当前地理位置 --- getCurrentPosition

当获得用户的许可过后,便一切就绪。我们将通过 geolocation 下的 getCurrentPosition 方法来获取用户的信息,这个方法是今天整篇文章的核心部分,也是 geolocation 一个非常重要的方法。



是的,position 对象包含了用户的地理位置信息,该对象下面的 coords 子对象包含了用户所在的纬度和经度信息,通过 position.coords.latitude 可以访问纬度,而 position.coords.longitude 中存放了经度的信息,用户的位置信息越精确,这两个数字后面的小数点越长。事实上,在 Firefox 中,position 对象下还附带有另一个 address 对象,这个对象包含这个经纬度下的国家名,城市名甚至街道名。



错误捕获:上面都是成功获取到用户位置信息的处理,但是出现问题的情况在所难免,当获取用户的位置信息出错时,传递到 getCurrentPosition 的第二个函数类型参数被调用,一个包含具体出错信息的对象会被传递进去,错误将被捕获。



error 对象下面,存放了3个常量:
TIMEOUT 表示获取信息超时。
PERMISSION_DENIED 表示用户选择了拒绝了位置服务。
POSITION_UNAVAILABLE 表示位置不可知。
而每一次出错时 error.code 将指向3个常量之中的一个。

配置项:getCurrentPosition 方法的第三个参数是一个对象,该对象影响了获取位置时的一些细节。
enableHighAccuracy ,它将告诉浏览器是否启用高精度设备,所谓的高精度设备包含但不局限于前面所提到的 GPS 和 WIFI,值为 true 的时候,浏览器会尝试启用这些设备,默认指为 true。
timeout,超时,获取位置信息时超出设定的这个时长,将会触发错误,捕获错误的函数将被调用,并且错误码指向TIMEOUT。
这样我们尝试修改调用 getCurrentPosition 时传递的参数



接下来我们在 JavaScript 中获取这些 DOM,并为 Google Map 提供一个对象用来存放地图和标记。这些都是准备工作,很烦,但是不得不做。



对于错误处理的函数,则非常简单,可以参看前面的内容。我们来关注一下追踪位置的函数,在这个函数中,我们实时更新显示信息,并更新地图到用户所处的位置。



------------------------------------------------------------
参考资料:
------------------------------------------------------------
* W3C Geolocation API
* Safari Reference Library
* MDC --- Geolocation
* Google Map Api

读书人网 >Web前端

热点推荐