HTML5的geolocation获取设备位置原理是什么?

HTML5里面提供了获取设备地理位置接口:Navigator.geolocation.getCurrentPosition,那么它在移动和PC上定位的原理是什么呢?

HTML5的geolocation获取设备位置原理是什么?

geolocation的位置信息来源包括GPS、IP地址、RFID、WIFI和蓝牙的MAC地址、以及GSM/CDMS的ID等等。规范中没有规定使用这些设备的先后顺序,在HTML5的实现中,手机等移动设备当然优先使用GPS定位,而笔记本和部分平板,最准的定位是WIFI,至于网线上网的台式机,一般就只能使用IP来定位了,这个准确度最低。

在这些方法里,GPS定位最好理解,卫星直接给出定位数据。而WIFI和IP地址定位,都不是浏览器本身能够实现的。这两种方式都必须将IP地址或WIFI信号收集到的周围路由信息,上传到某个服务器,由服务器的查询计算位置信息,然后返回给浏览器。那么这些查询服务由谁来提供呢?

首先来看chrome,很明显,肯定是google自己提供的服务。通过chrome自带的抓包方法(chrome://net-internals/)可以看到,在使用geolocation时,chrome向www.googleapis.com/geolocation/v1/geolocate的接口发送了请求,由于请求用spdy加密过,所以看不出具体内容,只有一点可以确定,即wifi上网时,是post方式传数据,而使用网线时,使用的是get。

firefox使用的也是google的服务,但是和chrome用的接口不同,这个是https://maps.googleapis.com/maps/api/browserlocation/json。
opera用的也是google的服务,接口url没获取到,不过从ip地址来看,也是google的ip。

对于不支持geolocation的浏览器,本来可以调用google的gears项目提供的接口来查询地理位置,但是该服务目前2011年已经停止,暂时也没有出现更好的替代方案。

浏览器会尽可能地进行更为精确的查询,简单地说,如果用户有可用的 GPS 设备,会返回 GPS 设备的查询结果,IP 是最后的选择,对于移动设备来说,网络接入点(基站)或许成为另一个选择。以大多数人的情况,桌面版的Chrome一般是调用了Wifi数据来定位。

代码示例:
if(window.navigator.geolocation) { navigator.geolocation.getCurrentPosition(function(position) { console.log(position); //position里面会有经纬度信息 //此处可以调用百度Map或者Google Map接口来获取地址信息 }, function(error) { switch(error.code) { case error.TIMEOUT: console.log("A timeout occured! Please try again!"); break; case error.POSITION_UNAVAILABLE: console.log('We can\'t detect your location. Sorry!'); break; case error.PERMISSION_DENIED: console.log('Please allow geolocation access for this to work.'); break; case error.UNKNOWN_ERROR: console.log('An unknown error occured!'); break; } }); } else { console.log("No geolocation API in your browser."); }

相关阅读