大家都知道,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. foreach循环中为什么不要进行remove/add操作

    先来看一段代码,摘自阿里巴巴的java开发手册 List<String> a = new ArrayList<String>(); a.add("1"); ...

  2. GitHub使用(一) - 新建个人网站

    1.首先进入“仓库Repositories”,点击“新建New”.

  3. 关于 HashTable

    hashTable 的一些认识: 底层使用散列表,存贮键值对,键值非null 使用synchronize 保证线程安全 (线程安全) ■全局变量 //The hash table data. //底层 ...

  4. Django进阶篇【1】

    注:本篇是Django进阶篇章,适合人群:有Django基础,关于Django基础篇,将在下一章节中补充! 首先我们一起了解下Django整个请求生命周期: Django 请求流程,生命周期: 路由部 ...

  5. Gate One——用web展示Terminal(安装)

    Gate One可以用web来展示Terminal,虽然存在一些小缺陷,基本功能都还可以的,有兴趣的可以折腾一下. 安装环境: 系统:RHEL 6.1 ,系统自带python 2.6.6 下载需要安装 ...

  6. JS或jQuery实现一组复选框的全选和取消全选?

    //1.JS方式实现:checkbox 全选/取消全选  var isCheckAll = false;  function swapCheck() {    if (isCheckAll) {    ...

  7. python之线程学习

    一.进程与线程简介 进程 进程是程序的一次执行,由进程段.数据段.进程控制块三部分组成.具体三个基本状态,就绪.执行.阻塞,是一个拥有资源的独立单位. 线程 属于进程的一个实体,拥有极少的资源.也具有 ...

  8. Window2008 R2(64位)使用codesmith连接Sqlite

    ①打开C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config目录,找到machine.config文件新增 <add name=" ...

  9. 配置eNSP和本地电脑上的网卡相连,从而直接从本地电脑连接设备

  10. 第三章 MySQL高级查询(一)

    第三章 MySQL高级查询(一) 一.SQL语言的四个分类 1.       DML(Data Manipulation Language)(数据操作语言):用来插入,修改和删除表中的数据,如INSE ...