`
云端有天堂
  • 浏览: 3173 次
  • 性别: Icon_minigender_1
  • 来自: 成都
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

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 的浏览器并不包含这一对象,那么可以通过下面的代码来做能力检测,对不同的浏览器做不同的处理。

if (navigator.geolocation) {
        alert( ' 你的浏览器支持 geolocation ' );
}else{
        alert( ' 你的浏览器不支持 geolocation ' )
}


在访问 geolocation 对象时,即调用 geolocation 下面的方法时,浏览器会弹出提示,询问用户是否许可网站提供的位置服务,只有在得到用户许可过后,服务才会继续,否则将被停止,在稍后你将会了解到,我们能够捕获到用户拒绝服务的动作。下面这张图分别是 Chrome , Firefox 和 Opera 在初次访问 geolocation 时,给用户的提示:





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

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

navigator.geolocation.getCurrentPosition( getPositionSuccess , getPositionError );


在上面的代码中,我们调用了 getCurrentPosition 方法,并为其传递了两个参数,事实上这个方法可以接受三个参数,前两个参数是函数,最后一个是对象:第一个参数是成功获取位置信息的回调函数,它是方法唯一必须的参数;第二个参数用于捕获获取位置信息出错的情况,第三个参数是配置项。

当浏览器成功获取到用户的位置信息时,getCurrentPosition 的第一个函数类型的参数将被调用,一个 position 对象会被传入到调用的函数中,这个对象中包含了浏览器传回的数据,这非常重要。

function getPositionSuccess( position ){
        var lat = position.coords.latitude;
        var lng = position.coords.longitude;
        document.write( "您所在的位置: 经度" + lat + ",纬度" + lng );
}


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

function getPositionSuccess( position ){
        var lat = position.coords.latitude;
        var lng = position.coords.longitude;
        alert( "您所在的位置: 经度" + lat + ",纬度" + lng );
        if(typeof position.address !== "undefined"){
                var country = position.address.country;
                var province = position.address.region;
                var city = position.address.city;
                alert(' 您位于 ' + country + province + '省' + city +'市');
        }
}


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

function getPositionError(error){
	switch(error.code){
		case error.TIMEOUT :
			alert( " 连接超时,请重试 " );
			break;
		case error.PERMISSION_DENIED :
			alert( " 您拒绝了使用位置共享服务,查询已取消 " );
			break;
		case error.POSITION_UNAVAILABLE : 
			alert( " 亲爱的火星网友,非常抱歉,我们暂时无法为您所在的星球提供位置服务 " );
			break;
	}
}


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

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

navigator.geolocation.getCurrentPosition( getPositionSuccess , getPositionError,{
        timeout : 5000    // 5 秒超时
} );



3. 持续追踪位置 --- watchPosition

对于使用移动设备的用户来说,位置并不是固定的,W3C 当然也考虑到了这一点,watchPosition 是一个专门用来处理这一情况的方法,watchPosition 被调用后,浏览器会跟踪设备的位置,每一次位置的变化,watchPosition 中的代码都将会被执行。对于致力于移动设备 web 开发的同学来说,这个方法是及其重要的,它也许将会改变 web 移动客户端的格局。

navigator.geolocation.watchPosition( refreshPosition );


上面的代码表示,但设置位置发生改变时,refreshPosition 将会被调用。事实上 watchPosition 和 getCurrentPosition 几乎一模一样,同样包含了一个成功获取位置的回调函数,一个获取失败的回调函数和一个配置项,区别仅仅是在触发的时机上。所以具体的方法就不再重复了。上面的代码表示在每一次位置发生改变时,调用 refreshPosition 函数。


4. 实例 --- 与 Google Map 交互

接下来,我们通过一个实例,来具体应用一下 Geolocation ,实例的最终效果是,获取用户的位置,并通过 Google Map 在地图上标记出来,当用户的位置发生改变后,更新之前在地图上的标记到新的位置。首先我们准备好 DOM,并加载 Google Map。

<!-- 按钮,被点击时开始获取用户位置信息 -->
<input type="button" id="getPos" value="获取我的位置" />
<!-- 用来存放反馈给用户信息的 div -->
<div id="info"></div>
<!-- 为 Google Map 准备 -->
<div id="map"></div>
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false" ></script>


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

var dom = {
        btn : document.getElementById('getPos'),
        info : document.getElementById('info'),
        map : document.getElementById('map')
};
var gmap = {
        map : null,
        marker : null
}


接下来监听按钮的事件,当按钮被点击的时候,将触发获取用户的位置信息。在这里我们对浏览器进行了检测,如果不支持 Geolocation 接口,将提示用户,并停止进一步的动作。

dom.btn.onclick = function(){
        if (navigator.geolocation) {
                dom.info.innerHTML = "请等待查询结果返回";
                dom.info.className = "warn";
                navigator.geolocation.getCurrentPosition(getPositionSuccess,getPositionError,{timeout:5000});
        }else {
                dom.info.innerHTML = "抱歉,您所使用的浏览器不支持 Geolocation 接口";
                dom.info.className = "warn";
        }
}


在上面我们向 getCurrentPosition 传递了两个函数,现在我们来具体写这两个函数,首先是 getPositionSuccess ,当成功获取到用户的位置信息时,这个函数被调用,我们将在这时更新页面上的显示值,并配置追踪用户的位置的函数,最后调用 Google Map 的 API 在 id 为 map 的 div 中显示地图,并在地图上标记出用户的当前位置。

function getPositionSuccess(position){
	var lat = position.coords.latitude;
	var lng = position.coords.longitude;
        dom.info.innerHTML = "您所在的位置: 经度" + lat + ",纬度" + lng;
	navigator.geolocation.watchPosition(refreshPosition);
 
	// 载入 Google 地图
	var latlng = new google.maps.LatLng(lat, lng);
	var myOptions = {
		zoom : 16,
		center : latlng,
		mapTypeId : google.maps.MapTypeId.ROADMAP
	};
	gmap.map = new google.maps.Map(document.getElementById("map"), myOptions);
 
	// 向地图中添加标记
	gmap.marker = new google.maps.Marker({
		position: latlng,
		map: gmap.map
	});
}


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

function refreshPosition(position){
	var lat = position.coords.latitude;
	var lng = position.coords.longitude;
	var latlng = new google.maps.LatLng(lat, lng);
 
        // 重设地图位置
	gmap.map.setCenter(latlng);
	dom.info.innerHTML = '您所在的位置: 经度' + lat ' + ',纬度' + lng;
 
        // 重设标记位置
	gmap.marker.setOptions({
		position: new google.maps.LatLng(lat, lng)
	});
}


以上关于 Google Map 的代码不是很了解的同学可以到 Google Code 去看一下 手册,这里只是很简单的应用,有兴趣的同学可以进一步延伸。


这个 Demo 在具备 GPS 功能的手机上,能够非常精确地定位,在我的测试中,在信号良好的地方,基本上能够定位到所在地方,并且位置追踪工作良好。下面是我在手机上浏览本 Demo 的效果,平台是 S60v5 ,浏览器 Opera Mobile 10.1 beta 1。需要说明一点的是,Opera Mobile 正是从这个版本开始支持 Geolocation 的。




------------------------------------------------------------------------------------------------
参考资料:
------------------------------------------------------------------------------------------------
    * W3C Geolocation API
    * Safari Reference Library
    * MDC --- Geolocation
    * Google Map Api
  • 大小: 95 KB
  • 大小: 58.8 KB
分享到:
评论

相关推荐

    基于Html5 中 geolocation API 开发的交友应用网站.zip

    API包括`navigator.geolocation`对象,其中`getCurrentPosition()`和`watchPosition()`方法用于获取和持续追踪位置。 2. Web应用开发:基于HTML5的交友应用可能涉及到用户注册、登录、个人资料创建,以及基于位置的...

    geolocation-core

    总结,"geolocation-core"项目是Go语言在地理定位领域的实践,它结合了Go语言的优势,提供了高效、可靠的定位服务。无论是开发者还是企业,都可以通过学习和利用该项目,提升地理定位相关应用的性能和用户体验。

    基于H5开发的动漫App后端基于Pythonflask.zip

    《基于H5开发的动漫App后端基于Python Flask》 在现代互联网应用开发中,H5(HTML5)已经成为构建富媒体、交互性强的Web应用的首选技术,而Python Flask框架则是后端开发中的轻量级明星。本项目将探讨如何结合两者...

    基于h5 ajax实现手机定位(demo)

    【基于H5 AJAX实现手机定位】的Demo是一个利用HTML5的Geolocation API获取手机地理位置信息,并结合AJAX技术展示在网页上的示例。这个Demo旨在帮助开发者了解如何在移动设备上实现无感知的位置追踪,但同时也面临...

    主要是基于网页前端开发技术!

    浏览器提供的Web APIs扩展了JavaScript的功能,例如,Fetch API用于异步请求数据,WebSocket创建持久的双向通信通道,Web Storage和IndexedDB提供本地数据存储,Geolocation API获取用户位置信息,Web Audio API处理...

    web-mobile:它包含用于创建服务和跟踪您的位置的所有文件

    综上所述,"web-mobile"项目是一个基于Java的Web应用程序,专注于构建支持移动设备的地理定位服务。它可能包含一个完整的前后端架构,允许用户通过移动浏览器访问服务并追踪他们的位置。开发者可以利用这个项目来...

    cm_Openlayers-master.rar

    它支持多种地图服务,包括WMS、WMTS、TMS等,同时也支持矢量图层和GeoJSON数据格式。OpenLayers的核心在于其强大的图层管理和交互事件处理能力,使得开发者能够轻松地创建复杂的地图交互功能。 二、地图布点 地图...

    闪亮追踪者

    5. 定位服务:利用浏览器的Geolocation API,JavaScript可以获取用户的地理位置,帮助玩家找到附近的闪亮宝可梦。 6. 消息通知:如果用户设置了提醒,JavaScript可以通过Web推送通知或者其他类似技术,在发现新闪亮...

    store-location-js

    1. **地理位置API**:在JavaScript中,我们可以使用`navigator.geolocation`对象来访问设备的地理位置信息。这个API允许网页获取用户的实时经纬度,这对于创建与地理位置相关的应用非常有用,比如地图服务、附近搜索...

    Firefox火狐浏览器官方3.5.6-win32版本exe安装包

    《Firefox火狐浏览器3.5.6-win32版本:深度解析与应用指南》 Firefox火狐浏览器,作为全球最受欢迎的开源网络浏览器之一,由Mozilla基金会开发,以其强大的功能、高度的可定制性和对用户隐私的重视而备受赞誉。本文...

    iss_spotter

    "iss_spotter"项目是一个基于JavaScript的开源应用,主要用于追踪国际空间站(ISS)的实时位置。这个项目可能是一个Web应用程序,用户可以通过浏览器查看ISS的当前位置,预测它何时会飞过自己的头顶。JavaScript作为...

    Live-Visitor-Tracker:从WordPress仪表板跟踪访问者的位置

    为了获取访客的位置信息,插件可能利用了IP定位服务或浏览器的Geolocation API。IP定位服务通过IP地址解析出访客的大致地理位置,而Geolocation API则需要用户的许可,能提供更精确的GPS坐标。此外,为了跟踪用户...

    Weather_App-

    7. **地理定位API**:为了提供用户当前位置的天气,应用可能利用了浏览器的Geolocation API获取用户的经纬度,然后根据这些信息查询相应的天气信息。 8. **API调用**:获取天气数据通常需要调用第三方天气API,如...

    schoolWater_caught66v_h5_antsbog_二维码扫描_

    而"caught66v"可能是该项目或服务的版本号,这在软件开发中是常见的命名方式,用来追踪不同阶段的产品变化。 "H5",全称HTML5,是HTML的最新版本,提供了许多增强的特性,如离线存储、媒体元素、 canvas 绘图、SVG...

    超简单的天气预报,取于中国天气网

    10. **地理定位**: 若项目支持自动获取用户所在地的天气,可能利用浏览器的Geolocation API或IP定位服务来确定用户的大致位置,然后基于此位置请求天气信息。 通过这个简单的天气预报项目,我们可以学习到API调用、...

    由原生js编写的网络测试工具,可测试您的网速,多地查询您的IP地址,同时具备网络延迟实时检测,流量杀手,流量消耗器,流量消失器

    2. **多地查询IP地址**:利用第三方API(如IP Geolocation服务)获取用户的地理位置信息,并显示其IP地址。这些API通常返回包含用户IP地址、城市、国家等信息的JSON数据。 3. **网络延迟实时检测**:通过ping测试来...

    weather-dashboard

    - Geo定位:利用浏览器的Geolocation API获取用户当前位置,以便显示当地天气。 5. **响应式设计**: - 适应不同设备:确保天气仪表板在手机、平板和桌面电脑上都能正常显示和操作,这可能需要对CSS媒体查询的...

    driver-tracker

    4. **地理定位**:由于是追踪驾驶员,项目可能利用了浏览器的Geolocation API来获取设备的位置信息,用于实时显示车辆位置或路径规划。 5. **地图API**:如Google Maps API或Leaflet等地图库可能被用于显示地图和...

    Getip-Omegle:Getip-Omegle-捕获Omegle用户的IP和地理位置的JS脚本

    Getip-Omegle的实现可能还涉及到了一些其他的技术,例如IP反向解析服务,它们能够根据IP地址查询到对应的地理位置信息。这些服务通常由第三方提供,开发者通过调用API接口,传递IP地址,然后获取到详细的地理位置...

Global site tag (gtag.js) - Google Analytics