iOS使用百度地圖繪制軌跡

前言

需要實(shí)現(xiàn)員工巡查功能硫狞,展示地圖,并顯示員工當(dāng)前所在位置晃痴。當(dāng)該員工點(diǎn)擊“開(kāi)始巡查”按鈕残吩,則追隨其腳步,進(jìn)行軌跡繪制倘核,直到員工點(diǎn)擊“結(jié)束巡查”按鈕泣侮,完成軌跡的繪制,并截圖上傳至后臺(tái)紧唱。

注冊(cè)和獲取百度地圖的秘鑰

官方文檔

引入第三方庫(kù)

    pod 'BMKLocationKit'
    pod 'BaiduMapKit'
//引入base相關(guān)所有的頭文件
#import <BaiduMapAPI_Base/BMKBaseComponent.h>
//引入地圖功能所有的頭文件
#import <BaiduMapAPI_Map/BMKMapComponent.h>

@interface RouteViewController ()<BMKMapViewDelegate, BMKLocationManagerDelegate>
@end

地圖設(shè)置

#pragma mark - 地圖懶加載
-(BMKMapView *)mapView
{
    if (!_mapView) {
        _mapView = [[BMKMapView alloc] initWithFrame:CGRectMake(0, kTopHeight, KScreenWidth, KScreenHeight-kTopHeight-100)];
        //地圖放縮大小活尊,4-21
        _mapView.zoomLevel = 17;
        //定位模式,定位跟隨模式才會(huì)有個(gè)箭頭跟著人走漏益,羅盤(pán)的話會(huì)有一個(gè)圈圈
        _mapView.userTrackingMode = BMKUserTrackingModeFollow;
        //設(shè)定地圖View能否支持所有手勢(shì)操作
        _mapView.gesturesEnabled= YES;
        _mapView.delegate= self;
        //是否顯示定位圖層蛹锰,默認(rèn)為NO,則不顯示跟著人走的箭頭绰疤。
        _mapView.showsUserLocation = YES;
        //此類(lèi)表示定位圖層自定義樣式參數(shù)
        BMKLocationViewDisplayParam *param = [[BMKLocationViewDisplayParam alloc] init];
        //不顯示定位圖層的圈圈
        param.isAccuracyCircleShow = NO;
        [_mapView updateLocationViewWithParam:param];
        //設(shè)置地圖模式為標(biāo)準(zhǔn)地圖
        [_mapView setMapType:BMKMapTypeStandard];
    }
    return _mapView;
}

定位設(shè)置

#pragma mark - 設(shè)置locationManager宁仔,定位到當(dāng)前位置
-(void)setupLocationManager
{
    //初始化實(shí)例
    self.locationManager = [[BMKLocationManager alloc] init];
    self.locationManager.delegate = self;
    //設(shè)置返回位置的坐標(biāo)系類(lèi)型
    self.locationManager.coordinateType = BMKLocationCoordinateTypeBMK09LL;
    //設(shè)置距離過(guò)濾參數(shù),超過(guò)10米才更新位置參數(shù)
    self.locationManager.distanceFilter = 10;
    //設(shè)置預(yù)期精度參數(shù)
    self.locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters;
    //設(shè)置應(yīng)用位置類(lèi)型
    self.locationManager.activityType = CLActivityTypeAutomotiveNavigation;
    //設(shè)置是否自動(dòng)停止位置更新
    self.locationManager.pausesLocationUpdatesAutomatically = NO;
    //設(shè)置是否允許后臺(tái)定位
    self.locationManager.allowsBackgroundLocationUpdates = YES;
    //設(shè)置位置獲取超時(shí)時(shí)間
    self.locationManager.locationTimeout = 10;
    //設(shè)置獲取地址信息超時(shí)時(shí)間
    self.locationManager.reGeocodeTimeout = 10;
    [self.locationManager startUpdatingHeading];
    //打開(kāi)這個(gè)才能在地圖加載后定位到當(dāng)前位置峦睡,不然坐標(biāo)點(diǎn)箭頭會(huì)跑到幾內(nèi)亞灣去
    [self.locationManager startUpdatingLocation];
}

定位代理

-(void)BMKLocationManager:(BMKLocationManager *)manager didUpdateHeading:(CLHeading *)heading
{
    if (!heading) {
        return;
    }
    if (!self.userLocation) {
        self.userLocation = [[BMKUserLocation alloc] init];
    }
    self.userLocation.heading = heading;
    [self.mapView updateLocationData:self.userLocation];
}

-(void)BMKLocationManager:(BMKLocationManager *)manager didUpdateLocation:(BMKLocation *)location orError:(NSError *)error
{
    if (error) {
        NSLog(@"locError:{%ld - %@};", (long)error.code, error.localizedDescription);
    }
    if (!location) {
        return ;
    }
    if (!self.userLocation) {
        self.userLocation = [[BMKUserLocation alloc] init];
    }
    
    self.userLocation.location = location.location;
    [self.mapView updateLocationData:self.userLocation];

    //設(shè)置一個(gè)開(kāi)始繪制軌跡的flag翎苫,當(dāng)flag為真的時(shí)候,開(kāi)始繪制軌跡榨了,在此處寫(xiě)代碼來(lái)繪制
}

地圖代理

#pragma mark - 添加線圖
-(BMKOverlayView *)mapView:(BMKMapView *)mapView viewForOverlay:(id<BMKOverlay>)overlay
{
    if ([overlay isKindOfClass:[BMKPolyline class]]) {
        BMKPolylineView *polylineView = [[BMKPolylineView alloc] initWithOverlay:overlay];
        polylineView.strokeColor = CSecondaryColor;
        polylineView.lineWidth = 2.0;
        
        return polylineView;
    }
    return nil;
}

#pragma mark - 添加完線圖
-(void)mapView:(BMKMapView *)mapView didAddOverlayViews:(NSArray *)overlayViews
{
    //每次添加完線圖煎谍,把地圖的中心設(shè)置成起始點(diǎn)和當(dāng)前位置點(diǎn)的中點(diǎn)
    CLLocationDegrees longitude = (self.startLocation.location.coordinate.longitude + self.userLocation.location.coordinate.longitude)/2;
    CLLocationDegrees latitude = (self.startLocation.location.coordinate.latitude + self.userLocation.location.coordinate.latitude)/2;
    _mapView.centerCoordinate = CLLocationCoordinate2DMake(latitude, longitude);
}

自定義Annotation

-(BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(id<BMKAnnotation>)annotation
{
    if ([annotation isKindOfClass:[BMKPointAnnotation class]]) {
        static NSString *reuseID = @"anotationReuseIndetifier";
        BMKAnnotationView *annotationView = [mapView dequeueReusableAnnotationViewWithIdentifier:reuseID];
        if (annotationView == nil) {
            annotationView = [[BMKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:reuseID];
        }
        
        UILabel *lblStart = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 30, 30)];
        if (!self.isStartTrace) {
            lblStart.text = @"始";
        }
        else{
            lblStart.text = @"終";
        }
        lblStart.backgroundColor = CSecondaryColor;
        lblStart.font = [UIFont systemFontOfSize:14.0];
        lblStart.textAlignment = NSTextAlignmentCenter;
        lblStart.textColor = [UIColor whiteColor];
        lblStart.layer.cornerRadius = 15;
        lblStart.layer.borderWidth = 1;
        lblStart.layer.masksToBounds = YES;
        lblStart.layer.borderColor = [UIColor darkGrayColor].CGColor;
        [annotationView addSubview:lblStart];
        
        return annotationView;
    }
    return nil;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市龙屉,隨后出現(xiàn)的幾起案子呐粘,更是在濱河造成了極大的恐慌,老刑警劉巖转捕,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件作岖,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡五芝,警方通過(guò)查閱死者的電腦和手機(jī)痘儡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)枢步,“玉大人沉删,你說(shuō)我怎么就攤上這事渐尿。” “怎么了矾瑰?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵砖茸,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我殴穴,道長(zhǎng)凉夯,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任采幌,我火速辦了婚禮劲够,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘植榕。我一直安慰自己,他們只是感情好尼夺,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布尊残。 她就那樣靜靜地躺著,像睡著了一般淤堵。 火紅的嫁衣襯著肌膚如雪寝衫。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,255評(píng)論 1 308
  • 那天拐邪,我揣著相機(jī)與錄音慰毅,去河邊找鬼。 笑死扎阶,一個(gè)胖子當(dāng)著我的面吹牛汹胃,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播东臀,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼着饥,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了惰赋?” 一聲冷哼從身側(cè)響起宰掉,我...
    開(kāi)封第一講書(shū)人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎赁濒,沒(méi)想到半個(gè)月后轨奄,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拒炎,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年挪拟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片击你。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡舞丛,死狀恐怖耘子,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情球切,我是刑警寧澤谷誓,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站吨凑,受9級(jí)特大地震影響捍歪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鸵钝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一糙臼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧恩商,春花似錦变逃、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至粟矿,卻和暖如春凰棉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背陌粹。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工撒犀, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人掏秩。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓或舞,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親蒙幻。 傳聞我的和親對(duì)象是個(gè)殘疾皇子嚷那,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359