HTML5 Geolocation API工作原理[转载]
大家都知道,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工作原理[转载]的更多相关文章
- HTML5 Geolocation API地理定位整理(一)
HTML5 Geolocation API 用于获得用户的地理位置. 鉴于该特性可能侵犯用户的隐私,除非用户同意,否则用户位置信息是不可用的. 浏览器支持 Internet Explorer 9+, ...
- HTML5 Geolocation API地理定位整理(二)
Geolocation 实例demo 1.使用watchPosition()监听客户端位置 var watchOne=null; if (navigator.geolocation) { //watc ...
- 深入浅出HTTPS工作原理(转载)
转载自: https://blog.csdn.net/wangtaomtk/article/details/80917081 深入浅出HTTPS工作原理 HTTP协议由于是明文传送,所以存在三大风险: ...
- html5 geolocation API
清单 1. 检查浏览器支持性if (navigator.geolocation) 清单 2. 单次定位请求 API void getCurrentPosition(updateLocation, op ...
- HTML5 canvas游戏工作原理
HTML5已经不是一个新名词.它看上去很cool,有很多feature,大多数人普遍看好它的发展.对于我来说,最感兴趣的是它的canvas标签,可以结合Javascript来绘制游戏画面. 我们可以在 ...
- 简单的HTML5 canvas游戏工作原理
HTML5已经不是一个新名词.它看上去很cool,有很多feature,大多数人普遍看好它的发展.对于我来说,最感兴趣的是它的canvas标签,可以结合Javascript来绘制游戏画面. 我们可以在 ...
- 利用HTML5 Geolocation API在百度地图中显示你的位置
代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <met ...
- jQuery UI Widget(1.8.1)工作原理--转载
先看下代码的相关注释: /*! * jQuery UI Widget 1.8.1 * * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/abo ...
- 1-趣味解读DNS工作原理——转载疯猫网络科技
因为只要我们输入百度.腾讯.淘宝的名字,无论它们的服务器在哪里,历经多少轮查询,我们都能找到并访问之.这就是计算机网络中著名的域名系统DNS(Domain Name System),它能实现把一个网站 ...
随机推荐
- hibernate学习手记(2)
1.javax.persistence.TransactionRequiredException: no transaction is in progress 出现该问题是我没有开启事务,我是在保存之 ...
- Css Html 大风车
<div style = "height:500px;width:500px;position:static;float:left;"><div class=&q ...
- POJ1032 Parliament(数论)
New convocation of The Fool Land's Parliament consists of N delegates. According to the present regu ...
- NOIP2017SummerTraining0720
这套题,看到第一题就想到了以前做过的运动鞋那道题,然后就往DP这个方向去思考,想来想去每什么思路,然后就去看第二题,第二题一看就是一道最短路的问题,但是它的建图十分困难, 怎么打都不知到该怎么建图,然 ...
- 移动WEB 响应式设计 @media总结
第一种: 在引用样式的时候添加 <link rel="stylesheet" media="mediatype and|not|only (media featur ...
- VB.net shell、IO.File.Open、Process.Start、Shellexecute API 运用经验总结
打开文件还有很多方法,但我了解到运用较多的是上面几种- -,为了防止以后忘记,先把了解到的写下来. 1.Shell 这个看了很多网页,最靠谱的运用方法: Shell("cmd.exe /c ...
- (转)Python-正则表达式
在前面我们已经搞定了怎样获取页面的内容,不过还差一步,这么多杂乱的代码夹杂文字我们怎样把它提取出来整理呢?下面就开始介绍一个十分强大的工具,正则表达式! 1.了解正则表达式 正则表达式是对字符串操作的 ...
- win10 uwp 获取按钮鼠标左键按下
我们可以使用PointerPressed获得鼠标右键按下,但是我们如何获得左键? 其实UWP已经没有MouseLeftButtonDown,于是我们可以使用一个简单方法去获取鼠标左键按下. 我们在xa ...
- JavaScript函数之实际参数对象(arguments) / callee属性 / caller属性 / 递归调用 / 获取函数名称的方法
函数的作用域:调用对象 JavaScript中函数的主体是在局部作用域中执行的,该作用域不同于全局作用域.这个新的作用域是通过将调用对象添加到作用域链的头部而创建的(没怎么理解这句话,有理解的亲可以留 ...
- eclispe中安装hibernate插件
用eclispe玩ee的朋友,写配置文件的时候没有提示非常苦恼,而配置dtd文件还是没有得到解决,最后试了试安装插件解决了问题 地址:http://download.jboss.org/jbossto ...