1.如何精确获取地理位置并获取较为准确的地标
CLLocationManager类可以实时的获得我们位置的经纬度,并且可以通过经纬度在MapView上定位:
CLLocationManager可以根据自身情况来设置desiredAccuracy来改变精度。设置了CLLocationManager代理后如果获取到了WIFI,基站或者GPS的经纬度会回调下面方法:
我们对获取到的locations这个数组取了一个CLLocation出来。location.horizontalAccuracy,CLLocation这个类里面包含了horizontalAccuracy,verticalAccuracy,speed等等。我们现在需要的是对horizontalAccuracy进行限定,因为horizontalAccuracy越大返回的数据精度却是越不精确。location.horizontalAccuracy一般的精度在65,精确的有在20,遇到过不精确的有达到2000,会受一些物理环境的影响。我们获取到了horizontalAccuracy值较小的CLLocation后就去高德api地址查询接口:
self.radius是高德所需的一个范围查询,越小返回的地标越准确。
2.利用地图进行距离计算和平滑轨迹上传
有了1提到的精确坐标我们就开始计算里程。一段长距离的里程我们可以分割成N段直接距离,所以我们要确定好一个合理的时间去计算每小段的距离。我们记录了两段时间currentTime,oldTime,根据这两段时间我们就能获取到这段路程花费的时间,根据高德给出的直线距离计算 distance = (self.userCLLocation?.distance(from: self.oldCLLocation!))! / 1000我们能获取到里程,然后依次了累加。
但是还是会有突发情况发生,比如:APP奔溃,或者进入到隧道,经纬度获取条件差的地带,那我们怎么解决呢?想一段一段计算里程那是不可能的,因为我们获取不到经纬度,考虑到高德地图有给出路线规划的一个api,那我们只好用路线规划的距离去弥补最小的损失。
在特殊情况我们只需要保存startPoint,和获取到最新的endPoint。然后看高德驾车路线规划的回调
driveManager.naviRoute?.routeLength就是上述两个点的距离。
下面我们来说下绘制平滑驾车轨迹点的办法:lbs.amap.com/api/ios-sdk/guide/draw-on-map/trace
3.使用地图优化电量
先看下一个链接stackoverflow.com/questions/9746675/cllocationmanager-responsiveness
if(([[UIDevice currentDevice] batteryState] == UIDeviceBatteryStateCharging) || ([[UIDevice currentDevice] batteryState] == UIDeviceBatteryStateFull)) {
locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;
} else {
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
}
这是人家给出的电量优化小技巧,但是效果不大,如下:
我们来理解下这句话:首先有两件事可以改善,第一呢就是使用kCLLocationAccuracyBestForNavigation这个参数。没有真正的电池使用的差异和kcllocationaccuracybest一样,他们都以最快的速度使用GPS。这里提到了最主要的区别就是苹果的post-processing处理机制。 第二,不需要为速度等于0做过滤,苹果已经进行了过滤:如果GPS的速度低于某一阈值(大约4km/h),操作系统假设您静止不动,它将为所有后续值提供相同位置值作为替换,知道监测到你动了为止。我认为他们这样做,以避免“抖动”的地图时,你仍站着。事实上,速度已经下降到0的最后一个实际值的序列“静止”值,所以如果你过滤速度= 0比你错过了一个真正的GPS样本。不幸的是,他们无法避免过滤和获得真正的GPS样本。我和苹果公司谈过此事,他们的反应是他们不会改变这种行为。kcllocationaccuracybestfornavigation和kcllocationaccuracybest过滤比,所以最好使用。第三,你可能已经在这样做了,但要确保你所说的“你的观点正确setNeedsDisplay”从“didupdatefromlocation:“,以确保地图实际上是重绘。如果你这样做,你应该有大约1秒的滞后。如果你想提高1秒,你可以试着使用预测技术。从最后两个位置和给定的速度,您可以计算下一个位置可能是什么位置,并且已经显示了该位置。我的结果好坏参半。它能很好地工作,不会像驾驶汽车那样突然改变速度。它对诸如步行或骑自行车这样的慢动作效果较差。
4.Relam 数据库的介绍
www.cocoachina.com/ios/20150505/11756.htm
特别注意的是:当更改表的字段后需要对数据库进行迁移升级操作,操作代码如下