HTML5 中 Geolocation 獲取地理位置的原理是什麼?

具體的 API 是 Navigator.geolocation.getCurrentPosition。這個的原理是什麼,為什麼走了代理還能知道我在北京?用的是 Chrome 卓面版,沒走 Wifi,是插的網線。

定位是在這個鏈接里: HTML5 Presentation http://slides.html5rocks.com/#geolocation


Geolocation API 的數據來源可能是 GPS、IP 地址、RFID、WiFi、藍牙 MAC 地址、GSM/CDMA 卡 ID 等。

因為 Geolocation API 是運行在你本地設備上的。所以,在使用 VPN 或代理的情況下,Geo API 仍能獲得你準確的 IP 地址信息(除非因為某些因素瀏覽器獲取不到這些信息)。

剛剛測試了下,在使用美國 VPN 的情況下,Safari 仍能獲取我準確的地理位置信息。

下面是 W3C 文檔的描述:

The Geolocation API defines a high-level interface to location information associated only with the device hosting the implementation, such as latitude and longitude. The API itself is agnostic of the underlying location information sources. Common sources of location information include Global Positioning System (GPS) and location inferred from network signals such as IP address, RFID, WiFi and Bluetooth MAC addresses, and GSM/CDMA cell IDs, as well as user input. No guarantee is given that the API returns the device"s actual location.

----

參考資料:

Geolocation API Specification

How HTML5 Geolocation Feature Works?


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

請求數據是:browser=firefoxsensor=truewifi=mac:xx-xx-xx-xx-xx-xx%7Cssid:xxxxxxx%7Css:-43wifi=mac:xx-xx-xx-xx-xx-xx%7Cssid:xxxxxxx%7Css:-43wifi=mac:xx-xx-xx-xx-xx-xx%7Cssid:xxxxxxx%7Css:-43wifi=mac:xx-xx-xx-xx-xx-xx%7Cssid:xxxxxxx%7Css:-44wifi=mac:xx-xx-xx-xx-xx-xx%7Cssid:xxxxxxx%7Css:-60wifi=mac:xx-xx-xx-xx-xx-xx%7Cssid:xxxxxxx%7Css:-61wifi=mac:xx-xx-xx-xx-xx-xx%7Cssid:xxxxxxx%7Css:-62wifi=mac:xx-xx-xx-xx-xx-xx%7Cssid:xxxxxxx%7Css:-63wifi=mac:xx-xx-xx-xx-xx-xx%7Cssid:xxxxxxx%7Css:-63wifi=mac:xx-xx-xx-xx-xx-xx%7Cssid:xxxxxxx%7Css:-67wifi=mac:xx-xx-xx-xx-xx-xx%7Cssid:xxxxxxx%7Css:-67wifi=mac:xx-xx-xx-xx-xx-xx%7Cssid:xxxxxxx%7Css:-67wifi=mac:xx-xx-xx-xx-xx-xx%7Cssid:xxxxxxx%7Css:-67wifi=mac:xx-xx-xx-xx-xx-xx%7Cssid:xxxxxxx%7Css:-74wifi=mac:xx-xx-xx-xx-xx-xx%7Cssid:xxxxxxx%7Css:-82wifi=mac:xx-xx-xx-xx-xx-xx%7Cssid:xxxxxxx%7Css:-84wifi=mac:xx-xx-xx-xx-xx-xx%7Cssid:xxxxxxx%7Css:-85

這個就很清晰了,是周邊wifi設備的ssid、mac地址,以及信號強度。(公司網路,路由名和mac地址隱去。)

opera用的也是google的服務,介面url沒弄到,不過從ip地址來看,也是google的ip。

對於不支持geolocation的瀏覽器,本來可以調用google的gears項目提供的介面來查詢地理位置,但是該服務目前2011年已經停止,暫時也沒有出現更好的替代方案。


這個API裡面有一個參數告訴瀏覽器是否啟用高精度設備,所謂的高精度設備包含但不局限於前面所提到的 GPS 和 WIFI,值為 true 的時候,瀏覽器會嘗試啟用這些設備,默認指為 true,在這種情況下,瀏覽器會儘可能地進行更為精確的查詢,簡單地說,如果用戶有可用的 GPS 設備,會返回 GPS 設備的查詢結果,IP 是最後的選擇,對於移動設備來說,網路接入點(基站)或許成為另一個選擇。以大多數人的情況,桌面版的Chrome一般是調用了Wifi數據來定位。


H5取定位信息有兩種方式,如果設備有GPS功能則優先使用;如果功能被禁或者壓根沒有GPS,會把設備信息發送到瀏覽器設置的網路服務進行獲取。

PC上使用Chrome進行定位,有時候會超時,但翻牆後可快速定位,可以驗證這個結論。

如果換用IE,則會通過百度或者必應的服務進行位置信息的獲取

早期安卓手機定製的系統,比如CM,也需要把Google的定位服務改為百度,一般的升級信息會描述為「優化定位速度」


定位是通過GPS,跟數據網路走的不是同一個通道,相互沒有關聯。


推薦閱讀:

HTML如何分模塊設計並include?
還要多少年, 前端開發才能像客戶端開發那樣輕鬆?
如何理解扎克伯格说「Facebook 最大错误是在 HTML5 上押注过大,在移动平台上浪费两年时间」?
想在豬八戒接做網頁,要怎樣系統的學習 ?
Cordova 如何實現所有的h5html 來自於遠程伺服器呢?

TAG:GoogleChrome | HTML5 |