地图在我们日常出行中必不可少,由于纸质地图的更新慢、非动态,查询费时,所以那个年代早已一去不复返。现代网络地图已经强大到足够满足我们日程需求,特别是你在地图上查找位置时,它会智能的给你提供路线方案和路程时间。你也用它来更新你当前位置的信息,虽然耗流量,但的确是一款非常不错的应用。

在HTML5中定义了geolocation,它可以获取当前地址位置的经度、维度、准确度、海拔、海拔准确度、行进方向、地面速度、时间戳诸类特性。如果使用geolocation结合百度地图API还能获取你周围的地图信息。

那么HTML5中geolocation是如何获取地理信息的呢?主要是通过以下几种方式:

  • IP地址
  • 基站
  • GPS全球定位系统
  • wifi无线网络

这里需要注意,使用geolocation前,浏览器会提醒你,是否共享你的位置信息。只有共享后才能使用geolocation的相关功能。如果要在手机上使用geolocation获取很准确的位置,则您的手机必须有GPS。

geolocation 函数

geolocation 定义了三个函数,分别是getCurrentPosition()、watchPosition()和clearWatch(),接下来逐个介绍:

getCurrentPosition()

getCurrentPosition函数可接受三个参数,分别是地理位置获取成功的处理,地理位置获取失败的处理,以及地理位置获取的相关设置,返回的是一组数据。当然这里接受的参数名你也可自定义:

getCurrentPosition(locationSuccess,locationFail,positionOptions);

然后我们分别来介绍着三个参数:

locationSuccess—-获取地理位置成功后,我们可以进一步获取地理位置的相关属性 :

属性 描述
coords.longitude 经度
coords.latitude 维度
coords.accuracy 位置的准确度
coords.altitude 海拔
coords.altitudeAcuracy 海拔准确度
coords.heading 移动方向
coords.speed 移动速度
new Date(Position.timestamp) 相应时间
function locationSuccess(position) {
  var positionInfo="", posCoords=position.coords;

  positionInfo += "经度:"+posCoords.longitude+"<br/>";
  positionInfo += "纬度:"+posCoords.latitude+"<br/>";
  positionInfo += "准确度:"+posCoords.accuracy+"<br/>";
  positionInfo += "海拔:"+posCoords.altitude+"<br/>"; // 需支持gps
  positionInfo += "海拔准确度:"+posCoords.altitudeAcuracy+"<br/>";
  positionInfo += "行进方向:"+posCoords.heading+"<br/>";
  positionInfo += "地面速度:"+posCoords.speed+"<br/>";

  return positionInfo;
}

locationFail—-倘若获取地理位置失败,则函数会返回一个错误编码,这个编码包括四种情况:

属性 描述
UNKNOW_ERROR–0 未知错误
PERMISSION_DENIED–1 用户拒绝对地理位置的要求
POSITION_UNAVALIABLE–2 位置信息不可用
TIMEOUT–3 获取用户位置超时
function locationFail(error) {
switch(error.code)
{
case error.PERMISSION_DENIED:
alert("用户拒绝对地理位置的要求");
break;
case error.POSITION_UNAVAILABLE:
alert("位置信息不可用");
break;
case error.TIMEOUT:
alert("获取用户位置超时");
break;
case error.UNKNOWN_ERROR:
alert("未知错误");
break;
}
}

locationOptions—地理位置获取的相关设置,locationOptions是以json数据格式存在的,其中包含三个可选属性:

属性 描述
enableHighAcuracy 是否获取高精度的位置,默认为false
timeout 指定获取地理位置的超时时间,默认不限时,单位为毫秒
maximumAge 重复获取地理位置的时间间隔,适用移动设备。
var positionOptions = {
enableHighAcuracy : true,
timeout : 5000,
maximumAge : 5000
}

watchPosition()

之前说到的getCurrentPosition只能单次获取地理位置,而对于移动的目标来说,要隔一段时间就需获取位置,如果我们设置定时器每隔一段时间去获取位置的话,则它会每次都提醒否要共享位置,而我们希望的是它能够自动更新当前地理位置。

因此, geolocation定义了watchPosition方法,这个函数的用法与getCurrentPosition一样。不同的是,它是根据locationOptions设置的maximumAge来间隔性发送获取地理位置信息的请求,且不会每次提醒你是否共享位置信息,而是自动更新地理位置。所以这种方法更适用于移动的目标。

clearWatch()

除了获取地理位置外,geolocation 还定义了clearWath()方法来关闭地理位置更新请求。此函数接受一个参数,即指定发送多次请求地理位置的那个对象。

var getPos = navigator.geolocation.watchPosition(locationSuccess, locationFail, locationOptions);

navigator.geolocation.clearWatch(getPos);

最后要说的是,通过geolocation获取地理位置并非每次都成功,毕竟它也规定了一些错误编码,此时我们要做的,就是刷新网页,手动发送请求。

应用

若只是用geolocation单纯的来获取经纬度其实并不大实用,它的强大功能主要通过与百度地图API结合获取当前地图信息。有关百度API信息详见:

百度Api介绍:http://developer.baidu.com/map/jshome.htm
功能模块代码:http://developer.baidu.com/map/jsdemo.htm

最后做了个小demo: Geolocation获取地理位置