最近项目中接到一个需求,需要使用百度地图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. Linq特取操作之ElementAt,Single,Last,First源码分析

    Linq特取操作之ElementAt,Single,Last,First源码分析 一:linq的特取操作 First/FirstOrDefault, Last/LastOrDefault, Eleme ...

  2. MVC4 Action 两种异步方式

    1. xxxAsync/xxxCompleted 组合方式异步,xxxCompleted  就是他的回调函数,在执行完 xxxAsync 后调用xxxCompleted  . 使用 异步方式必须继承A ...

  3. 20145218张晓涵_Web基础

    20145218张晓涵_Web基础 基础知识 Apache一个开放源码的网页服务器,可以在大多数计算机操作系统中运行,由于其多平台和安全性被广泛使用,是最流行的Web服务器端软件之一.它快速.可靠并且 ...

  4. [gcc warnings] -Wtrigraph warnings

    [gcc warnings] -Wtrigraph warnings 背景 三字符组(trigraph)与双字符组(Digraph)是程序设计语言(如C语言)中3个或者2个字符的序列,在编译器预扫描源 ...

  5. ajax 跨域访问的解决方案

    ajax 跨域访问的解决方案 一.什么是跨域: 1.什么样的请求属于跨域: 域名,端口有任何一个不相同都属于跨域: 二.跨域的常用几种解决方案: 1.jsonp: 2.iframe: 3.webcon ...

  6. 「NOIP 2013」 货车运输

    题目链接 戳我 \(Solution\) 这一道题直接用\(kruskal\)重构树就好了,这里就不详细解释\(kruskal\)重构树了,如果不会直接去网上搜就好了.接下来讲讲详细过程. 首先构建\ ...

  7. BOI2007 Mokia | cdq分治求二维点数模板

    题目链接:戳我 也没什么,其实主要就是为了存一个求二维坐标上矩形内点的个数的模板.为了之后咕咕咕地复习使用 不过需要注意的一点是,树状数组传x的时候可千万不要传0了!要不然会一直死循环的...qwqw ...

  8. day04.4-装饰器

    1. 装饰器 装饰器本身就是函数,功能是为其他函数添加附加功能 装饰器的设计原则: (a). 不修改被修饰函数的源代码: (b). 不修改被修改函数的调用方法. 装饰器=高阶函数+函数嵌套+闭包 装饰 ...

  9. leecode刷题(8)-- 两数之和

    leecode刷题(8)-- 两数之和 两数之和 描述: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输 ...

  10. [ActionScript 3.0] 判断XML属性是否存在

    在as3中判断xml节点是否存在以及判断xml某节点是否存在某属性可用下面方法: if(xml.hasOwnProperty("frameRate")){ trace(" ...