1.如何精確獲取地理位置并獲取較為準(zhǔn)確的地標(biāo)
CLLocationManager類可以實(shí)時(shí)的獲得我們位置的經(jīng)緯度,并且可以通過(guò)經(jīng)緯度在MapView上定位:

CLLocationManager可以根據(jù)自身情況來(lái)設(shè)置desiredAccuracy來(lái)改變精度。設(shè)置了CLLocationManager代理后如果獲取到了WIFI,基站或者GPS的經(jīng)緯度會(huì)回調(diào)下面方法:

我們對(duì)獲取到的locations這個(gè)數(shù)組取了一個(gè)CLLocation出來(lái)。location.horizontalAccuracy,CLLocation這個(gè)類里面包含了horizontalAccuracy,verticalAccuracy,speed等等。我們現(xiàn)在需要的是對(duì)horizontalAccuracy進(jìn)行限定,因?yàn)閔orizontalAccuracy越大返回的數(shù)據(jù)精度卻是越不精確。location.horizontalAccuracy一般的精度在65,精確的有在20,遇到過(guò)不精確的有達(dá)到2000,會(huì)受一些物理環(huán)境的影響。我們獲取到了horizontalAccuracy值較小的CLLocation后就去高德api地址查詢接口:

self.radius是高德所需的一個(gè)范圍查詢,越小返回的地標(biāo)越準(zhǔn)確。
2.利用地圖進(jìn)行距離計(jì)算和平滑軌跡上傳

有了1提到的精確坐標(biāo)我們就開(kāi)始計(jì)算里程。一段長(zhǎng)距離的里程我們可以分割成N段直接距離,所以我們要確定好一個(gè)合理的時(shí)間去計(jì)算每小段的距離。我們記錄了兩段時(shí)間currentTime,oldTime,根據(jù)這兩段時(shí)間我們就能獲取到這段路程花費(fèi)的時(shí)間,根據(jù)高德給出的直線距離計(jì)算?distance = (self.userCLLocation?.distance(from: self.oldCLLocation!))! / 1000我們能獲取到里程,然后依次了累加。
但是還是會(huì)有突發(fā)情況發(fā)生,比如:APP奔潰,或者進(jìn)入到隧道,經(jīng)緯度獲取條件差的地帶,那我們?cè)趺唇鉀Q呢?想一段一段計(jì)算里程那是不可能的,因?yàn)槲覀儷@取不到經(jīng)緯度,考慮到高德地圖有給出路線規(guī)劃的一個(gè)api,那我們只好用路線規(guī)劃的距離去彌補(bǔ)最小的損失。

在特殊情況我們只需要保存startPoint,和獲取到最新的endPoint。然后看高德駕車路線規(guī)劃的回調(diào)

driveManager.naviRoute?.routeLength就是上述兩個(gè)點(diǎn)的距離。
下面我們來(lái)說(shuō)下繪制平滑駕車軌跡點(diǎn)的辦法:lbs.amap.com/api/ios-sdk/guide/draw-on-map/trace
3.使用地圖優(yōu)化電量
先看下一個(gè)鏈接stackoverflow.com/questions/9746675/cllocationmanager-responsiveness
if(([[UIDevice currentDevice] batteryState] == UIDeviceBatteryStateCharging) || ([[UIDevice currentDevice] batteryState] == UIDeviceBatteryStateFull)) {
locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
} else {
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
}
這是人家給出的電量?jī)?yōu)化小技巧,但是效果不大,如下:

我們來(lái)理解下這句話:首先有兩件事可以改善,第一呢就是使用kCLLocationAccuracyBestForNavigation這個(gè)參數(shù)。沒(méi)有真正的電池使用的差異和kcllocationaccuracybest一樣,他們都以最快的速度使用GPS。這里提到了最主要的區(qū)別就是蘋(píng)果的post-processing處理機(jī)制。 ?第二,不需要為速度等于0做過(guò)濾,蘋(píng)果已經(jīng)進(jìn)行了過(guò)濾:如果GPS的速度低于某一閾值(大約4km/h),操作系統(tǒng)假設(shè)您靜止不動(dòng),它將為所有后續(xù)值提供相同位置值作為替換,知道監(jiān)測(cè)到你動(dòng)了為止。我認(rèn)為他們這樣做,以避免“抖動(dòng)”的地圖時(shí),你仍站著。事實(shí)上,速度已經(jīng)下降到0的最后一個(gè)實(shí)際值的序列“靜止”值,所以如果你過(guò)濾速度= 0比你錯(cuò)過(guò)了一個(gè)真正的GPS樣本。不幸的是,他們無(wú)法避免過(guò)濾和獲得真正的GPS樣本。我和蘋(píng)果公司談過(guò)此事,他們的反應(yīng)是他們不會(huì)改變這種行為。kcllocationaccuracybestfornavigation和kcllocationaccuracybest過(guò)濾比,所以最好使用。第三,你可能已經(jīng)在這樣做了,但要確保你所說(shuō)的“你的觀點(diǎn)正確setNeedsDisplay”從“didupdatefromlocation:“,以確保地圖實(shí)際上是重繪。如果你這樣做,你應(yīng)該有大約1秒的滯后。如果你想提高1秒,你可以試著使用預(yù)測(cè)技術(shù)。從最后兩個(gè)位置和給定的速度,您可以計(jì)算下一個(gè)位置可能是什么位置,并且已經(jīng)顯示了該位置。我的結(jié)果好壞參半。它能很好地工作,不會(huì)像駕駛汽車那樣突然改變速度。它對(duì)諸如步行或騎自行車這樣的慢動(dòng)作效果較差。
4.Relam 數(shù)據(jù)庫(kù)的介紹
www.cocoachina.com/ios/20150505/11756.htm
特別注意的是:當(dāng)更改表的字段后需要對(duì)數(shù)據(jù)庫(kù)進(jìn)行遷移升級(jí)操作,操作代碼如下