使用高德獵鷹SDK仿滴滴打車誊爹,多輛車輛實時更新位置信息

使用高德獵鷹SDK仿滴滴打車瓢捉,多輛車輛實時更新位置信息。附加服務(wù)端對應(yīng)實現(xiàn)思路椎镣。

參考高德地圖文檔:
點平滑移動
查詢終端實時位置

效果

效果圖
實現(xiàn)關(guān)鍵點

1状答、標(biāo)注使用MAAnimatedAnnotation
2惊科、標(biāo)注title使用TerminalID亮钦,和“查詢實時位置回調(diào)”中的AMapTrackQueryLastPointRequest *request“ terminalID”對應(yīng)。
3蜡娶、同時查詢多個終端的實時位置 AMapTrackQueryLastPoint可調(diào)用多次映穗。

實現(xiàn)步驟

開始前請先參照高德開發(fā)文檔創(chuàng)建好工程,高德獵鷹SDK文檔宿接∧丽或下載本文中對應(yīng)的demo走诞。

1、獲取軌跡上報的參數(shù)(serviceID肮塞、TerminalID)。

獲取serviceID枕赵,參照高德服務(wù)管理文檔
獲取TerminalID如下:

- (void)setupTrack {
    AMapTrackManagerOptions *option = [[AMapTrackManagerOptions alloc] init];
    option.serviceID = kAMapTrackServiceID;
    //初始化AMapTrackManager
    self.trackManager = [[AMapTrackManager alloc] initWithOptions:option];
    self.trackManager.delegate = self;
    
    //查詢終端是否存在
    AMapTrackQueryTerminalRequest *request = [[AMapTrackQueryTerminalRequest alloc] init];
    request.serviceID = self.trackManager.serviceID;
    request.terminalName = [self saveDeviceModel];
    [self.trackManager AMapTrackQueryTerminal:request];
}

//查詢終端結(jié)果
- (void)onQueryTerminalDone:(AMapTrackQueryTerminalRequest *)request response:(AMapTrackQueryTerminalResponse *)response
{
    //查詢成功
    if ([[response terminals] count] > 0) {
        //查詢到結(jié)果拷窜,使用 Terminal ID
        NSString *terminalID = [[[response terminals] firstObject] tid];
        [self saveTerminalId:terminalID];
        //啟動上報服務(wù)(service id)篮昧,參考下一步
    }
    else {
        //查詢結(jié)果為空,創(chuàng)建新的terminal
        AMapTrackAddTerminalRequest *addRequest = [[AMapTrackAddTerminalRequest alloc] init];
        addRequest.serviceID = self.trackManager.serviceID;
        addRequest.terminalName = [self saveDeviceModel];
        [self.trackManager AMapTrackAddTerminal:addRequest];
    }
}

//創(chuàng)建終端結(jié)果
- (void)onAddTerminalDone:(AMapTrackAddTerminalRequest *)request response:(AMapTrackAddTerminalResponse *)response {
    //創(chuàng)建terminal成功
    NSString *terminalID = [response terminalID];
    [self saveTerminalId:terminalID];
    //啟動上報服務(wù)(service id)窄潭,參考下一步
}

//錯誤回調(diào)
- (void)didFailWithError:(NSError *)error associatedRequest:(id)request {
    if ([request isKindOfClass:[AMapTrackQueryTerminalRequest class]]) {
        //查詢參數(shù)錯誤
    }
    
    if ([request isKindOfClass:[AMapTrackAddTerminalRequest class]]) {
        //創(chuàng)建terminal失敗
    }
    NSLog(@"%@", error);
    
    _msgLabel.text = [NSString stringWithFormat:@"初始化失敗"];
}
- (void)saveTerminalId:(NSString *)terminalId {
    [[NSUserDefaults standardUserDefaults] setObject:terminalId forKey:@"terminalId"];
    [[NSUserDefaults standardUserDefaults] synchronize];
    
    _msgLabel.text = [NSString stringWithFormat:@"初始化成功:設(shè)備terminalId: %@", terminalId];
}

獲取完后將terminalID保存本地嫉你,供接下來軌跡上報和查詢使用躏惋。

2、開始軌跡上報

(1)距误、創(chuàng)建mapview准潭。具體代碼參照高德地圖文檔或demo中代碼域仇。
(2)、初始化軌跡上報

- (void)setupReport {
    AMapTrackManagerOptions *option = [[AMapTrackManagerOptions alloc] init];
    option.serviceID = kAMapTrackServiceID;
    
    //初始化AMapTrackManager
    self.trackManager = [[AMapTrackManager alloc] initWithOptions:option];
    self.trackManager.delegate = self;
    
    // 配置獵鷹SDK
    [self.trackManager setAllowsBackgroundLocationUpdates:YES];
    [self.trackManager setPausesLocationUpdatesAutomatically:NO];
    /**
     定位信息的采集周期,單位秒沽讹,有效值范圍[1, 60]爽雄。
     定位信息的上傳周期,單位秒叹谁,有效值范圍[5, 3000]
     */
    [self.trackManager changeGatherAndPackTimeInterval:2 packTimeInterval:2];
    // 配置本地緩存大小,默認(rèn)最多緩存50MB數(shù)據(jù)
    [self.trackManager setLocalCacheMaxSize:50];
}

(3)、開啟軌跡上報

//開始服務(wù)
        AMapTrackManagerServiceOption *serviceOption = [[AMapTrackManagerServiceOption alloc] init];
        serviceOption.terminalID = kAMapTrackTerminalID;
        
        [self.trackManager startServiceWithOptions:serviceOption];
//service 開啟結(jié)果回調(diào)
- (void)onStartService:(AMapTrackErrorCode)errorCode {
    if (errorCode == AMapTrackErrorOK) {
        //開始服務(wù)成功憔涉,繼續(xù)開啟收集上報
        [self.trackManager startGatherAndPack];
    } else {
        //開始服務(wù)失敗
        MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
        hud.mode = MBProgressHUDModeIndeterminate;
        hud.label.text = @"開始服務(wù)失敗";
        [hud hideAnimated:YES afterDelay:1];
    }
}

//gather 開啟結(jié)果回調(diào)
- (void)onStartGatherAndPack:(AMapTrackErrorCode)errorCode {
    MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
    hud.mode = MBProgressHUDModeIndeterminate;
    if (errorCode == AMapTrackErrorOK) {
        //開始采集成功
        hud.label.text = @"開始采集成功";
    } else {
        //開始采集失敗
        hud.label.text = @"開始采集失敗";
    }
    [hud hideAnimated:YES afterDelay:1];
}
3析苫、查詢對應(yīng)終端TerminalID的實時位置信息。

(1)国旷、創(chuàng)建mapview跪但。具體代碼參照高德地圖文檔或demo中代碼峦萎。
(2)、初始化軌跡查詢

- (void)setupReport {
    AMapTrackManagerOptions *option = [[AMapTrackManagerOptions alloc] init];
    option.serviceID = kAMapTrackServiceID;
    
    //初始化AMapTrackManager
    self.trackManager = [[AMapTrackManager alloc] initWithOptions:option];
    self.trackManager.delegate = self;
    
    AMapTrackQueryLastPointRequest *request = [[AMapTrackQueryLastPointRequest alloc] init];
    request.serviceID = self.trackManager.serviceID;
    request.terminalID = kAMapTrackTerminalID;
    // 糾偏
//    request.correctionMode = @"denoise=1,mapmatch=1,threshold=0,mode=driving";
    [self.trackManager AMapTrackQueryLastPoint:request];
}

(3)涂身、初始化標(biāo)注(地圖添加終端對應(yīng)的標(biāo)注)搓蚪。

- (void)setupAnnotation {
    _annotationData = @[].mutableCopy;
    
#warning 設(shè)置多個時,數(shù)組中添加TerminalID
    NSArray *annotations = @[kAMapTrackTerminalID];
    [annotations enumerateObjectsUsingBlock:^(NSString *annotationTitle, NSUInteger idx, BOOL * _Nonnull stop) {
        MAAnimatedAnnotation *anno = [[MAAnimatedAnnotation alloc] init];
        anno.title = annotationTitle;
        [_annotationData addObject:anno];
    }];
    [self.mapView addAnnotations:_annotationData];
}
(4)悴能、軌跡查詢回調(diào)(重點在這雳灾,查詢完后需要將位置、方向信息炒嘲,讓MAAnimatedAnnotation addMoveAnimationWithKeyCoordinates方法調(diào)用)匈庭,并在完成時繼續(xù)調(diào)用AMapTrackQueryLastPoint獲取終端最后位置信息。
#pragma mark 查詢實時位置回調(diào)
- (void)onQueryLastPointDone:(AMapTrackQueryLastPointRequest *)request response:(AMapTrackQueryLastPointResponse *)response {
    //查詢成功
    NSLog(@"onQueryLastPointDone%@", response.formattedDescription);
    
    if(!_isLoction){
        self.mapView.centerCoordinate = response.lastPoint.coordinate;
        _isLoction = YES;
    }
    
    AMapTrackPoint *lastPoint = response.lastPoint;
    CLLocationCoordinate2D *coordinate = malloc(sizeof(CLLocationCoordinate2D));
    CLLocationCoordinate2D *point = &coordinate[0];
    point->latitude = lastPoint.coordinate.latitude;
    point->longitude = lastPoint.coordinate.longitude;
    
    __block MAAnimatedAnnotation *anno;
    [_annotationData enumerateObjectsUsingBlock:^(MAAnimatedAnnotation *annotation, NSUInteger idx, BOOL * _Nonnull stop) {
        if([annotation.title isEqualToString:request.terminalID]){
            anno = annotation;
        }
    }];
    anno.movingDirection = lastPoint.direction;
    
    [anno addMoveAnimationWithKeyCoordinates:coordinate count:1 withDuration:1 withName:anno.title completeCallback:^(BOOL isFinished) {
        if(isFinished){
            [self.trackManager AMapTrackQueryLastPoint:request];
        }
    }];
    
}

- (void)didFailWithError:(NSError *)error associatedRequest:(id)request {
    if ([request isKindOfClass:[AMapTrackQueryLastPointRequest class]]) {
        //查詢失敗
        MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
        hud.mode = MBProgressHUDModeIndeterminate;
        hud.label.text = @"查詢失敗";
        [hud hideAnimated:YES afterDelay:1];
    }
}

到這里基本功能已經(jīng)實現(xiàn)了夭拌。

服務(wù)端對應(yīng)關(guān)系

1鸽扁、軌跡上報的TerminalID終端ID和服務(wù)器單個終端/或用戶ID關(guān)聯(lián)(用戶信息中包含TerminalID)。TerminalID由高德地圖SDK生成躲雅,然后傳給服務(wù)器巩那。TerminalID由terminalName終端名字和高德控制平臺serviceID確定。
2噪生、根據(jù)服務(wù)器列表中的TerminalID东囚,同時查詢多個終端的實時位置 AMapTrackQueryLastPoint。
3页藻、軌跡上報,只通知服務(wù)器已開啟軌跡上報璃吧,軌跡的位置信息保存在高德軌跡服務(wù)中废境。

QA:
1、怎么判斷地圖中實時顯示哪些終端巴元?

:由后臺接口返回需要顯示的終端列表(數(shù)據(jù)中包含TerminalID),接口判斷依據(jù)應(yīng)是當(dāng)前定位“范圍”加“終端是否在實時上報軌跡信息”逮刨。

2修己、怎么判斷終端是否在實時上報軌跡信息迎罗?

:由自己業(yè)務(wù)邏輯判斷何時開啟/關(guān)閉。

本文中demo鏈接:https://github.com/weiweilong/MAPLocationGithub 謝謝閱讀!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末滋戳,一起剝皮案震驚了整個濱河市啥刻,隨后出現(xiàn)的幾起案子可帽,更是在濱河造成了極大的恐慌窗怒,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件努隙,死亡現(xiàn)場離奇詭異辜昵,居然都是意外死亡,警方通過查閱死者的電腦和手機躬存,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門岭洲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來坎匿,“玉大人,你說我怎么就攤上這事碑诉。” “怎么了德挣?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵快毛,是天一觀的道長。 經(jīng)常有香客問我屯掖,道長襟衰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任绍坝,我火速辦了婚禮,結(jié)果婚禮上椎咧,老公的妹妹穿的比我還像新娘把介。我一直安慰自己,他們只是感情好拗踢,可當(dāng)我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布秒拔。 她就那樣靜靜地躺著,像睡著了一般作谚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上妹懒,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天眨唬,我揣著相機與錄音好乐,去河邊找鬼。 笑死岭妖,一個胖子當(dāng)著我的面吹牛反璃,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播斋攀,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼梧田,長吁一口氣:“原來是場噩夢啊……” “哼侧蘸!你這毒婦竟也來了闺魏?” 一聲冷哼從身側(cè)響起俯画,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤艰垂,失蹤者是張志新(化名)和其女友劉穎埋虹,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體胰柑,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡柬讨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年踩官,在試婚紗的時候發(fā)現(xiàn)自己被綠了境输。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蔗牡。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡辩越,死狀恐怖黔攒,靈堂內(nèi)的尸體忽然破棺而出蒋院,到底是詐尸還是另有隱情,我是刑警寧澤欺旧,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布栅哀,位于F島的核電站,受9級特大地震影響留拾,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜痴柔,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一咳蔚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧侈询,春花似錦扔字、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽系任。三九已至,卻和暖如春嘉蕾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背错忱。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工以清, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人崎逃。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓掷倔,卻偏偏與公主長得像,于是被迫代替她去往敵國和親个绍。 傳聞我的和親對象是個殘疾皇子勒葱,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,786評論 2 345

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