iOS 使用高德地图实现路径绘制及回放

近日状况

好久没更新了,因为换了份工作,当前公司项目在都在忙着加班赶项目,现在项目快结束了,乘这时间(其实是我懒=≡Σ(((つ•̀ω•́)つ)给更新。

瞎扯

人们生活水平高了,对自己的身体开始注意了,运动类的App开始抢占市场(我记得是14年开始的,说得自己像是一个老程序员一样) 今天我就给大家分享一篇项目中的运动模块对路径绘制及重播的部分。
先给你看一下实现的效果:


轨迹绘制及播放

因为在模拟器上测试,坐标是在地图之外,显示的是灰色的

概述

  • 这里是基于高德地图的实现的
  • 实时轨迹的绘制以及路径重播

配置

我想来看这的对于高德地图的配置应该是知道的了,如果有什么疑问参考官方。

这里使用的是高德地图4.6.1版本 基础SDK是1.4 记得使用高德地图5.0.0版本的时候坐标会飘 是的回飘,如果有用最新版的可以自行测试一下,是不是还会出现在这样的情况。

实现

1.绘制

- (void)mapView:(MAMapView *)mapView didUpdateUserLocation:(MAUserLocation *)userLocation updatingLocation:(BOOL)updatingLocation{
    
    if (!updatingLocation) {
        return;
    }
    
    if (self.isRecording)
    {
        //传感器活动状态
//        BOOL deviceActivity  = ([StepSampleManage shareManage].deviceActivityState != SADeviceActivityStateNotMoving && [StepSampleManage shareManage].deviceActivityState != SADeviceActivityStateUnknown);
//        if (SIMULATOR_TEST) {
//            deviceActivity = YES;
//        }
        BOOL deviceActivity = YES;
        if (userLocation.location.horizontalAccuracy < 40 && userLocation.location.horizontalAccuracy > 0 && deviceActivity)
        {

            if (self.currentRecord.totalDistance >= 100 && !self.existStartPointed) {
                MAPointAnnotation *annotation = [[MAPointAnnotation alloc]init];
                annotation.coordinate = self.currentRecord.coordinates[0];
                [mapView addAnnotation:annotation];
                self.existStartPointed = YES;
            }
        
            [self.locationsArray addObject:userLocation.location];
            
            NSLog(@"date: %@,now :%@",userLocation.location.timestamp,[NSDate date]);
            [self.tipView showTip:[NSString stringWithFormat:@"has got %ld locations",self.locationsArray.count]];
            
            [self.currentRecord addLocation:userLocation.location];
        
            [self.mutablePolyline appendPoint:MAMapPointForCoordinate(userLocation.location.coordinate)];
            
            [self.mapView setCenterCoordinate:userLocation.location.coordinate animated:YES];
            
            [self.mutableView referenceDidChange];
        }
    }
#ifdef DEBUG
    [self.statusView showStatusWith:userLocation.location];
#endif
}

通过代理获取的坐标的传入Record模型中,这里的模型是一个Demo的模型,你们可以根据自己的实际情况定义
mutablePolyline和mutableView相当于画笔和画板,没错这样去理解(大概就是这个意思)获取到的点在地图变成线

2.播放

播放这里使用mutablePolyline和MAMutablePolylineRenderer *mutableView 是一个能提供有多种颜色的画板去理解,读取之前保存的记录 (我之前实际项目是保存在数据库中的) 这里主要是播放速度和播放点的
控制

- (void)animateToNextCoordinate
{
    if (self.myLocation == nil)
    {
        return;
    }
    
    CLLocationCoordinate2D *coordinates = [self.record coordinates];
    if (self.currentLocationIndex == [self.record numOfLocations] )
    {
        self.currentLocationIndex = 0;
        [self actionPlayAndStop];
        return;
    }
    
    CLLocationCoordinate2D nextCoord = coordinates[self.currentLocationIndex];
    CLLocationCoordinate2D preCoord = self.currentLocationIndex == 0 ? nextCoord : self.myLocation.coordinate;
    
    self.heading = [self coordinateHeadingFrom:preCoord To:nextCoord];
    CLLocationDistance distance = MAMetersBetweenMapPoints(MAMapPointForCoordinate(nextCoord), MAMapPointForCoordinate(preCoord));
    NSTimeInterval duration = distance / (self.averageSpeed * 1000 * self.multiple);
    
    CLLocationCoordinate2D coords[2];
    coords[0] = preCoord;
    coords[1] = nextCoord;
    
    
    @weakify(self)
    [self.myLocation addMoveAnimationWithKeyCoordinates:coords count:2 withDuration:duration + 0.01 withName:kUserLoctionAnimatedKey completeCallback:^(BOOL isFinished) {
        @strongify(self)
        self.currentLocationIndex ++;
        self.playSlier.value = (float)self.currentLocationIndex/[self.record numOfLocations];
        if (isFinished) {
            [self animateToNextCoordinate];
        }
    }];
    self.myLocation.movingDirection = self.heading;
}

获取保存的当前坐标点和上一个点的动画时间

动画时间 = 距离 / (播放速度*播放倍数)

 for(MAAnnotationMoveAnimation *animation in [self.myLocation allMoveAnimations]) {
        if ([animation.name isEqualToString:kUserLoctionAnimatedKey]) {
               [animation cancel];
        }
  }

使用上述的方法去取消动画,如果对方向有要求的记录一下停止之前的方向然后再试下

self.myLocation.movingDirection = self.heading;

以上就是整个绘制和播放了

  • 如果后台绘制需要后台定位权限
  • 如果暂停的时候,我们要处理这过程可能发生的情况
  • 为了节省空间没有上传地图,demo克隆下来后重新pod update
  • 如果有什么问题,可以提出来大家讨论一下类似我的位置飘的问题,我这里是通过陀螺仪的来判断的

源码地址:路径绘制及播放

参考

https://github.com/amapapi/iOS_3D_RecordPath

结束语

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,057评论 25 707
  • 不要因为别人的速度,而去质疑自己的努力,把握好你自己的节奏,哪怕你比别人慢了那么一点,哪怕你走了很久却不如别人一个...
    暮之哀阅读 478评论 0 0
  • 来碗鸡汤: 有的人喜欢努力一下就能看到收获,就是那种踮起脚尖就能够达到的那种,然而生活中很多事需要很多下努力,所以...
    那年我19阅读 268评论 0 0
  • 昨天是儿子半岁的体检,检查出来体重偏轻将近2斤,然后是缺铁性贫血,以及缺钙,有种自己考试没及格的感觉,记得怀...
    兔小小兔阅读 218评论 0 0