iOS 里程计算不准、定位飘(弱信号)的问题解决(做个有深度的app)

目录:

  • 一、问题出现场景
  • 二、常见的计算里程方法
    1、最土及常见的计算里程方法
    2、初步优化方案:
    3、正确的判断/解决飘的问题
    4、更多关于解决隧道里定位会飘的问题
    5、其他里程计算方法(后续补充)
  • 三、CLLocation详解

前言

如果你的app不追求深度、精确度,请略过本文章。

一、问题出现场景

路测,里程计算不准确。WTF。。。什么场景会有这种需求???

答:如果你做的app是一款如滴滴司机端一样,需要计算从接乘客上车到将乘客送达,乘客下车的这段长距离的里程值的时候,相信你就会有本文所要讲的里程计算问题了。

二、常见的计算里程方法

1、最土及常见的计算里程方法

通过两点位置,计算距离,累积相加得到最后的里程值。

  • 会出现的问题:
    定位飘了怎么办?如海底隧道灯弱信号地方。
2、初步优化方案:

加上定时器,通过定时器时间及两点距离对该时间内的时速做判断,超过阈值,认为当前点无效,取下一个点跟上一个有效点比较。

  • 会出现的问题:
    判断错误,因为虽然定时器的时间都是增加的,但是定位给出的位置,有可能是我们之前给的位置。即可能出现如下返回的位置信息:
<+24.50999425,+118.18279171> +/- 10.00m (speed 8.95 mps / course 158.55) @ 17/6/23 中国标准时间17:37:48
<+24.50958770,+118.18296699> +/- 10.00m (speed 9.96 mps / course 160.66) @ 17/6/23 中国标准时间17:37:53
<+24.50910223,+118.18314439> +/- 10.00m (speed 8.32 mps / course 166.99) @ 17/6/23 中国标准时间17:37:59
<+24.50317363,+118.18252758> +/- 10.00m (speed 10.28 mps / course 198.28) @ 17/6/23 中国标准时间17:39:04
<+24.50280620,+118.18241544> +/- 10.00m (speed 10.81 mps / course 189.49) @ 17/6/23 中国标准时间17:39:08
//>>>这里开始异常了(飘回了一个之前好久定位到的点)
<+24.50958770,+118.18296699> +/- 10.00m (speed 9.96 mps / course 160.66) @ 17/6/23 中国标准时间17:37:53
<+24.50958770,+118.18296699> +/- 10.00m (speed 9.96 mps / course 160.66) @ 17/6/23 中国标准时间17:37:53
<+24.50958770,+118.18296699> +/- 10.00m (speed 9.96 mps / course 160.66) @ 17/6/23 中国标准时间17:37:53
<+24.50958770,+118.18296699> +/- 10.00m (speed 9.96 mps / course 160.66) @ 17/6/23 中国标准时间17:37:53
<+24.50958770,+118.18296699> +/- 10.00m (speed 9.96 mps / course 160.66) @ 17/6/23 中国标准时间17:37:53
//<<<这里结束异常了
<+24.50187348,+118.18212644> +/- 10.00m (speed 10.47 mps / course 197.23) @ 17/6/23 中国标准时间17:39:19
<+24.50145111,+118.18199236> +/- 10.00m (speed 9.20 mps / course 195.82) @ 17/6/23 中国标准时间17:39:24

仔细观察数据会发现:

定位飘回了一个之前好久定位到的点.png

所以,通过两点位置所得的距离,加上定时器时间间隔来判断点是否有效的方法是错误的。

那么问题来了,既然不能使用定时器的时间间隔,那两点之间所用的时间怎么算?答应该采用CLLocation里面的timestamp来计算时间差。

3、正确的判断/解决飘的问题

从上我们知道,在隧道里由于定位会飘的问题,所以定位给出的位置,有可能是我们之前给的位置。所以我们不能采用自己约定的时间差(一般是计时器)来计算时速。

仔细观察如下参考数据:

上次计算地点为:<+24.52033493,+118.19203987> +/- 373.66m (speed -1.00 mps / course -1.00) @ 17/6/23 中国标准时间16:51:27
本次计算地点为:<+24.56114169,+118.22883818> +/- 2000.00m (speed -1.00 mps / course -1.00) @ 17/6/23 中国标准时间16:52:17

我们得出,其实每个定位点CLLocation是有带该点的时间的。所以虽然计算两点的时速的时候,不能采用自己的时间差,但是可以采用CLLocation里面的timestamp来计算时间差,这也才是正解。即:我们应该判断最新的位置的时间timestamp是不是比上次的timestamp大。否则,该点就是我们之前已经获取到的点,而不是当前时间的最新点。

4、更多关于解决隧道里定位会飘的问题

更完善的过滤方法可参考:iOS定位服务,无效/不准确位置的过滤

5、其他里程计算方法

后续补充,待完善。。。。。。

三、CLLocation详解

CLLocation值修改?

    CLLocationCoordinate2D chongQingCoordinate = CLLocationCoordinate2DMake(29.554941, 106.55329); //重庆市
    CLLocation *chongQingLocation = [[CLLocation alloc] initWithLatitude:chongQingCoordinate.latitude longitude:chongQingCoordinate.longitude];
    self.location = chongQingLocation;

其他基本知识

精确度设置

设置代理后,你还要设置需要的准确度。就像我们刚刚说的精确度越高越耗电。如果你只是要是应用程序确定是哪个国家或是哪个州那么就不要设置很高的精确度。记住一点有时候你并不能得到你需要的精确度。
  下面说一个设置代理和设置精确度的例子:

locationManager.delegate = self;
locationManager.desiredAccuracy =kCLLocationAccuracyBest;

精确度使用的是一个double类型的常量。单位是米,所以如果你设置desiredAccuracy=10那么精确度就是10米,这就告诉 Location Manager尽可能达到10米的精确度。还可以设置为其他常量:

多久调用一次代理

默认情况是这样的,每当位置改变时Location Manager就调用一次代理。
而通过设置distance filter可以实现当位置改变超出一定范围时Location Manager才调用相应的代理方法。这样可以达到省电的目的

例如:locationManager.distanceFilter =1000.0f;

附设置默认值的方法是:
locationManager.distanceFilter =kCLDistanceFilterNone;
Error Notifications
  如果Core Location不能指定你当前的位置,它将调用CLLocation的第二个代理方法:locationManager:didFailWithError:,最常见的是用户取消使用定位信息。
获取定位的信息
①获取经纬度
CLLocationDegrees latitude =theLocation.coordinate.latitude;
CLLocationDegrees longitude =theLocation.coordinate.longitude;
②获取这个定位点是什么时间定到的
NSDate *timestamp = theLocation. timestamp;

CLLocation的另一个属性timestamp用来告诉Location Manager是什么时候定位的。
③获取海拔altitude
CLLocationDistance altitude = theLocation.altitude;

海拔值可能会有误差。
@property(readonly, nonatomic) CLLocationAccuracy horizontalAccuracy;//水平的精确度(负数无效)
@property(readonly, nonatomic) CLLocationAccuracy verticalAccuracy;  //垂直的精确度(负数无效)

所以每一个CLLocation对象都有一个叫verticalAccuracy的属性来判断精确度。其表示海拔数值可能会有verticalAccuracy大小的误差,当verticalAccuracy为负值时,那是Core Location在通知你不能获取海拔高度。
horizontalAccuracy属性描述调整的中心点。horizontalAccuracy值越大越不精确。
计算两点的距离
CLLocationDistance distance =[fromLocation getDistanceFrom:toLocation];

返回两个时间段内的距离,有时候它是不考虑海拔的,所以要自己计算距离。
CLLocation的其他属性
//航向 、路径  取值为:0.0 ~ 359.9 真北方向表示:0.0
@property(readonly, nonatomic) CLLocationDirection course ;

//速度 m/s
@property(readonly, nonatomic) CLLocationSpeed speed ;

//时间
@property(readonly, nonatomic, copy) NSDate *timestamp;

//显示楼层的信息,如果当地支持的话
@property(readonly, nonatomic, copy) CLFloor *floor ;

//CLFloor中的一个属性,显示低第几层楼
@property(readonly, nonatomic) NSInteger level;

//位置的描述,一般的对象都是可以调用这个属性来显示字符描述
@property (nonatomic, readonly, copy) NSString *description;

End

结束!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,026评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,655评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,726评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,204评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,558评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,731评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,944评论 2 314
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,698评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,438评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,633评论 2 247
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,125评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,444评论 3 255
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,137评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,103评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,888评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,772评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,669评论 2 271

推荐阅读更多精彩内容