定位的原理


手機定位的價值

目前智能手機的使用已經越來越普遍,手機定位也是手機上的一個核心基礎功能。舉一個常見的應用如叫車,司機需要知道你在哪里,同時打車軟件也需要基於司機和乘客的位置規划一條路線,讓司機更高效的行駛到用戶這里。這就是典型的定位服務的應用。當然,除去這種應用,用戶位置本身的展示,也是地圖產品中不可缺少的。

那么問題就來了,作為app的用戶,你可能會好奇這個app是如何知道你的位置;而作為app的開發者,是如何在程序中得到設備當前的准確位置的呢?

這個問題說來話長,我們還是先從定位原理上來解釋吧!

可用於無線定位的信號

很顯然,一個功能正常的手機,總是能夠受到各種無線信號,這些無線信號的“局部唯一性”,是該設備能定位的關鍵前提。什么叫局部唯一性?我們再把這些具體的信號來展開解釋下你就知道了:

基站信號:

一個手機能夠接打電話、收發短信,說明該手機能與附近基站發起交互,收發信號。特別地,對於智能手機,還可以通過系統的接口得到基站ID。正常情況下,每個基站ID是全球唯一的,這樣如果掃到了某個基站ID,我們又知道該基站的位置,便能粗略估計設備的位置。做出這個推測的前提就是一個基站的信號發射范圍是有限的,正常的手機,不可能在相距這個基站很遠的時候,還收到這個基站的信號。

在無線通信相關的教科書里,講到基站定位,總是會談到三角定位,也就是下圖描述的原理。下圖是很容易理解的,一個手機能掃描到三個基站的信號,因此其必然在三個基站的共同覆蓋范圍內,從而推算的范圍就大大縮小。但現實是很骨感的,在現在的智能手機上,只有極少數的手機可以獲取到多個周圍的基站ID,而且也無法反算出和這些基站的距離,所以這個算法除非電信運營商自己可以試試,對於別人是沒有實戰價值的。在實戰中,只能是退而求其次,基於單個基站來定位。

WIFI信號:

現在的智能手機都支持wifi上網了,而我們連接的每個wifi路由器(包括手機做移動熱點的那種),都有全球唯一的MAC地址。更重要的是,wifi路由器的部署成本低,因而非常普遍,在一個樓層里就會有很多個wifi熱點。因而不難想到,一旦我們有了這個全球每個路由器的實際位置,那么我們就可以基於用戶手機掃描到的周圍wifi熱點,確定用戶當前的位置。

說到這里,有的朋友會問,如果一個人帶着手機,開着移動熱點到處行走,還有那種地鐵、高鐵、公交車上的移動wifi,豈不是就會引起定位的錯誤?答對了,確實是這樣,而且根據統計,這種情形還在愈演愈烈。因此,如何想辦法來迅速過濾這種移動熱點,是個值得研究的問題。

GPS信號:

如果手機在室外或者窗邊,那么就可以接收到天上的定位衛星發射出來的信號,基於這種信號,可以推算手機到每顆衛星的距離、衛星位置,進而推算出手機的位置來。需要注意的是,這個解算是在GPS芯片中完成的,在手機操作系統層面上,可以直接通過API接口得到解算的結果和誤差半徑。

對於GPS的原因我們不多解釋,但在調用時要注意兩點。第一就是GPS的初始定位是很耗時間的,對於老一些的芯片,可能要耗費幾分鍾才能冷啟動定位成功;第二是GPS精度並非是完全可依賴的,在一些地方達到幾百米都有可能。

其他:

以上三種是最常用的定位方式,此外還有藍牙/IP/地磁場等手段,對於它們的優缺點,我們匯總如下:

對於這些定位方法的詳細原理以及適用范圍,我們會在以后的介紹中,細致展開。

開發者如何實現定位能力

了解了這些定位方式的“開發者實現方式”,開發者恐怕要渾身冒汗了,千千萬萬的app難道者都如上述說的,“自行維護基站、WIFI數據庫”嗎?

答案當然是否定的,在實際的工程實踐中,主流的做法是兩種:

手段之一:調用系統級定位能力

無論哪個系統(IOS、安卓、WP)都提供了一套系統級定位能力,這樣的定位能力,對應着是一套系統級API,這個API一般來說,總是會有如下幾個精度的選項:

高精度:能搜到GPS衛星,則使用GPS定位,否則,則使用WIFI定位,如果WIFI和GPS都無法定位成功,只能根據基站來給出定位結果了。

平衡功耗:禁用GPS(因為它非常耗電),優先使用WIFI,如果WIFI不可用,則用基站來進行定位。

低功耗(被動定位):根據不同系統的規定,實現方式也不同,但大體上都是共享其他app的定位結果,即其他app以高精度、平衡功耗的方式得到位置,那么這個位置也一並推送給當前使用“低功耗定位”的app,也就是該app不消耗額外的能耗,就完成了定位。

當然,這種系統級定位能力是有着軟肋的,軟肋在於以下兩點

在基站、WIFI定位能力上,系統定位能力取決於系統自己在這方面投入數據收集推算的能力,這個是參差不齊的。舉個簡單的例子,百度和高德在中國采集了成百上千個公共場所的室內定位信息,使之能達到米級的室內定位,蘋果做了嗎?谷歌做了嗎?微軟做了嗎?他們怎么和國內的服務商拼效果?居然還有人說蘋果定位和谷歌地圖在國內定位准,我真是醉了。

在中國,google的服務不可用,考慮到基站、WIFI定位必須連接服務端發請求,因而Android的系統級定位能力的可用性也會有很大的影響,至少那些“水貨”手機,在中國基本就沒法調用系統定位服務了,而行貨手機,相應的廠商會改造這個API接口的實現,使得其重定向為請求國內某些定位服務商,從而使得這個接口重新變得可用(對開發者來說,他並不需要知道這個API是如何實現的)。

但是,我們不得不承認,在IOS和WP系統上,因為OS沒有開放出讀取基站和WIFI的接口,因此實際上操作系統的定位能力已經形成了壟斷,開發者也就無法實現自主的定位能力。這也會導致在蘋果和WP手機上,所有的app在同一時刻的定位誤差,都是一樣的。

手段之二:調用第三方定位SDK

對於可以公開讀取基站、WIFI信息的Android手機系統,國內的百度、高德等地圖廠商自行實現了定位SDK,該定位SDK的作用就是通過系統接口讀取到原始定位信息,然后借助於各家自行部署維護的數據庫,查詢到當前掃描到的基站、WIFI的位置,最終計算出更准確的定位結果,通過SDK的接口,返回給開發者。這么做的好處,在於能夠讓app的定位能力脫離對手機系統的依賴。

舉個例子,一個app他如果只是調用系統定位接口,那么在行貨手機,由於手機廠商已經把定位的網絡服務器重定向為國內定位服務商,所以肯定可以定位,但是在水貨手機上因為系統底層是直接連google服務器的,就會無法定位。但用戶就是上帝,出現了這個事情在用戶看來,就是不能接受的,為了保證app在所有手機上都可以定位,開發者就會不得不使用第三方的獨立定位SDK。

結束語

在本文中,我們討論了手機定位的價值、各種定位方式的原理與開發者實現定位的工程化手段,希望大家讀完本文后,可以結合提示,給出下列問題的回答。

在蘋果手機上,微信的定位准、微博的定位不准!(蘋果手機上的應用定位能力是誰提供的?)

我們公司搬家了,我在新的公司定位到了老的地方!(先看看你是不是把路由器都帶過來了?)

在最新的Nexus6手機上,谷歌地圖居然無法定位!(谷歌地圖為什么會無法定位?)

在家里居然給我定位到幾百米以外了,我都搞不清是xx地圖太爛還是手機太爛了,不是說好GPS精度5米嗎?(家里的話GPS可以定位成功嗎?)

用陌陌,在三個位置,對同一個好友計算三次距離,即可用“三角定位”鎖定好友的位置(如果對方在室內,用的是什么定位?他的定位精確度是多少?你認為這個精度可以做三角定位,還精確到對方的家嗎?)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM