HTML5获取用户地理位置信息 经纬度等信息
我们在浏览一些团购网站或者本地生活网站,经常会发现手机端弹出一个确认窗,让你点击共享位置信息,这个就是通过HTML5来实现的,点击后,网站就能获取到你手机的GPS定位或者基站定位信息。
HTML5提供了地理位置定位功能(Geolocation API),能确定用户位置,我们可以借助HTML5的该特性开发基于地理位置信息的应用。
这里提供实例给大家分享如何使用HTML5,并提供实例来借助百度、谷歌地图等接口来获取用户准确的地理位置信息。
定位功能(Geolocation)是HTML5的新特性,因此只有在支持HTML5的现代浏览器上运行,特别是手持设备如iphone,地理定位更加精确。
首先我们要检测用户设备浏览器是否支持地理定位,如果支持则获取地理信息。这个特性可能侵犯用户的隐私,因此在客户端都会先弹出一个提示,需要用户点同意后才能获取到信息,所以我们在访问该应用时会提示是否允许地理定位,我们当然选择允许即可,电脑端操作也是如此。
这些位置信息是从何而来的呢?ip地址,GPS全球定位,wifi无线网络,基站。如果通过ip去定位的话,可能这个位置信息就不是那么准确,因为国内大部分都是用户IP都是一直变动,IP只能得到一个较大范围的区域,比如精确到县级,再往下精确度就很难达成。现在移动端手机一般获取到的位置信息都是基于GPS或者基站定位。基站定位可以精确到街道,GPS则能精确到米级。
接下来我们一起来了解获取地理位置信息的API,这个对象是:
navigator.geolocation
这个对象底下有单次定位请求的方法和多次定位请求的方法。我们先看一下单次定位请求的方法:
getCurrentPosition(请求成功,请求失败,数据手机方式)
这个方法里面有三个参数,其中第一个请求参数是请求成功的回调函数,这个成功的回调函数里面可以获得很多的位置属性,如下:
?经度: coords.longitude ?纬度: coords.latitude ?海拔: coords.altitude ?海拔准确度: coords.altitudeAcuracy ?行进方向: coords.heading ?地面速度: coords.speed ?时间戳: new Date(position.timestamp)
第二个请求参数是请求失败的回调参数,请求失败有很多因素,回调参数里有个code属性就分别表示失败的原因:
?失败编号 :code ?0 : 不包括其他错误编号中的错误 ?1 : 用户拒绝浏览器获取位置信息 ?2 : 尝试获取用户信息,但失败了 ?3 : 设置了timeout值,获取位置超时了
第三个参数表示的是数据的一个收集,这是JSON格式的,分别有以下形式:
?enableHighAcuracy : 更精确的查找,默认false ?timeout : 获取位置允许最长时间,默认infinity ?maximumAge : 位置可以缓存的最大时间,默认0
下面来个实际案例:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>无标题文档</title> <style> div{width:400px;height:400px;border:1px solid black;} </style> <script> window.onload = function(){ var oInput = document.getElementById('in1'); var oDiv = document.getElementById('box1'); oInput.onclick = function(){ window.navigator.geolocation.getCurrentPosition(function(position){ var longitude = position.coords.longitude; var latitude = position.coords.latitude; var altitude = position.coords.altitude; var altitudeAcuracy = position.coords.altitudeAcuracy; var heading = position.coords.heading; var speed = position.coords.speed; var data = new Date(position.timestamp); oDiv.innerHTML = '经度:'+longitude+'/n纬度:'+latitude+'/n海拔'+altitude+"altitudeAcuracy"+altitudeAcuracy+"/n行走方向"+heading+'/n地面速度'+speed+'/n时间戳'+data; },function(err){ alert(err.code); },{ timeoenableHighAcuracy:false, timeout : 5000, maximumAge :5 }); }; }; </script> </head> <body> <input type='button' value='获取地理位置信息' id='in1' /> <div id='box1'> </div> </body> </html>
接下来我们再看一下多次定位请求的方法:
watchPosition(像setInterval)
?移动设备有用,位置改变才会触发
?配置参数:frequency 更新的频率
关闭更新请求 :
clearWatch(像clearInterval)
再来个实例:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>无标题文档</title> <script> //LBS : 基于地图信息的应用 window.onload = function(){ var oInput = document.getElementById('input1'); var oT = document.getElementById('t1'); var timer = null; oInput.onclick = function(){ timer = navigator.geolocation.watchPosition(function(position){ oT.value += '经度:' + position.coords.longitude+'\n'; oT.value += '纬度 :' + position.coords.latitude+'\n'; oT.value += '准确度 :' + position.coords.accuracy+'\n'; oT.value += '海拔 :' + position.coords.altitude+'\n'; oT.value += '海拔准确度 :' + position.coords.altitudeAcuracy+'\n'; oT.value += '行进方向 :' + position.coords.heading+'\n'; oT.value += '地面速度 :' + position.coords.speed+'\n'; oT.value += '时间戳:' + new Date(position.timestamp)+'\n'; },function(err){ //err.code // 失败所对应的编号 alert( err.code ); navigator.geolocation.clearWatch(timer); },{ enableHighAcuracy : true, timeout : 5000, maximumAge : 5000, frequency : 1000 }); }; }; </script> </head> <body> <input type="button" value="请求" id="input1" /><br /> <textarea id="t1" style="width:400px; height:400px; border:1px #000 solid;"> </textarea> </body> </html>
最后,我们来看一下连接百度地图接口,做一个百度地图应用的实例:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>无标题文档</title> <style> #div1{ width:400px; height:400px; border:1px #000 solid;} </style> <script src="http://api.map.baidu.com/api?v=1.3"></script> <script> window.onload = function(){ var oInput = document.getElementById('input1'); oInput.onclick = function(){ navigator.geolocation.getCurrentPosition(function(position){ var y = position.coords.longitude; var x = position.coords.latitude; var map = new BMap.Map("div1"); var pt = new BMap.Point(y, x); map.centerAndZoom(pt, 14); map.enableScrollWheelZoom(); var myIcon = new BMap.Icon("miaov.png", new BMap.Size(30,30)); var marker2 = new BMap.Marker(pt,{icon:myIcon}); // 创建标注 map.addOverlay(marker2); var opts = { width : 200, // 信息窗口宽度 height: 60, // 信息窗口高度 title : "北京航空航天大学" // 信息窗口标题 } var infoWindow = new BMap.InfoWindow("软件学院", opts); // 创建信息窗口对象 map.openInfoWindow(infoWindow,pt); //开启信息窗口 }); }; }; </script> </head> <body> <input type="button" value="请求" id="input1" /> <div id="div1"></div> </body> </html>
- 最新评论