本文作者:chuanming。更多內(nèi)容請關(guān)注:Map_technology。
手機定位的價值
目前智能手機的使用已經(jīng)越來越普遍,手機定位也是手機上的一個核心基礎(chǔ)功能。舉一個常見的應(yīng)用如叫車,司機需要知道你在哪里,同時打車軟件也需要基于司機和乘客的位置規(guī)劃一條路線,讓司機更高效的行駛到用戶這里。這就是典型的定位服務(wù)的應(yīng)用。當(dāng)然,除去這種應(yīng)用,用戶位置本身的展示,也是地圖產(chǎn)品中不可缺少的。
那么問題就來了,作為app的用戶,你可能會好奇這個app是如何知道你的位置;而作為app的開發(fā)者,是如何在程序中得到設(shè)備當(dāng)前的準(zhǔn)確位置的呢?
這個問題說來話長,我們還是先從定位原理上來解釋吧!
可用于無線定位的信號
很顯然,一個功能正常的手機,總是能夠受到各種無線信號,這些無線信號的“局部唯一性”,是該設(shè)備能定位的關(guān)鍵前提。什么叫局部唯一性?我們再把這些具體的信號來展開解釋下你就知道了:
基站信號:
一個手機能夠接打電話、收發(fā)短信,說明該手機能與附近基站發(fā)起交互,收發(fā)信號。特別地,對于智能手機,還可以通過系統(tǒng)的接口得到基站ID。正常情況下,每個基站ID是全球唯一的,這樣如果掃到了某個基站ID,我們又知道該基站的位置,便能粗略估計設(shè)備的位置。做出這個推測的前提就是一個基站的信號發(fā)射范圍是有限的,正常的手機,不可能在相距這個基站很遠(yuǎn)的時候,還收到這個基站的信號。
在無線通信相關(guān)的教科書里,講到基站定位,總是會談到三角定位,也就是下圖描述的原理。下圖是很容易理解的,一個手機能掃描到三個基站的信號,因此其必然在三個基站的共同覆蓋范圍內(nèi),從而推算的范圍就大大縮小。但現(xiàn)實是很骨感的,在現(xiàn)在的智能手機上,只有極少數(shù)的手機可以獲取到多個周圍的基站ID,而且也無法反算出和這些基站的距離,所以這個算法除非電信運營商自己可以試試,對于別人是沒有實戰(zhàn)價值的。在實戰(zhàn)中,只能是退而求其次,基于單個基站來定位。
WIFI信號:
現(xiàn)在的智能手機都支持wifi上網(wǎng)了,而我們連接的每個wifi路由器(包括手機做移動熱點的那種),都有全球唯一的MAC地址。更重要的是,wifi路由器的部署成本低,因而非常普遍,在一個樓層里就會有很多個wifi熱點。因而不難想到,一旦我們有了這個全球每個路由器的實際位置,那么我們就可以基于用戶手機掃描到的周圍wifi熱點,確定用戶當(dāng)前的位置。
說到這里,有的朋友會問,如果一個人帶著手機,開著移動熱點到處行走,還有那種地鐵、高鐵、公交車上的移動wifi,豈不是就會引起定位的錯誤?答對了,確實是這樣,而且根據(jù)統(tǒng)計,這種情形還在愈演愈烈。因此,如何想辦法來迅速過濾這種移動熱點,是個值得研究的問題。
GPS信號:
如果手機在室外或者窗邊,那么就可以接收到天上的定位衛(wèi)星發(fā)射出來的信號,基于這種信號,可以推算手機到每顆衛(wèi)星的距離、衛(wèi)星位置,進(jìn)而推算出手機的位置來。需要注意的是,這個解算是在GPS芯片中完成的,在手機操作系統(tǒng)層面上,可以直接通過API接口得到解算的結(jié)果和誤差半徑。
對于GPS的原因我們不多解釋,但在調(diào)用時要注意兩點。第一就是GPS的初始定位是很耗時間的,對于老一些的芯片,可能要耗費幾分鐘才能冷啟動定位成功;第二是GPS精度并非是完全可依賴的,在一些地方達(dá)到幾百米都有可能。
其他:
以上三種是最常用的定位方式,此外還有藍(lán)牙/IP/地磁場等手段,對于它們的優(yōu)缺點,我們匯總?cè)缦拢?/p>
對于這些定位方法的詳細(xì)原理以及適用范圍,我們會在以后的介紹中,細(xì)致展開。
開發(fā)者如何實現(xiàn)定位能力
了解了這些定位方式的“開發(fā)者實現(xiàn)方式”,開發(fā)者恐怕要渾身冒汗了,千千萬萬的app難道者都如上述說的,“自行維護(hù)基站、WIFI數(shù)據(jù)庫”嗎?
答案當(dāng)然是否定的,在實際的工程實踐中,主流的做法是兩種:
手段之一:調(diào)用系統(tǒng)級定位能力
無論哪個系統(tǒng)(IOS、安卓、WP)都提供了一套系統(tǒng)級定位能力,這樣的定位能力,對應(yīng)著是一套系統(tǒng)級API,這個API一般來說,總是會有如下幾個精度的選項:
高精度:能搜到GPS衛(wèi)星,則使用GPS定位,否則,則使用WIFI定位,如果WIFI和GPS都無法定位成功,只能根據(jù)基站來給出定位結(jié)果了。
平衡功耗:禁用GPS(因為它非常耗電),優(yōu)先使用WIFI,如果WIFI不可用,則用基站來進(jìn)行定位。
低功耗(被動定位):根據(jù)不同系統(tǒng)的規(guī)定,實現(xiàn)方式也不同,但大體上都是共享其他app的定位結(jié)果,即其他app以高精度、平衡功耗的方式得到位置,那么這個位置也一并推送給當(dāng)前使用“低功耗定位”的app,也就是該app不消耗額外的能耗,就完成了定位。
當(dāng)然,這種系統(tǒng)級定位能力是有著軟肋的,軟肋在于以下兩點
在基站、WIFI定位能力上,系統(tǒng)定位能力取決于系統(tǒng)自己在這方面投入數(shù)據(jù)收集推算的能力,這個是參差不齊的。舉個簡單的例子,百度和高德在中國采集了成百上千個公共場所的室內(nèi)定位信息,使之能達(dá)到米級的室內(nèi)定位,蘋果做了嗎?谷歌做了嗎?微軟做了嗎?他們怎么和國內(nèi)的服務(wù)商拼效果?居然還有人說蘋果定位和谷歌地圖在國內(nèi)定位準(zhǔn),我真是醉了。
在中國,google的服務(wù)不可用,考慮到基站、WIFI定位必須連接服務(wù)端發(fā)請求,因而Android的系統(tǒng)級定位能力的可用性也會有很大的影響,至少那些“水貨”手機,在中國基本就沒法調(diào)用系統(tǒng)定位服務(wù)了,而行貨手機,相應(yīng)的廠商會改造這個API接口的實現(xiàn),使得其重定向為請求國內(nèi)某些定位服務(wù)商,從而使得這個接口重新變得可用(對開發(fā)者來說,他并不需要知道這個API是如何實現(xiàn)的)。
但是,我們不得不承認(rèn),在IOS和WP系統(tǒng)上,因為OS沒有開放出讀取基站和WIFI的接口,因此實際上操作系統(tǒng)的定位能力已經(jīng)形成了壟斷,開發(fā)者也就無法實現(xiàn)自主的定位能力。這也會導(dǎo)致在蘋果和WP手機上,所有的app在同一時刻的定位誤差,都是一樣的。
手段之二:調(diào)用第三方定位SDK
對于可以公開讀取基站、WIFI信息的Android手機系統(tǒng),國內(nèi)的百度、高德等地圖廠商自行實現(xiàn)了定位SDK,該定位SDK的作用就是通過系統(tǒng)接口讀取到原始定位信息,然后借助于各家自行部署維護(hù)的數(shù)據(jù)庫,查詢到當(dāng)前掃描到的基站、WIFI的位置,最終計算出更準(zhǔn)確的定位結(jié)果,通過SDK的接口,返回給開發(fā)者。這么做的好處,在于能夠讓app的定位能力脫離對手機系統(tǒng)的依賴。
舉個例子,一個app他如果只是調(diào)用系統(tǒng)定位接口,那么在行貨手機,由于手機廠商已經(jīng)把定位的網(wǎng)絡(luò)服務(wù)器重定向為國內(nèi)定位服務(wù)商,所以肯定可以定位,但是在水貨手機上因為系統(tǒng)底層是直接連google服務(wù)器的,就會無法定位。但用戶就是上帝,出現(xiàn)了這個事情在用戶看來,就是不能接受的,為了保證app在所有手機上都可以定位,開發(fā)者就會不得不使用第三方的獨立定位SDK。
結(jié)束語
在本文中,我們討論了手機定位的價值、各種定位方式的原理與開發(fā)者實現(xiàn)定位的工程化手段,希望大家讀完本文后,可以結(jié)合提示,給出下列問題的回答。
在蘋果手機上,微信的定位準(zhǔn)、微博的定位不準(zhǔn)!(蘋果手機上的應(yīng)用定位能力是誰提供的?)
我們公司搬家了,我在新的公司定位到了老的地方!(先看看你是不是把路由器都帶過來了?)
在最新的Nexus6手機上,谷歌地圖居然無法定位!(谷歌地圖為什么會無法定位?)
在家里居然給我定位到幾百米以外了,我都搞不清是xx地圖太爛還是手機太爛了,不是說好GPS精度5米嗎?(家里的話GPS可以定位成功嗎?)
用陌陌,在三個位置,對同一個好友計算三次距離,即可用“三角定位”鎖定好友的位置(如果對方在室內(nèi),用的是什么定位?他的定位精確度是多少?你認(rèn)為這個精度可以做三角定位,還精確到對方的家嗎?)
{{item.content}}