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记录运动轨迹的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: xslt 标签取集合第一条数据_1+x证
- 下一篇: 两个常数的卷积为多少_卷积(Convol