iOS 使用高德地圖實現(xiàn)路徑繪制及回放

近日狀況

好久沒更新了跟压,因為換了份工作擦囊,當(dāng)前公司項目在都在忙著加班趕項目馆类,現(xiàn)在項目快結(jié)束了混聊,乘這時間(其實是我懶=≡Σ(((つ??ω??)つ)給更新。

瞎扯

人們生活水平高了,對自己的身體開始注意了句喜,運(yùn)動類的App開始搶占市場(我記得是14年開始的预愤,說得自己像是一個老程序員一樣) 今天我就給大家分享一篇項目中的運(yùn)動模塊對路徑繪制及重播的部分。
先給你看一下實現(xiàn)的效果:


軌跡繪制及播放

因為在模擬器上測試咳胃,坐標(biāo)是在地圖之外植康,顯示的是灰色的

概述

  • 這里是基于高德地圖的實現(xiàn)的
  • 實時軌跡的繪制以及路徑重播

配置

我想來看這的對于高德地圖的配置應(yīng)該是知道的了,如果有什么疑問參考官方展懈。

這里使用的是高德地圖4.6.1版本 基礎(chǔ)SDK是1.4 記得使用高德地圖5.0.0版本的時候坐標(biāo)會飄 是的回飄销睁,如果有用最新版的可以自行測試一下,是不是還會出現(xiàn)在這樣的情況存崖。

實現(xiàn)

1.繪制

- (void)mapView:(MAMapView *)mapView didUpdateUserLocation:(MAUserLocation *)userLocation updatingLocation:(BOOL)updatingLocation{
    
    if (!updatingLocation) {
        return;
    }
    
    if (self.isRecording)
    {
        //傳感器活動狀態(tài)
//        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
}

通過代理獲取的坐標(biāo)的傳入Record模型中冻记,這里的模型是一個Demo的模型,你們可以根據(jù)自己的實際情況定義
mutablePolyline和mutableView相當(dāng)于畫筆和畫板来惧,沒錯這樣去理解(大概就是這個意思)獲取到的點在地圖變成線

2.播放

播放這里使用mutablePolyline和MAMutablePolylineRenderer *mutableView 是一個能提供有多種顏色的畫板去理解冗栗,讀取之前保存的記錄 (我之前實際項目是保存在數(shù)據(jù)庫中的) 這里主要是播放速度和播放點的
控制

- (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;
}

獲取保存的當(dāng)前坐標(biāo)點和上一個點的動畫時間

動畫時間 = 距離 / (播放速度*播放倍數(shù))

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

使用上述的方法去取消動畫,如果對方向有要求的記錄一下停止之前的方向然后再試下

self.myLocation.movingDirection = self.heading;

以上就是整個繪制和播放了

  • 如果后臺繪制需要后臺定位權(quán)限
  • 如果暫停的時候供搀,我們要處理這過程可能發(fā)生的情況
  • 為了節(jié)省空間沒有上傳地圖隅居,demo克隆下來后重新pod update
  • 如果有什么問題,可以提出來大家討論一下類似我的位置飄的問題葛虐,我這里是通過陀螺儀的來判斷的

源碼地址:路徑繪制及播放

參考

https://github.com/amapapi/iOS_3D_RecordPath

結(jié)束語

  • 還有就是...就是...那個...那個...Demo是簡化版的胎源,搬過來有點花時間和上面的UI有不一樣的地方 ??
  • 下一次更新陀螺儀獲取步數(shù)
  • 如果對你有所幫助,請我給我一顆star作為鼓勵
我不管我最帥挡闰,我是你們的小可愛
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末乒融,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子摄悯,更是在濱河造成了極大的恐慌,老刑警劉巖愧捕,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奢驯,死亡現(xiàn)場離奇詭異,居然都是意外死亡次绘,警方通過查閱死者的電腦和手機(jī)瘪阁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來邮偎,“玉大人管跺,你說我怎么就攤上這事『探” “怎么了豁跑?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長泻云。 經(jīng)常有香客問我艇拍,道長狐蜕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任卸夕,我火速辦了婚禮层释,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘快集。我一直安慰自己贡羔,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布个初。 她就那樣靜靜地躺著治力,像睡著了一般。 火紅的嫁衣襯著肌膚如雪勃黍。 梳的紋絲不亂的頭發(fā)上宵统,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機(jī)與錄音覆获,去河邊找鬼马澈。 笑死,一個胖子當(dāng)著我的面吹牛弄息,可吹牛的內(nèi)容都是我干的痊班。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼摹量,長吁一口氣:“原來是場噩夢啊……” “哼涤伐!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起缨称,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤凝果,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后睦尽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體器净,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年当凡,在試婚紗的時候發(fā)現(xiàn)自己被綠了山害。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡沿量,死狀恐怖浪慌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情朴则,我是刑警寧澤权纤,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響妖碉,放射性物質(zhì)發(fā)生泄漏涌庭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一欧宜、第九天 我趴在偏房一處隱蔽的房頂上張望坐榆。 院中可真熱鬧,春花似錦冗茸、人聲如沸席镀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽豪诲。三九已至,卻和暖如春挂绰,著一層夾襖步出監(jiān)牢的瞬間屎篱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工葵蒂, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留交播,地道東北人。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓践付,卻偏偏與公主長得像秦士,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子永高,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,167評論 25 707
  • 不要因為別人的速度隧土,而去質(zhì)疑自己的努力,把握好你自己的節(jié)奏命爬,哪怕你比別人慢了那么一點曹傀,哪怕你走了很久卻不如別人一個...
    暮之哀閱讀 502評論 0 0
  • 來碗雞湯: 有的人喜歡努力一下就能看到收獲,就是那種踮起腳尖就能夠達(dá)到的那種遇骑,然而生活中很多事需要很多下努力卖毁,所以...
    那年我19閱讀 272評論 0 0
  • 昨天是兒子半歲的體檢练链,檢查出來體重偏輕將近2斤,然后是缺鐵性貧血奴拦,以及缺鈣媒鼓,有種自己考試沒及格的感覺,記得懷...
    打鐵的小鐵人閱讀 226評論 0 0