基于百度地圖SDK記錄運(yùn)動(dòng)軌跡

標(biāo)簽 : 運(yùn)動(dòng)軌跡 百度地圖SDK

http://orchan.github.io/2016/02/22/基于百度地圖SDK記錄運(yùn)動(dòng)軌跡/


最終實(shí)現(xiàn)的效果如下圖所示###

  • 注意1:模擬器上模擬要設(shè)置好Location(如果選擇None就無法定位了),同時(shí)第一次打開應(yīng)用會(huì)提示授權(quán)使用地理位置信息,點(diǎn)擊允許即可。
設(shè)置

效果圖1
  • 注意2:由上圖的經(jīng)緯度反查可知這是美國(guó)的一個(gè)州,所以百度地圖沒有可用信息顯示。

一、 前期準(zhǔn)備工作

1. 新建Xcode工程
2. 獲取Bundle Identifier
3. 申請(qǐng)key
4. 導(dǎo)入框架配置工程
5. 初始化 BMKMapManager

二、實(shí)戰(zhàn)記錄運(yùn)動(dòng)軌跡

1. 初始化工作
2. 開始定位
3. 存儲(chǔ)更新的用戶地理位置
4. 繪制軌跡線

一、 前期準(zhǔn)備工作

首先需要登錄[百度開放平臺(tái)][1]下載iOS地圖SDK(內(nèi)含開發(fā)者文檔、框架以及Demo示例),推薦下載全新Framework形式的靜態(tài)庫(kù),配置更加簡(jiǎn)單方便,具體看下圖:

百度開放平臺(tái)

framework靜態(tài)庫(kù)

1. 新建Xcode工程

File->New->Project->Single View Application,填寫好相關(guān)信息完成工程建立。

新建工程


2. 獲取Bundle Identifier

通過project->target->general可以看到本應(yīng)用的Bundle Identifie,我們正是需要這串字符串去百度開發(fā)平臺(tái)申請(qǐng)一個(gè)Key用于百度地圖的調(diào)用。

Bundle Identifie


3. 申請(qǐng)key

登錄[百度開放平臺(tái)][1]后,點(diǎn)擊右上角的API控制臺(tái)進(jìn)入申請(qǐng)key的界面,點(diǎn)擊創(chuàng)建應(yīng)用,在“安全碼”處填入你的應(yīng)用的Bundle Identifie,具體信息填寫請(qǐng)看下圖:

申請(qǐng)key信息填寫圖1

申請(qǐng)key信息填寫圖2


4. 導(dǎo)入框架配置工程

第一步 、引入BaiduMapAPI.framework

百度地圖SDK提供了模擬器和真機(jī)兩種環(huán)境所使用的framework,分別存放在libs/Release-iphonesimulator和libs/Release-iphoneos文件夾下,開發(fā)者可根據(jù)需要使用真機(jī)或模擬器的包,如果需同時(shí)使用真機(jī)和模擬器的包,可以使用lipo命令將設(shè)備和模擬器framwork包中的BaiduMapAPI文件合并成一個(gè)通用的文件,命令如下:

lipo -create Release-iphoneos/BaiduMapAPI.framework/BaiduMapAPI Release-iphonesimulator/BaiduMapAPI.framework/BaiduMapAPI -output Release-iphoneos/BaiduMapAPI.framework/BaiduMapAPI

此時(shí)Release-iphoneos文件夾下的BaiduMapAPI.framework即可同時(shí)用于真機(jī)和模擬器。將所需的BaiduMapAPI.framework拷貝到工程所在文件夾下。在TARGETS->Build Phases-> Link Binary With Libaries中點(diǎn)擊+按鈕,在彈出的窗口中點(diǎn)擊“Add Other”按鈕,選擇BaiduMapAPI.framework文件添加到工程中。
注:靜態(tài)庫(kù)中采用ObjectC++實(shí)現(xiàn),因此需要您保證您工程中至少有一個(gè).mm后綴的源文件(您可以將任意一個(gè).m后綴的文件改名為.mm),或者在工程屬性中指定編譯方式,即將Xcode的Project -> Edit Active Target -> Build -> GCC4.2 - Language -> Compile Sources As設(shè)置為Objective-C++。

第二步、引入所需的系統(tǒng)庫(kù)
百度地圖SDK中提供了定位功能和動(dòng)畫效果,v2.0.0版本開始使用OpenGL渲染,因此您需要在您的Xcode工程中引入CoreLocation.frameworkQuartzCore.frameworkOpenGLES.framework、
SystemConfiguration.framework、CoreGraphics.framework、
Security.framework。添加方式:在Xcode的Project -> Active Target ->Build Phases ->Link Binary With Libraries,添加這幾個(gè)framework即可。

第三步、環(huán)境配置
TARGETS->Build Settings->Other Linker Flags中添加-ObjC。

第四步、引入mapapi.bundle資源文件
如果使用了基礎(chǔ)地圖功能,需要添加該資源,否則地圖不能正常顯示
mapapi.bundle中存儲(chǔ)了定位、默認(rèn)大頭針標(biāo)注View及路線關(guān)鍵點(diǎn)的資源圖片,還存儲(chǔ)了矢量地圖繪制必需的資源文件。如果您不需要使用內(nèi)置的圖片顯示功能,則可以刪除bundle文件中的image文件夾。您也可以根據(jù)具體需求任意替換或刪除該bundle中image文件夾的圖片文件。
方法:選中工程名,在右鍵菜單中選擇Add Files to “工程名”…,從BaiduMapAPI.framework||Resources文件中選擇mapapi.bundle文件,并勾選“Copy items if needed”復(fù)選框,單擊Add按鈕,將資源文件添加到工程中。

第五步、引入頭文件
在使用SDK的類引入頭文件:

#import <BaiduMapAPI/BMapKit.h>//引入所有的頭文件
#import <BaiduMapAPI/BMKMapView.h>//只引入所需的單個(gè)頭文件

--[引用自百度開放平臺(tái)iOS SDK環(huán)境配置][2]


5. 初始化 BMKMapManager

  • AppDelegate.m 中添加 BMKMapManager的定義:
@interface AppDelegate ()<BMKGeneralDelegate>
@property (nonatomic,strong) BMKMapManager *mapManager;
@end
  • 遵守 BMKGeneralDelegate 實(shí)現(xiàn)其兩個(gè)代理方法,目的是為了得知本應(yīng)用是否聯(lián)網(wǎng)成功、授權(quán)成功:
- (void)onGetNetworkState:(int)iError
{
    if (0 == iError) {
        NSLog(@"聯(lián)網(wǎng)成功");
    }
    else{
        NSLog(@"onGetNetworkState %d",iError);
    }
    
}

- (void)onGetPermissionState:(int)iError
{
    if (0 == iError) {
        NSLog(@"授權(quán)成功");
    }
    else {
        NSLog(@"onGetPermissionState %d",iError);
    }
}
BMKGeneralDelegate.h
  • 在AppDelegate.m文件中添加對(duì)BMKMapManager的初始化,并填入申請(qǐng)的授權(quán)Key,示例如下:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    // 要使用百度地圖先實(shí)例化 BMKMapManager
    self.mapManager = [[BMKMapManager alloc]init];
    
    // 如果要關(guān)注網(wǎng)絡(luò)及授權(quán)驗(yàn)證事件,請(qǐng)?jiān)O(shè)定 generalDelegate 參數(shù)
    BOOL ret = [self.mapManager start:@"OjYbYha0YULmuLPaHT9wxxx" generalDelegate:self];
    if (!ret) {
        NSLog(@"manager start failed");
    }
    return YES;
}

二、實(shí)戰(zhàn)記錄運(yùn)動(dòng)軌跡

一條完整的運(yùn)動(dòng)軌跡是由一組地理位置坐標(biāo)數(shù)組描點(diǎn)連線構(gòu)成的,我們需要實(shí)時(shí)監(jiān)測(cè)用戶位置的變更,將最新的符合限定條件的地位位置數(shù)據(jù)存放到數(shù)據(jù)中,調(diào)用SDK中的畫折線方法繪制運(yùn)動(dòng)軌跡。


1. 初始化工作

@interface ViewController () <BMKMapViewDelegate, BMKLocationServiceDelegate>

/** 記錄上一次的位置 */
@property (nonatomic, strong) CLLocation *preLocation;

/** 位置數(shù)組 */
@property (nonatomic, strong) NSMutableArray *locationArrayM;

/** 軌跡線 */
@property (nonatomic, strong) BMKPolyline *polyLine;

/** 百度地圖View */
@property (nonatomic,strong) BMKMapView *mapView;

/** 百度定位地圖服務(wù) */
@property (nonatomic, strong) BMKLocationService *bmkLocationService;
@end

@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    
    // 初始化百度位置服務(wù)
    [self initBMLocationService];

    // 初始化地圖窗口
    self.mapView = [[BMKMapView alloc]initWithFrame:self.view.bounds];
    
    // 設(shè)置MapView的一些屬性
    [self setMapViewProperty];
    
    [self.view addSubview:self.mapView];
}
@end
  • 初始化MapView后設(shè)置其一些屬性
/**
 *  設(shè)置 百度MapView的一些屬性
 */
- (void)setMapViewProperty
{
    // 顯示定位圖層
    self.mapView.showsUserLocation = YES;
    
    // 設(shè)置定位模式
    self.mapView.userTrackingMode = BMKUserTrackingModeNone;
    
    // 允許旋轉(zhuǎn)地圖
    self.mapView.rotateEnabled = YES;
    
    // 顯示比例尺
    self.bmkMapView.showMapScaleBar = YES;
    self.bmkMapView.mapScaleBarPosition = CGPointMake(self.view.frame.size.width - 50, self.view.frame.size.height - 50);
    
    // 定位圖層自定義樣式參數(shù)
    BMKLocationViewDisplayParam *displayParam = [[BMKLocationViewDisplayParam alloc]init];
    displayParam.isRotateAngleValid = NO;//跟隨態(tài)旋轉(zhuǎn)角度是否生效
    displayParam.isAccuracyCircleShow = NO;//精度圈是否顯示
    displayParam.locationViewOffsetX = 0;//定位偏移量(經(jīng)度)
    displayParam.locationViewOffsetY = 0;//定位偏移量(緯度)
    displayParam.locationViewImgName = @"walk";
    [self.mapView updateLocationViewWithParam:displayParam];
}
  • 百度定位服務(wù)的參數(shù)設(shè)置
/**
 *  初始化百度位置服務(wù)
 */
- (void)initBMLocationService
{
    // 初始化位置百度位置服務(wù)
    self.bmkLocationService = [[BMKLocationService alloc] init];
    
    // 設(shè)置距離過濾,表示每移動(dòng)10更新一次位置
    [BMKLocationService setLocationDistanceFilter:10];
    
    // 設(shè)置定位精度
    [BMKLocationService setLocationDesiredAccuracy:kCLLocationAccuracyBest];
}

2. 開始定位

    // 打開定位服務(wù)
    [self.bmkLocationService startUserLocationService];
    
    // 設(shè)置當(dāng)前地圖的顯示范圍,直接顯示到用戶位置
    BMKCoordinateRegion adjustRegion = [self.mapView regionThatFits:BMKCoordinateRegionMake(self.bmkLocationService.userLocation.location.coordinate, BMKCoordinateSpanMake(0.02f,0.02f))];
    
    [self.mapView setRegion:adjustRegion animated:YES];
    

只要遵守了BMKLocationServiceDelegate協(xié)議就可以獲知位置更新的情況,需要實(shí)現(xiàn)下面幾個(gè)代理方法:

/**
 *  定位失敗會(huì)調(diào)用該方法
 *
 *  @param error 錯(cuò)誤信息
 */
- (void)didFailToLocateUserWithError:(NSError *)error
{
    NSLog(@"did failed locate,error is %@",[error localizedDescription]);
}

/**
 *  用戶位置更新后,會(huì)調(diào)用此函數(shù)
 *  @param userLocation 新的用戶位置
 */
- (void)didUpdateBMKUserLocation:(BMKUserLocation *)userLocation
{
    // 如果此時(shí)位置更新的水平精準(zhǔn)度大于10米,直接返回該方法
    // 可以用來簡(jiǎn)單判斷GPS的信號(hào)強(qiáng)度
    if (userLocation.location.horizontalAccuracy > kCLLocationAccuracyNearestTenMeters) {
        return;
    }
}

/**
 *  用戶方向更新后,會(huì)調(diào)用此函數(shù)
 *  @param userLocation 新的用戶位置
 */
- (void)didUpdateUserHeading:(BMKUserLocation *)userLocation
{
    // 動(dòng)態(tài)更新我的位置數(shù)據(jù)
    [self.mapView updateLocationData:userLocation];
}

3. 存儲(chǔ)更新的用戶地理位置

/**
 *  開始記錄軌跡
 *
 *  @param userLocation 實(shí)時(shí)更新的位置信息
 */
- (void)recordTrackingWithUserLocation:(BMKUserLocation *)userLocation
{
    if (self.preLocation) {
        // 計(jì)算本次定位數(shù)據(jù)與上次定位數(shù)據(jù)之間的距離
        CGFloat distance = [userLocation.location distanceFromLocation:self.preLocation];
        self.statusView.distanceWithPreLoc.text = [NSString stringWithFormat:@"%.3f",distance];
        NSLog(@"與上一位置點(diǎn)的距離為:%f",distance);
        
        // (5米門限值,存儲(chǔ)數(shù)組畫線) 如果距離少于 5 米,則忽略本次數(shù)據(jù)直接返回方法
        if (distance < 5) {
            return;
        }
    }
    
    // 2. 將符合的位置點(diǎn)存儲(chǔ)到數(shù)組中(第一直接來到這里)
    [self.locationArrayM addObject:userLocation.location];
    self.preLocation = userLocation.location;
    
    // 3. 繪圖
    [self drawWalkPolyline];
}

4. 繪制軌跡線

/**
 *  繪制軌跡路線
 */
- (void)drawWalkPolyline
{
    // 軌跡點(diǎn)數(shù)組個(gè)數(shù)
    NSUInteger count = self.locationArrayM.count;
    
    // 動(dòng)態(tài)分配存儲(chǔ)空間
    // BMKMapPoint是個(gè)結(jié)構(gòu)體:地理坐標(biāo)點(diǎn),用直角地理坐標(biāo)表示 X:橫坐標(biāo) Y:縱坐標(biāo)
    BMKMapPoint *tempPoints = new BMKMapPoint[count];
    
    // 遍歷數(shù)組
    [self.locationArrayM enumerateObjectsUsingBlock:^(CLLocation *location, NSUInteger idx, BOOL *stop) {
        BMKMapPoint locationPoint = BMKMapPointForCoordinate(location.coordinate);
        tempPoints[idx] = locationPoint;
        }
    }];
    
    //移除原有的繪圖,避免在原來軌跡上重畫
    if (self.polyLine) {
        [self.mapView removeOverlay:self.polyLine];
    }
    
    // 通過points構(gòu)建BMKPolyline
    self.polyLine = [BMKPolyline polylineWithPoints:tempPoints count:count];
    
    //添加路線,繪圖
    if (self.polyLine) {
        [self.mapView addOverlay:self.polyLine];
    }
    
    // 清空 tempPoints 臨時(shí)數(shù)組
    delete []tempPoints;
    
    // 根據(jù)polyline設(shè)置地圖范圍
    [self mapViewFitPolyLine:self.polyLine];
}

反饋與建議


感謝認(rèn)真閱讀這份幫助文檔,如果覺得有用可以分享到您的社交圈,也請(qǐng)注明出處,謝謝!
[1]:http://developer.baidu.com/map/index.php?title=首頁(yè)
[2]:http://developer.baidu.com/map/index.php?title=iossdk/guide/buildproject

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,431評(píng)論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,637評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,555評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,900評(píng)論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,629評(píng)論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,976評(píng)論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,976評(píng)論 3 448
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,139評(píng)論 0 290
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,686評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,411評(píng)論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,641評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,129評(píng)論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,820評(píng)論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,233評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,567評(píng)論 1 295
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,362評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,604評(píng)論 2 380

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

  • 各位小伙伴們大家好,今天我向大家介紹一下蘋果百度地圖的使用方法,因?yàn)樽鲞^一些想關(guān)的APP,感覺百度地圖還是挺方便的...
    Lee0528閱讀 14,745評(píng)論 18 46
  • 最新百度地圖使用注意事項(xiàng)(在使用中出現(xiàn)了引擎失敗的家在錯(cuò)誤,下邊是注意事項(xiàng)) 第一步、引入BaiduMapAPI....
    寒橋閱讀 2,989評(píng)論 3 5
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,177評(píng)論 4 61
  • 我曾經(jīng)聽人說,喜歡是須臾,但愛是不朽。 后來,我才明白,只要還能被你記得,我就是不朽的。 【一】 我坐在咖啡廳里點(diǎn)...
    陌忘芊閱讀 2,523評(píng)論 66 72
  • 讀完獨(dú)木舟蒼涼的文字 淚花簌簌而下 也許 愛情的世界沒有誰對(duì)誰錯(cuò) 只是愛的方式不同 都愛的太笨 它不是一架衡量標(biāo)準(zhǔn)...
    淺夏憶yi閱讀 131評(píng)論 1 1