最近项目中接到一个需求,需要使用百度地图API和HTML5定位特性。

对于百度地图API,没啥好说的,刨它的API就是了。

今天想说说JS定位特性。

浏览器支持

Internet Explorer 9、Firefox、Chrome、Safari 以及 Opera 支持地理定位。

访问地理位置

地理位置可以在JavaScript中通过浏览器的navigator.geolocation对象访问。

这个对象提供了3个方法:getCurrentPositionwatchPositionclearWatch

getCurrentPosition(success_callback, error_callback, geolocationOptions)

success_callback,获取定位信息成功时的回调函数

error_callback,获取定位信息失败时的回调函数

geolocationOptions,定位设置,它是一个对象,包含3个属性:

enableHighAccuracy(Boolean型,默认为false,是否尝试更精确地读取纬度和经度,移动设备上,这可能要使用手机上的GPS,这会消耗移动设备更多的电量,定位所需时间也会更长)

timeout(单位为毫秒,默认值为0,在放弃并触发处理程序之前,可以等待的时间----用户选择期间是不计时的)

maximumAge(单位为毫秒,默认值为0。用来告诉浏览器是否使用最近缓存的位置数据,如果在maximumAge内有一个请求,将会返回它,而不请求新位置。maximumAge如果为Infinity,则总是使用一个缓存的位置,如果为0则必须在每次请求时查找一个新位置)

获取定位信息成功时getCurrentPosition()返回一个positon对象给success_callback。此对象包含如下属性:

coords.latitude(十进制数的纬度)

coords.longitude(十进制数的经度)

coords.accuracy(位置精度)

coords.altitude(海拔,海平面以上以米计)

coords.altitudeAccuracy(位置的海拔精度)

coords.heading(方向,从正北开始以度计)

coords.speed(速度,以米/每秒计)

timestamp(响应的日期/时间)

获取定位信息失败时getCurrentPosition()返回一个error对象给error_callback。此对象包含如下属性:

code(错误编码:“1”为用户禁止了定位信息获取,“2”为网络不可用或连接卫星失败,“3”为获取定位所花费的时间过长,“0”为出现未知错误)

message(错误信息)

var x = document.getElementById("demo");
var options = {
  enableHighAccuracy: false,
  timeout: 5000,
  maximumAge: 60000
}; function getLocation(){
  if(navigator.geolocation){
    navigator.geolocation.getCurrentPosition(showPosition, showError, options);
  }else{
    x.innerHTML="Geolocation is not supported by this browser.";
  }
} function showPosition(position){
  x.innerHTML = "Latitude: " + position.coords.latitude + "<br />Longitude: " + position.coords.longitude;
} function showError(error){
switch(error.code){
case 1:
x.innerHTML = "User denied the request for Geolocation.";
break;
case 2:
x.innerHTML = "Location information is unavailable.";
break;
case 3:
x.innerHTML = "The request to get user location timed out.";
break;
case 0:
x.innerHTML = "An unknown error occurred.";
break;
  }
}

watchPosition像一个追踪器,返回的位置信息会随着用户移动而改变,与clearWatch成对。

watchPosition与clearWatch有点像setInterval和clearInterval的工作方式。

var watchPositionId = navigator.geolocation.watchPosition(success_callback, error_callback, geolocationOptions);
navigator.geolocation.clearWatch(watchPositionId);

定位功能的主要影响因素

定位功能的使用非常简单,一个对象三个方法。但在工作过程中,发现经常获取不到定位信息。经查找资料得知影响定位功能的主要因素是网络。

定位功能在移动网络环境里,是通过基站定位或者WIFI定位,获取定位信息成功率高,速度快。

若是在物理网络环境里,则有点复杂,首先,浏览器调用其对应的定位服务器的定位接口,然后定位服务器连接卫星,以用户的IP地址进行定位,再将定位信息返回浏览器传给用户。由于涉及浏览器与定位服务器连接是否成功、定位服务器与卫星连接是否成功两方面因素的影响,固定位成功率很难保证。

GPS定位由于信号比较薄弱的关系定位成功率比较低,就算成功定位,需要花费的时间也很长,一般使用GPS定位的同时都会使用基站和WIFI辅助定位。

定位精准度

关于定位精准度问题,由于绝大多数情况下,设备的定位信息是通过WIFI定位方式返回,误差一般在几十米之内。

(因为GPS定位耗时过长一般会被略过,基站定位精准度较低,优先级不如WIFI定位)

而getCurrentPosition的配置参数里的enableHighAccuracy设置为true,仅仅是启用GPS定位,根据GPS定位的特性,应用中使用的机会不多。所以一般都用默认flase就足够了。

关于实际应用的温馨提示

这里,需要和大家分享一下实际工作中遇到的一种情况,那就是百度地图API和html5原生的定位API搭配使用,会导致极大的精准误差的问题。

出现这个问题的原因在于,国内的地图产品,其地理位置大多数都进行了GCJ-02加密,即加入随机的偏差。

而html5原生的定位API获取到的地理位置,是未经加密的。

因此,为了保证html5原生的定位API获取到的地理位置在百度地图上较为准确的解析,就需要用官方提供的转换类。

由于国内地图产品的地理位置普遍进行了GCJ-02加密(身在天朝,没办法,我知道得太多了...)

因此,在用一种地图产品的API时,都应养成一个习惯,就是看看它们有没有提供地理位置信息转换的类

下面是在百度地图API中的转换实例。

先在项目中引入类<script type="text/javascript" src="http://developer.baidu.com/map/jsdemo/demo/convertor.js"></script>

BMap.Convertor.translate(gpsPoint, 2, callback);
//GPS坐标转成百度坐标
BMap.Convertor.translate(bdPoint, 0, callback);
//百度坐标转成GPS坐标
var callback = function(point){
  //参数point为转换后的point对象,GPS坐标生成的point对象转换成百度坐标point对象,在百度地图里才能解析成更准确的地址
  //通过它的lng、lat属性分别获取经、纬度信息
}

HTML5定位使用心得的更多相关文章

  1. html5定位getLocation()

    HTML5 Geolocation API 用于获得用户的地理位置. 如果用户不允许定位,那么用户信息是不可用的. 获取用户的位置:getCurrentPosition() 返回数据如下 返回用户当前 ...

  2. 利用HTML5定位功能,实现在百度地图上定位

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. 利用HTML5定位功能,实现在百度地图上定位(转)

    原文:利用HTML5定位功能,实现在百度地图上定位 代码如下: 测试浏览器:ie11定位成功率100%,Safari定位成功率97%,(add by zhj :在手机上测试(用微信内置浏览器打开),无 ...

  4. HTML5定位功能,实现在百度地图上定位

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. html5定位并在百度地图上显示

    在开发移动端 web 或者webapp时,使用百度地图 API 的过程中,经常需要通过手机定位获取当前位置并在地图上居中显示出来,这就需要用到html5的地理定位功能. navigator.geolo ...

  6. html5定位获取当前位置并在百度地图上显示

    用html5的地理定位功能通过手机定位获取当前位置并在地图上居中显示出来,下面是百度地图API的使用过程,有需要的朋友可以参考下 在开发移动端 web 或者webapp时,使用百度地图 API 的过程 ...

  7. html5 定位 获得当前位置的经纬度

    if (navigator.geolocation) { navigator.geolocation.getCurrentPosition(showPosition, showError, { // ...

  8. html5 定位

    需要实现的功能:移动端的网页,能定位到中文地址. 百度地图能实现这样的功能. 之前精度差得原因是,我用自己的mac做服务器,用手机来浏览定位,这样只能定位到mac 的地址,mac上浏览器的地址就没准了 ...

  9. 公网ip定位原理-心得

    1.前言 正在做一个根据公网ip来定位到大体的位置,一般是精确到城市或地区, 如果想要精确到街道和地图一一对应,那得使用GPS才可以,这里不讨论. 2.科普 公网也就是外网,由运营商的机房服务器自动给 ...

随机推荐

  1. CSS选择器与jQuery选择器的异同:一些特殊的选择器

    在CSS3选择器标淮草案定义的选择器语法中,jQuery支持相当完整的一套子集,同时还添加了一些非标准但很有用的伪类.下面是一些jQuery扩展的选择器:(来自http://www.cnblogs.c ...

  2. MVC4 Action 方法的执行

    1. ActionInvoker 的执行: 在MVC 中  包括Model绑定与验证在内的整个Action的执行是通过一个名为ActionInvoker的组件来完成的. 它同样具有 同步/异步两个版本 ...

  3. 20145233《网络对抗》Exp6 信息收集和漏洞扫描

    20145233<网络对抗>Exp6 信息收集和漏洞扫描 实验问题思考 哪些组织负责DNS,IP的管理 全球根服务器均由美国政府授权的ICANN统一管理,负责DNS和IP地址管理.全球一共 ...

  4. mysql按照天或小时group分组统计

    select DATE_FORMAT( deteline, "%Y-%m-%d %H" ) , COUNT( * ) FROM test GROUP BY DATE_FORMAT( ...

  5. JavaScript 类型转换(2)

    隐式类型转换 1. var a = "123"; a++; 这时候会将调用Number("123")将"123"转换成数字类型,然后再自增. ...

  6. IIS应用程序池自动回收作业

    vb: appPoolName = WScript.Arguments() Set oWebAdmin = GetObject("winmgmts:root\WebAdministratio ...

  7. python 小点

    python中列表不能除以列表,列表不能除以整数.浮点数. numpy数组可以实现数组除以整数.

  8. javascript滚动到大于一定距离显示隐藏

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. [ActionSprit 3.0] FMS客户端调用服务器端命令或方法

    有时候客户端需要和服务器端进行通信,服务器端会有个main.asc文件(当然,文件名可以自己定义),这个就是服务器端程序,是在服务器上执行的,你可以用trace调试,trace的内容会在管理服务器的页 ...

  10. 生产者消费者模式-Java实现

    感知阶段 随着软件业的发展,互联网用户的日渐增多,并发这门艺术的兴起似乎是那么合情合理.每日PV十多亿的淘宝,处理并发的手段可谓是业界一流.用户访问淘宝首页的平均等待时间只有区区几秒,但是服务器所处理 ...