大家都知道,HTML5 Geolocation 可以使用 IP 地址、基于 Web 的数据库、无线网络连接和三角测量或 GPS 技术来确定经度和纬度

问题:

在一个基于地理位置服务的个人业余项目(小伙伴在哪儿)中,发现用PC获取的地理位置与手机端获取的地理信息存在微小的差距,PC端会经常出现获取不到地理位置的情况,PC端和手机端的Geolocation是否有什么底层实现方面的差别呢,HTML5又是根据什么原则来确定应该采用何种方式来确定经度和纬度信息呢?

带着这个问题,作者查阅了一些资料,得出以下几个假设和结论:

一、HTML5 Geolocation API是如何工作的

根据您所使用的浏览器,HTML5地理位置API实现原理依赖于于多项因素,包括你的公网IP地址,手机信号塔的ID,GPS信息,一系列无线接入点,信号强度和MAC地址(Wifi/蓝牙)。然后它将该信息通过https协议传递到一个位置服务商并尝试将该信息与大量的相关数据库进行匹配查找。然后返回一个近似的位置信息,通过javascript的回调函数传递到代码。

举一个例子来验证一下HTML5 Geolocation到底给位置服务商发送了哪些信息,我用firefox11做了一些测试,firefox使用了google的位置服务。顺便提一下,到目前为止,firefox11不会再传送cookie到服务器。

firefox11发送了一个https请求:https://maps.googleapis.com/maps/api/browserlocation/json?

GET /maps/api/browserlocation/json?browser=firefox&sensor=true&wifi=mac:01-24-7c-bc-51-46%7Cssid:3x2x%7Css:-37&wifi=mac:09-86-3b-31-97-b2%7Cssid:belkin.7b2%7Css:-47&wifi=mac:28-cf-da-ba-be-13%7Cssid:HERESIARCH%20NETWORK%7Css:-49&wifi=mac:2b-cf-da-ba-be-10%7Cssid: ARCH%20GUESTS%7Css:-52&wifi=mac:08-56-3b-2b-e1-a8%7Cssid:belkin.1a8%7Css:-59&wifi=mac:02-1e-64-fd-df-67%7Cssid:Brown%20Cow%7Css:-59&wifi=mac:2a-cf-df-ba-be-10%7Cssid: ARCH%20GUESTS%7Css:-59 HTTP/1.1

二、浏览器使用哪个位置服务?

并不是所有geolocation 服务都是一样的,而且并不一定会使用同一个算法甚至不是一个数据库。正因为如此,通过浏览器获取到的位置信息可能会因为采用的位置服务不同而不同。

下面列举了一些浏览器使用的位置服务。虽然我没有做测试,根据我的经验,不同的浏览器、不同的设备包括智能手机、pad,即使是在同一地点都会返回不同的位置信息。有些位置服务在有一些城市会更精确,另一些位置服务在其他城市会更精确。

  • chrome使用google location services
  • window平台上firefox使用google location services
  • linux上的firefox使用GPSD - http://catb.org/gpsd/.
  • IE9+使用Microsoft location service
  • IOS上的safari浏览器使用Apple location services for iphone os3.2+
  • 我不确定window平台上的safari使用哪个位置服务。
  • opera使用google location services。Android平台上的opera使用GPS。

HTML5 geolocation需要联网。如果检测到设备没联网,有些时候浏览器会从缓存中获取位置信息,但是这个缓存的位置信息是最后一次联网时获取到的位置信息。

WIFI是否开启。如果在你的手机、桌面设备、平板上WIFI没有开启,Geolocation API会尝试用你的公网IP或者电话塔ID或GPS来查找你的位置信息。公网IP数据库通常会返回一个你的网络提供商的存在点或POP。另外,一些网络供应商会提供rotating ip address.所以,可以尝试在一段时间内使用一个ip地址,你会得到不同的结果。所以公网IP只适合来定位你位于哪个城市,或者该城市哪个区域,或者国家。

对于电话塔IDS,它依赖于你使用哪种手机以及供应商。有一些智能手机只会返回当前手机正在ping的电话塔位置,所以这有可能会不太精确的。

我注意到了Android内置的浏览器在没有wifi的情况下会比较不精确。精确程度只有1000+。如果我打开wifi之后(我在乡下区域),精确度立马增高到75m左右。

农村/城市。大部分用户都在城市,但是如果你的用户到乡下的地方去旅游,Geolocation就变得不太可靠了。即使用户打开了wifi,但是如果用户没有处于wifi接入点附近,geolocation service依然会尝试用其他方法去定位。乡下地方很难用三角定位的方法来获取位置信息,如果浏览器不实用GPS,精确度也会收到很大影响。

移动/静止。geolocation api在静止的城市区域会提供一个更精确的位置。当我在城镇周边驾驶的时候,我的android原生浏览器中很难获取到精确的位置信息。但是如果你停止在一个点的时候偶尔会返回一个结果。当我在告诉公路上以每小时50公里的速度驾驶的时候,我很难得到一个结果。

是否开启了VPN。如果VPN打开了,geolocation会根据VPN的公网ip去寻址。

自定义的Geolocation作为备用。根据自身的实际情况,可能你会想要使用一些商业服务来获取位置信息,例如IP2Location。或者使用第三方的geolocation service,比如Skyhook。记住IP Geolocation只会返回城市或区域级别精度的位置信息。

如果HTML5满足不了我的需求,怎么办?如果你有较高的精度需求,我推荐使用native app。

【转载】http://www.cnblogs.com/keva/p/html5-geolocation-accurary.html

HTML5 Geolocation API工作原理[转载]的更多相关文章

  1. HTML5 Geolocation API地理定位整理(一)

    HTML5 Geolocation API 用于获得用户的地理位置. 鉴于该特性可能侵犯用户的隐私,除非用户同意,否则用户位置信息是不可用的. 浏览器支持 Internet Explorer 9+, ...

  2. HTML5 Geolocation API地理定位整理(二)

    Geolocation 实例demo 1.使用watchPosition()监听客户端位置 var watchOne=null; if (navigator.geolocation) { //watc ...

  3. 深入浅出HTTPS工作原理(转载)

    转载自: https://blog.csdn.net/wangtaomtk/article/details/80917081 深入浅出HTTPS工作原理 HTTP协议由于是明文传送,所以存在三大风险: ...

  4. html5 geolocation API

    清单 1. 检查浏览器支持性if (navigator.geolocation) 清单 2. 单次定位请求 API void getCurrentPosition(updateLocation, op ...

  5. HTML5 canvas游戏工作原理

    HTML5已经不是一个新名词.它看上去很cool,有很多feature,大多数人普遍看好它的发展.对于我来说,最感兴趣的是它的canvas标签,可以结合Javascript来绘制游戏画面. 我们可以在 ...

  6. 简单的HTML5 canvas游戏工作原理

    HTML5已经不是一个新名词.它看上去很cool,有很多feature,大多数人普遍看好它的发展.对于我来说,最感兴趣的是它的canvas标签,可以结合Javascript来绘制游戏画面. 我们可以在 ...

  7. 利用HTML5 Geolocation API在百度地图中显示你的位置

    代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <met ...

  8. jQuery UI Widget(1.8.1)工作原理--转载

    先看下代码的相关注释: /*! * jQuery UI Widget 1.8.1 * * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/abo ...

  9. 1-趣味解读DNS工作原理——转载疯猫网络科技

    因为只要我们输入百度.腾讯.淘宝的名字,无论它们的服务器在哪里,历经多少轮查询,我们都能找到并访问之.这就是计算机网络中著名的域名系统DNS(Domain Name System),它能实现把一个网站 ...

随机推荐

  1. OpenVPN server端配置文件详细说明(转)

    本文将介绍如何配置OpenVPN服务器端的配置文件.在Windows系统中,该配置文件一般叫做server.ovpn:在Linux/BSD系统中,该配置文件一般叫做server.conf.虽然配置文件 ...

  2. windows下创建Python虚拟环境

    windows下创建Python虚拟环境 说明 由于Python的版本众多,还有Python2和Python3的争论,因此有些软件包或第三方库就容易出现版本不兼容的问题. 通过 virtualenv ...

  3. CSS div阴影效果

    <div class="image"><img src="default.jpg" /></div> .image{box- ...

  4. (原)怎样解决python dataframe loc,iloc循环处理速度很慢的问题

    怎样解决python dataframe loc,iloc循环处理速度很慢的问题 1.问题说明 最近用DataFrame做大数据 处理,发现处理速度特别慢,追究原因,发现是循环处理时,loc,iloc ...

  5. ubuntu系统如何屏幕截图

    我们知道,windows下有很多截图的软件和插件,那么在ubuntu系统下我们该怎样截图呢? 下面就让小编来告诉你几种简单的方法吧. 工具/原料 ubuntu系统电脑 方法一: 1.也许很多朋友都知道 ...

  6. javascript中call()、apply()、bind()的用法终于理解

    其实是一个很简单的东西,认真看十分钟就从一脸懵B 到完全 理解! 先看明白下面: 例1 obj.objAge;  //17 obj.myFun()  //小张年龄undefined 例2 shows( ...

  7. XML读取信息并显示

    这个类命名叫Message.cs namespace Common { public class Message { /// <summary> /// 信息编号 /// </sum ...

  8. Telerik 控件 RadGridview实现绑定

    0.使用MiroModes框架请先阅读http://blogs.telerik.com/blogs/posts/10-01-20/micromodels_for_silverlight.aspx 1. ...

  9. 面向对象(OOP)--OOP基础与this指向详解

      前  言            学过程序语言的都知道,我们的程序语言进化是从“面向机器”.到“面向过程”.再到“面向对象”一步步的发展而来.类似于汇编语言这样的面向机器的语言,随着时代的发展已经逐 ...

  10. 在ubuntu16.04中安装apache2+modsecurity以及自定义WAF规则详解

    一.Modsecurity规则语法示例 SecRule是ModSecurity主要的指令,用于创建安全规则.其基本语法如下: SecRule VARIABLES OPERATOR [ACTIONS] ...