大家都知道,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. 深入理解计算机系统chapter6

    1. 2. 3. 存储器山

  2. Atlas框架介绍集成(一)

    Atlas是什么? Atlas是一个Android客户端容器框架,主要提供了组件化.动态性.解耦化的支持.支持在编码期.Apk运行期以及后续运维修复期的各种问题. 在工程期,实现工程独立开发,调试功能 ...

  3. mybatis错误——java.io.IOException: Could not find resource com/xxx/xxxMapper.xml

    在学习Mybatis的时候,参考网上的教程进行简单demo的搭建,配置的没有问题,然后出现了下面的错误! Exception in thread "main" java.lang. ...

  4. 通过JQuery实现Ajax代码

    今天早上遇到了这个问题,结果我写的顺序是惨不忍睹啊,所有现在留个模版以示标准. $(function(){ $.ajax({ url : "Servlet", //传地址 type ...

  5. 浅谈Spring的AOP实现-动态代理

    说起Spring的AOP(Aspect-Oriented Programming)面向切面编程大家都很熟悉(Spring不是这次博文的重点),但是我先提出几个问题,看看同学们是否了解,如果了解的话可以 ...

  6. Ubuntu16.04 install OpenJDK8

    1.按Ctrl + Alt + T打开终端.打开后,运行下面的命令来添加PPA:sudo add-apt-repository ppa:openjdk-r/ppa2.之后,更新系统包缓存并安装Open ...

  7. Python自学笔记-filter()函数(来自廖雪峰的官网Python3)

    感觉廖雪峰的官网http://www.liaoxuefeng.com/里面的教程不错,所以学习一下,把需要复习的摘抄一下. 以下内容主要为了自己复习用,详细内容请登录廖雪峰的官网查看. Python内 ...

  8. Python tkinter调整元件在窗口中的位置与几何布局管理

    Tkinter中的GUI总是有一个root窗口,不管你是主动或者别动获得.主窗口就是你的程序开始运行的时候创建的,在主窗口中你通常是放置了你主要的部件.另外,Tkinter脚本可以依据需要创建很多独立 ...

  9. Database 2 Day DBA guide_Chapter2

    website:http://www.oracle.com/webfolder/technetwork/tutorials/obe/db/11g/r2/2day_dba/install/install ...

  10. EF框架搭建小总结--ModelFirst模型优先

    前言:去年刚工作的时候,也是刚刚正式接触.net,当时了解了EF以及三种开发模式,Database First.Model First .Code First.公司用的开发模式是Database Fi ...