日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android 记录路线轨迹_基于百度地图SDK记录运动轨迹

發布時間:2023/12/2 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android 记录路线轨迹_基于百度地图SDK记录运动轨迹 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

標簽 : 運動軌跡 百度地圖SDK

最終實現的效果如下圖所示###

注意1:模擬器上模擬要設置好Location(如果選擇None就無法定位了),同時第一次打開應用會提示授權使用地理位置信息,點擊允許即可。

設置

效果圖1

注意2:由上圖的經緯度反查可知這是美國的一個州,所以百度地圖沒有可用信息顯示。

一、 前期準備工作

1. 新建Xcode工程

2. 獲取Bundle Identifier

3. 申請key

4. 導入框架配置工程

5. 初始化 BMKMapManager

二、實戰記錄運動軌跡

1. 初始化工作

2. 開始定位

3. 存儲更新的用戶地理位置

4. 繪制軌跡線

一、 前期準備工作

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

百度開放平臺

framework靜態庫

1. 新建Xcode工程

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

新建工程

2. 獲取Bundle Identifier

通過project->target->general可以看到本應用的Bundle Identifie,我們正是需要這串字符串去百度開發平臺申請一個Key用于百度地圖的調用。

Bundle Identifie

3. 申請key

登錄[百度開放平臺][1]后,點擊右上角的API控制臺進入申請key的界面,點擊創建應用,在“安全碼”處填入你的應用的Bundle Identifie,具體信息填寫請看下圖:

申請key信息填寫圖1

申請key信息填寫圖2

4. 導入框架配置工程

第一步 、引入BaiduMapAPI.framework

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

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

此時Release-iphoneos文件夾下的BaiduMapAPI.framework即可同時用于真機和模擬器。將所需的BaiduMapAPI.framework拷貝到工程所在文件夾下。在TARGETS->Build Phases-> Link Binary With Libaries中點擊+按鈕,在彈出的窗口中點擊“Add Other”按鈕,選擇BaiduMapAPI.framework文件添加到工程中。

注:靜態庫中采用ObjectC++實現,因此需要您保證您工程中至少有一個.mm后綴的源文件(您可以將任意一個.m后綴的文件改名為.mm),或者在工程屬性中指定編譯方式,即將Xcode的Project -> Edit Active Target -> Build -> GCC4.2 - Language -> Compile Sources As設置為Objective-C++。

第二步、引入所需的系統庫

百度地圖SDK中提供了定位功能和動畫效果,v2.0.0版本開始使用OpenGL渲染,因此您需要在您的Xcode工程中引入CoreLocation.framework和QuartzCore.framework、OpenGLES.framework、

SystemConfiguration.framework、CoreGraphics.framework、

Security.framework。添加方式:在Xcode的Project -> Active Target ->Build Phases ->Link Binary With Libraries,添加這幾個framework即可。

第三步、環境配置

在TARGETS->Build Settings->Other Linker Flags中添加-ObjC。

第四步、引入mapapi.bundle資源文件

如果使用了基礎地圖功能,需要添加該資源,否則地圖不能正常顯示

mapapi.bundle中存儲了定位、默認大頭針標注View及路線關鍵點的資源圖片,還存儲了矢量地圖繪制必需的資源文件。如果您不需要使用內置的圖片顯示功能,則可以刪除bundle文件中的image文件夾。您也可以根據具體需求任意替換或刪除該bundle中image文件夾的圖片文件。

方法:選中工程名,在右鍵菜單中選擇Add Files to “工程名”…,從BaiduMapAPI.framework||Resources文件中選擇mapapi.bundle文件,并勾選“Copy items if needed”復選框,單擊Add按鈕,將資源文件添加到工程中。

第五步、引入頭文件

在使用SDK的類引入頭文件:

#import //引入所有的頭文件

#import //只引入所需的單個頭文件

--[引用自百度開放平臺iOS SDK環境配置][2]

5. 初始化 BMKMapManager

在AppDelegate.m 中添加 BMKMapManager的定義:

@interface AppDelegate ()

@property (nonatomic,strong) BMKMapManager *mapManager;

@end

遵守 BMKGeneralDelegate 實現其兩個代理方法,目的是為了得知本應用是否聯網成功、授權成功:

- (void)onGetNetworkState:(int)iError

{

if (0 == iError) {

NSLog(@"聯網成功");

}

else{

NSLog(@"onGetNetworkState %d",iError);

}

}

- (void)onGetPermissionState:(int)iError

{

if (0 == iError) {

NSLog(@"授權成功");

}

else {

NSLog(@"onGetPermissionState %d",iError);

}

}

BMKGeneralDelegate.h

在AppDelegate.m文件中添加對BMKMapManager的初始化,并填入申請的授權Key,示例如下:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

// 要使用百度地圖先實例化 BMKMapManager

self.mapManager = [[BMKMapManager alloc]init];

// 如果要關注網絡及授權驗證事件,請設定 generalDelegate 參數

BOOL ret = [self.mapManager start:@"OjYbYha0YULmuLPaHT9wxxx" generalDelegate:self];

if (!ret) {

NSLog(@"manager start failed");

}

return YES;

}

二、實戰記錄運動軌跡

一條完整的運動軌跡是由一組地理位置坐標數組描點連線構成的,我們需要實時監測用戶位置的變更,將最新的符合限定條件的地位位置數據存放到數據中,調用SDK中的畫折線方法繪制運動軌跡。

1. 初始化工作

@interface ViewController ()

/** 記錄上一次的位置 */

@property (nonatomic, strong) CLLocation *preLocation;

/** 位置數組 */

@property (nonatomic, strong) NSMutableArray *locationArrayM;

/** 軌跡線 */

@property (nonatomic, strong) BMKPolyline *polyLine;

/** 百度地圖View */

@property (nonatomic,strong) BMKMapView *mapView;

/** 百度定位地圖服務 */

@property (nonatomic, strong) BMKLocationService *bmkLocationService;

@end

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

// 初始化百度位置服務

[self initBMLocationService];

// 初始化地圖窗口

self.mapView = [[BMKMapView alloc]initWithFrame:self.view.bounds];

// 設置MapView的一些屬性

[self setMapViewProperty];

[self.view addSubview:self.mapView];

}

@end

初始化MapView后設置其一些屬性:

/**

* 設置 百度MapView的一些屬性

*/

- (void)setMapViewProperty

{

// 顯示定位圖層

self.mapView.showsUserLocation = YES;

// 設置定位模式

self.mapView.userTrackingMode = BMKUserTrackingModeNone;

// 允許旋轉地圖

self.mapView.rotateEnabled = YES;

// 顯示比例尺

self.bmkMapView.showMapScaleBar = YES;

self.bmkMapView.mapScaleBarPosition = CGPointMake(self.view.frame.size.width - 50, self.view.frame.size.height - 50);

// 定位圖層自定義樣式參數

BMKLocationViewDisplayParam *displayParam = [[BMKLocationViewDisplayParam alloc]init];

displayParam.isRotateAngleValid = NO;//跟隨態旋轉角度是否生效

displayParam.isAccuracyCircleShow = NO;//精度圈是否顯示

displayParam.locationViewOffsetX = 0;//定位偏移量(經度)

displayParam.locationViewOffsetY = 0;//定位偏移量(緯度)

displayParam.locationViewImgName = @"walk";

[self.mapView updateLocationViewWithParam:displayParam];

}

百度定位服務的參數設置:

/**

* 初始化百度位置服務

*/

- (void)initBMLocationService

{

// 初始化位置百度位置服務

self.bmkLocationService = [[BMKLocationService alloc] init];

// 設置距離過濾,表示每移動10更新一次位置

[BMKLocationService setLocationDistanceFilter:10];

// 設置定位精度

[BMKLocationService setLocationDesiredAccuracy:kCLLocationAccuracyBest];

}

2. 開始定位

// 打開定位服務

[self.bmkLocationService startUserLocationService];

// 設置當前地圖的顯示范圍,直接顯示到用戶位置

BMKCoordinateRegion adjustRegion = [self.mapView regionThatFits:BMKCoordinateRegionMake(self.bmkLocationService.userLocation.location.coordinate, BMKCoordinateSpanMake(0.02f,0.02f))];

[self.mapView setRegion:adjustRegion animated:YES];

只要遵守了BMKLocationServiceDelegate協議就可以獲知位置更新的情況,需要實現下面幾個代理方法:

/**

* 定位失敗會調用該方法

*

* @param error 錯誤信息

*/

- (void)didFailToLocateUserWithError:(NSError *)error

{

NSLog(@"did failed locate,error is %@",[error localizedDescription]);

}

/**

* 用戶位置更新后,會調用此函數

* @param userLocation 新的用戶位置

*/

- (void)didUpdateBMKUserLocation:(BMKUserLocation *)userLocation

{

// 如果此時位置更新的水平精準度大于10米,直接返回該方法

// 可以用來簡單判斷GPS的信號強度

if (userLocation.location.horizontalAccuracy > kCLLocationAccuracyNearestTenMeters) {

return;

}

}

/**

* 用戶方向更新后,會調用此函數

* @param userLocation 新的用戶位置

*/

- (void)didUpdateUserHeading:(BMKUserLocation *)userLocation

{

// 動態更新我的位置數據

[self.mapView updateLocationData:userLocation];

}

3. 存儲更新的用戶地理位置

/**

* 開始記錄軌跡

*

* @param userLocation 實時更新的位置信息

*/

- (void)recordTrackingWithUserLocation:(BMKUserLocation *)userLocation

{

if (self.preLocation) {

// 計算本次定位數據與上次定位數據之間的距離

CGFloat distance = [userLocation.location distanceFromLocation:self.preLocation];

self.statusView.distanceWithPreLoc.text = [NSString stringWithFormat:@"%.3f",distance];

NSLog(@"與上一位置點的距離為:%f",distance);

// (5米門限值,存儲數組畫線) 如果距離少于 5 米,則忽略本次數據直接返回方法

if (distance < 5) {

return;

}

}

// 2. 將符合的位置點存儲到數組中(第一直接來到這里)

[self.locationArrayM addObject:userLocation.location];

self.preLocation = userLocation.location;

// 3. 繪圖

[self drawWalkPolyline];

}

4. 繪制軌跡線

/**

* 繪制軌跡路線

*/

- (void)drawWalkPolyline

{

// 軌跡點數組個數

NSUInteger count = self.locationArrayM.count;

// 動態分配存儲空間

// BMKMapPoint是個結構體:地理坐標點,用直角地理坐標表示 X:橫坐標 Y:縱坐標

BMKMapPoint *tempPoints = new BMKMapPoint[count];

// 遍歷數組

[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構建BMKPolyline

self.polyLine = [BMKPolyline polylineWithPoints:tempPoints count:count];

//添加路線,繪圖

if (self.polyLine) {

[self.mapView addOverlay:self.polyLine];

}

// 清空 tempPoints 臨時數組

delete []tempPoints;

// 根據polyline設置地圖范圍

[self mapViewFitPolyLine:self.polyLine];

}

反饋與建議

總結

以上是生活随笔為你收集整理的android 记录路线轨迹_基于百度地图SDK记录运动轨迹的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。