一、常見定位技術(shù)
1.基站定位
每個手機基站都有一個ID標識符,插上sim卡的手機或其他終端可以搜集周圍所有收到信號的基站和其ID,查詢定位服務器可知基站位置。再通過計算基站信號傳播到終端的角度、時間和強度等信息,就可以確定終端的位置。基站定位速度快,但準確度較低,精度為平均200米左右,視運營商基站覆蓋范圍而定。
無網(wǎng)基站定位:傳統(tǒng)的基站定位需要連接云端服務器,產(chǎn)生網(wǎng)絡(luò)流量,蘋果在iOS 4開始對其進行了優(yōu)化,預先將一些重要基站提前存儲在iOS系統(tǒng)中,在無網(wǎng)情況下,不用上網(wǎng)也能通過這些本地基站信息定位到用戶位置,但這個誤差范圍更大,在10公里到50公里。
2.Wi-Fi定位
每一個Wi-Fi熱點都有一個獨一無二的MAC地址,智能手機等設(shè)備開啟Wi-Fi后就會自動掃描附近熱點并上傳它們的地理位置信息,這樣就建立了一個龐大的熱點位置數(shù)據(jù)庫。反過來講,如果你的設(shè)備連上了某個Wi-Fi熱點,那么就可以調(diào)用服務器或離線數(shù)據(jù)中附近所有熱點的地理位置信息,而服務器會參考每個熱點的信號強弱計算出設(shè)備的大致地理位置,最后再返回給用戶。Wi-Fi定位精度為20米左右。
無網(wǎng)WIFI定位:傳統(tǒng)的WIFI定位需要網(wǎng)絡(luò),但是iOS對其進行了優(yōu)化,在設(shè)備有網(wǎng)絡(luò)連接時,會大致定位出設(shè)備的位置,并自動下載所在地區(qū)周圍(幾個街區(qū)寬度或者更多)所有的WIFI熱點的信息到本地。之后,當設(shè)備在周圍移動并進行WIFI定位的時候,即使沒有網(wǎng)絡(luò),iOS照樣可以利用之前下載的WIFI熱點信息定位出設(shè)備的位置。
3.GPS定位
GPS定位需要GPS硬件支持,直接和衛(wèi)星交互來獲取當前經(jīng)緯度與準確時間。接收機在戶外接收到天上的定位衛(wèi)星發(fā)射出來的信號,得到衛(wèi)星的位置,推算出接收機到每顆衛(wèi)星的距離,進而推算出手機的位置。通過GPS方式定位準確度是最高的(10米左右,取決于芯片),但是從GPS模塊啟動到獲取第一次定位數(shù)據(jù)(冷啟動),可能需要比較長的時間,并且GPS模塊耗電量大,且在室內(nèi)幾乎無法使用。
4.AGPS定位(Assisted?GPS)
AGPS利用網(wǎng)絡(luò),首先將基站定位或者WIFI定位獲得的大概位置發(fā)到遠程服務器,有服務器進行查詢和計算,得出這個位置下當前衛(wèi)星信息,反饋給設(shè)備,設(shè)備就可以直接用這些信息來接受衛(wèi)星信號,不用等待漫長的衛(wèi)星軌道信息廣播完畢后,才能知道衛(wèi)星的位置,大大縮短搜星時間。GPS解決方案的優(yōu)勢主要體現(xiàn)在其定位精度上,在室外等空曠地區(qū),其精度在正常的GPS工作環(huán)境下,可以達到10米左右,堪稱目前定位精度最高的一種定位技術(shù)。該技術(shù)的另一優(yōu)點為:首次捕獲GPS信號的時間一般僅需幾秒,不像GPS的首次捕獲時間可能要2~3分鐘。
二、iOS與Android的定位實現(xiàn)
1.iOS的定位實現(xiàn)
iOS定位使用都是Core Location框架,然后用CLLocationManager類來實現(xiàn)定位,系統(tǒng)會自動分配使用哪種定位方式,并且還會有緩存。
iOS設(shè)備能提供3種不同途徑進行定位:Wi-Fi、蜂窩式移動電話基站、GPS衛(wèi)星(包括AGPS)。
iOS不像Android系統(tǒng)在定位服務編程時,可以指定采用哪種途徑進行定位。iOS的API把底層這些細節(jié)屏蔽掉了,開發(fā)人員和用戶并不知道現(xiàn)在設(shè)備是采用哪種方式進行定位的,iOS系統(tǒng)會根據(jù)設(shè)備的情況和周圍的環(huán)境,采用一套最佳的解決方案。如果能夠接收GPS信息,那么設(shè)備優(yōu)先采用GPS定位,否則采用Wi-Fi或蜂窩基站定位。在Wi-Fi和蜂窩基站之間優(yōu)先使用Wi-Fi,如果無法連接Wi-Fi才使用蜂窩基站定位。
2.Android的定位實現(xiàn)
Android系統(tǒng)API提供基站ID和WIFI的mac地址獲取接口,開發(fā)者自行維護基站、mac數(shù)據(jù)庫,自行查詢推算位置。而GPS定位信息則可以直接調(diào)用系統(tǒng)API獲得。
除了自行維護數(shù)據(jù)庫之外,也可以使用百度、高德等地圖廠商自行實現(xiàn)的定位SDK。該定位SDK的作用就是通過系統(tǒng)接口讀取到原始定位信息,然后借助于各家自行部署維護的數(shù)據(jù)庫,查詢到當前掃描到的基站、WIFI的位置,最終計算出更準確的定位結(jié)果,通過SDK的接口,返回給開發(fā)者。
在中國,Google服務器不可用,這會造成一定的問題。一個app如果只是調(diào)用系統(tǒng)定位接口,那么在行貨手機,由于手機廠商已經(jīng)把定位的網(wǎng)絡(luò)服務器重定向為國內(nèi)定位服務商,所以肯定可以定位,但是在水貨手機上因為系統(tǒng)底層是直接連google服務器的,就會無法定位。為了保證app在所有手機上都可以定位,開發(fā)者就會不得不使用第三方的獨立定位SDK。
三、坐標信息
1.坐標偏移
WGS84是GPS全球定位系統(tǒng)使用的坐標系統(tǒng),GPS設(shè)備直接返回的坐標即為WGS84。GCJ02則是由中國國家測繪局制定的地理信息系統(tǒng)的坐標,也叫“火星坐標”,國內(nèi)出版的各種地圖坐標系統(tǒng)(包括電子地圖),必須至少采用GCJ02對WGS84進行首次加密。高德和搜狗等使用GCJ02,百度地圖會再加密一層,編碼系統(tǒng)叫BD09。
iOS系統(tǒng)上通過定位服務CLLocation相關(guān)接口獲取定位信息時,獲取的經(jīng)緯度坐標系是WGS84地球坐標,如果直接將該坐標系在iOS系統(tǒng)地圖中打點,會發(fā)現(xiàn)存在偏移,因為iOS系統(tǒng)地圖查看國內(nèi)時使用的是高德地圖數(shù)據(jù),因此只接受GCJ02火星坐標。如果在國內(nèi)iOS系統(tǒng)地圖中獲取當前位置,那么獲取到的坐標系是GCJ02火星坐標系。
Android系統(tǒng)上通常使用高德或者百度定位SDK獲取定位信息。高德SDK沒有坐標系參數(shù)設(shè)定,在大陸和港澳地區(qū)獲取的坐標系即為GCJ02坐標系,在臺灣和海外地區(qū)都是WGS84坐標系;百度SDK可以自行設(shè)定坐標系參數(shù),即返回WGS84坐標系,還是GCJ02坐標系或者BD09坐標系(注意BD09坐標系只適用于百度地圖),如果設(shè)定的是GCJ02坐標系,它在大陸+港澳臺地區(qū)獲取的坐標系都是GCJ02坐標系。如果沒有調(diào)用第三方地圖API,而是使用android.location獲取的經(jīng)緯度,或者是通過手持或車載的GPS終端獲取的經(jīng)緯度,那就是屬于WGS84的真實的地理坐標,這時候,直接在百度或者高德地圖上顯示是會出現(xiàn)偏移的。
因此,若想獲取到準確的坐標位置,需要對從設(shè)備獲取的坐標信息進行修正。
2.坐標信息
從設(shè)備獲取到的定位信息統(tǒng)一格式:經(jīng)度在前,維度在后,經(jīng)緯度間以“,”分隔,經(jīng)緯度小數(shù)點后精確到6位數(shù)。
坐標轉(zhuǎn)換代碼:https://github.com/googollee/eviltransform
——部分內(nèi)容整理自網(wǎng)絡(luò)——