百度地图的路径规划功能, 在使用百度路径的时候,出现了一些小问题,在此,分享一下自己的最简单的一个路径小demo 当然,前面的百度配置问题,我就不和大家讲了,因为这方面的资料太多了!现在,我来介绍一下这个小demo
AppDelegate.m文件如下, <!-- lang: cpp --> #import "AppDelegate.h" #import "rootViewController.h"
@implementation AppDelegate
-
(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor];
_mapManager = [[BMKMapManager alloc]init]; // 如果要关注网络及授权验证事件,请设定 generalDelegate参数 BOOL ret = [_mapManager start:@"6Gp5e6XYGQn5aRRD1DK0vKCf" generalDelegate:nil]; if (!ret) { NSLog(@"manager start failed!"); }
rootViewController *rootVC = [[rootViewController alloc] init]; _navigationController = [[UINavigationController alloc] initWithRootViewController:rootVC]; self.window.rootViewController = _navigationController;
[self.window makeKeyAndVisible]; return YES;
}
然后,rootViewController.m文件如下,这里只有步行这个按钮有效果哦!
<!-- lang: cpp -->
#import "rootViewController.h"
#import "BMapKit.h"
#define MYBUNDLE_NAME @ "mapapi.bundle" #define MYBUNDLE_PATH [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent: MYBUNDLE_NAME] #define MYBUNDLE [NSBundle bundleWithPath: MYBUNDLE_PATH]
@interface RouteAnnotation : BMKPointAnnotation { int _type; ///<0:起点 1:终点 2:公交 3:地铁 4:驾乘 5:途经点 int _degree; }
@property (nonatomic) int type; @property (nonatomic) int degree; @end
@implementation RouteAnnotation
@synthesize type = _type; @synthesize degree = _degree; @end
@interface rootViewController ()<BMKMapViewDelegate, BMKRouteSearchDelegate> { UITextField *textFrom; UITextField *textTo;
UIButton *btnBus;
UIButton *btnCar;
UIButton *btnfoot;
UIView *_mapV ;
BMKMapView* _mapView;
BMKRouteSearch* _routesearch;
}
@end
@implementation UIImage(InternalMethod)
-
(UIImage*)imageRotatedByDegrees:(CGFloat)degrees {
CGFloat width = CGImageGetWidth(self.CGImage); CGFloat height = CGImageGetHeight(self.CGImage);
CGSize rotatedSize;
rotatedSize.width = width; rotatedSize.height = height;
UIGraphicsBeginImageContext(rotatedSize); CGContextRef bitmap = UIGraphicsGetCurrentContext(); CGContextTranslateCTM(bitmap, rotatedSize.width/2, rotatedSize.height/2); CGContextRotateCTM(bitmap, degrees * M_PI / 180); CGContextRotateCTM(bitmap, M_PI); CGContextScaleCTM(bitmap, -1.0, 1.0); CGContextDrawImage(bitmap, CGRectMake(-rotatedSize.width/2, -rotatedSize.height/2, rotatedSize.width, rotatedSize.height), self.CGImage); UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return newImage; }
@end
@interface rootViewController ()
@end
@implementation rootViewController
-
(NSString*)getMyBundlePath1:(NSString *)filename {
NSBundle * libBundle = MYBUNDLE ; if ( libBundle && filename ){ NSString * s=[[libBundle resourcePath ] stringByAppendingPathComponent : filename]; return s; } return nil ; }
-
(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Custom initialization self.view.backgroundColor = [UIColor redColor]; } return self; }
-
(void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. self.title = @"路径规划";
[self setUpUI];
textFrom.text = @"天安门"; textTo.text = @"百度大厦";
_routesearch = [[BMKRouteSearch alloc]init]; _routesearch.delegate = self;// 此处记得不用的时候需要置nil,否则影响内存的释放 _mapView = [[BMKMapView alloc]initWithFrame:_mapV.bounds]; _mapView.delegate = self; // 此处记得不用的时候需要置nil,否则影响内存的释放 [_mapV addSubview:_mapView];
}
-(void)setUpUI { UILabel *lableFrom = [[UILabel alloc] initWithFrame:CGRectMake(20,70, 60, 30)]; lableFrom.text = @"起点";
UILabel *lableTo = [[UILabel alloc] initWithFrame:CGRectMake(20,120, 60, 30)];
lableTo.text = @"终点";
textFrom = [[UITextField alloc] initWithFrame:CGRectMake(100, 70, 80, 30)];
textFrom.backgroundColor = [UIColor greenColor];
textTo = [[UITextField alloc] initWithFrame:CGRectMake(100, 120, 80, 30)];
textTo.backgroundColor = [UIColor greenColor];
btnBus = [[UIButton alloc] initWithFrame:CGRectMake(20, 160, 40, 30)];
[btnBus setTitle:@"公交" forState:UIControlStateNormal];
btnCar = [[UIButton alloc] initWithFrame:CGRectMake(80, 160, 40, 30)];
[btnCar setTitle:@"驾车" forState:UIControlStateNormal];
btnfoot = [[UIButton alloc] initWithFrame:CGRectMake(150, 160, 40, 30)];
[btnfoot setTitle:@"步行" forState:UIControlStateNormal];
[btnfoot addTarget:self action:@selector(walkBtnClick) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview: lableFrom];
[self.view addSubview: lableTo];
[self.view addSubview: textFrom];
[self.view addSubview: textTo];
[self.view addSubview: btnBus];
[self.view addSubview: btnCar];
[self.view addSubview: btnfoot];
CGFloat height = [UIScreen mainScreen].bounds.size.height - CGRectGetMaxY(btnBus.frame) ;
_mapV = [[UIView alloc] initWithFrame:CGRectMake(0, CGRectGetMaxY(btnBus.frame), 320, height)];
_mapV.backgroundColor = [UIColor whiteColor];
[self.view addSubview:_mapV];
}
-(void)walkBtnClick {
BMKPlanNode* start = [[BMKPlanNode alloc]init] ;
start.name = textFrom.text;
start.cityName = @"北京市";
BMKPlanNode* end = [[BMKPlanNode alloc]init];
end.name = textTo.text;
end.cityName = @"北京市";
BMKWalkingRoutePlanOption *walkingRouteSearchOption = [[BMKWalkingRoutePlanOption alloc]init];
walkingRouteSearchOption.from = start;
walkingRouteSearchOption.to = end;
NSLog(@"%@------%@",start.name,end.name);
BOOL flag = [_routesearch walkingSearch:walkingRouteSearchOption];
if(flag)
{
NSLog(@"walk检索发送成功");
}
else
{
NSLog(@"walk检索发送失败");
}
}
-
(void)onGetWalkingRouteResult:(BMKRouteSearch*)searcher result:(BMKWalkingRouteResult*)result errorCode:(BMKSearchErrorCode)error { NSArray* array = [NSArray arrayWithArray:_mapView.annotations]; [_mapView removeAnnotations:array]; array = [NSArray arrayWithArray:_mapView.overlays]; [_mapView removeOverlays:array]; if (error == BMK_SEARCH_NO_ERROR) { BMKWalkingRouteLine* plan = (BMKWalkingRouteLine*)[result.routes objectAtIndex:0]; int size = [plan.steps count]; int planPointCounts = 0; for (int i = 0; i < size; i++) { BMKWalkingStep* transitStep = [plan.steps objectAtIndex:i]; if(i==0){ RouteAnnotation* item = [[RouteAnnotation alloc]init]; item.coordinate = plan.starting.location; item.title = @"起点"; item.type = 0; [_mapView addAnnotation:item]; // 添加起点标注
}else if(i==size-1){ RouteAnnotation* item = [[RouteAnnotation alloc]init]; item.coordinate = plan.terminal.location; item.title = @"终点"; item.type = 1; [_mapView addAnnotation:item]; // 添加起点标注 } //添加annotation节点 RouteAnnotation* item = [[RouteAnnotation alloc]init]; item.coordinate = transitStep.entrace.location; item.title = transitStep.entraceInstruction; item.degree = transitStep.direction * 30; item.type = 4; [_mapView addAnnotation:item]; //轨迹点总数累计 planPointCounts += transitStep.pointsCount; } //轨迹点 BMKMapPoint * temppoints = new BMKMapPoint[planPointCounts]; int i = 0; for (int j = 0; j < size; j++) { BMKWalkingStep* transitStep = [plan.steps objectAtIndex:j]; int k=0; for(k=0;k<transitStep.pointsCount;k++) { temppoints[i].x = transitStep.points[k].x; temppoints[i].y = transitStep.points[k].y; i++; } } // 通过points构建BMKPolyline BMKPolyline* polyLine = [BMKPolyline polylineWithPoints:temppoints count:planPointCounts]; [_mapView addOverlay:polyLine]; // 添加路线overlay delete []temppoints;
}
}
- (BMKOverlayView*)mapView:(BMKMapView )map viewForOverlay:(id<BMKOverlay>)overlay { if ([overlay isKindOfClass:[BMKPolyline class]]) { BMKPolylineView polylineView = [[BMKPolylineView alloc] initWithOverlay:overlay]; polylineView.fillColor = [[UIColor cyanColor] colorWithAlphaComponent:1]; polylineView.strokeColor = [[UIColor blueColor] colorWithAlphaComponent:0.7]; polylineView.lineWidth = 3.0; return polylineView; } return nil; }
#pragma mark -这里是换大头针的把!
-
(BMKAnnotationView*)getRouteAnnotationView:(BMKMapView )mapview viewForAnnotation:(RouteAnnotation)routeAnnotation { BMKAnnotationView* view = nil; switch (routeAnnotation.type) { case 0: { view = [mapview dequeueReusableAnnotationViewWithIdentifier:@"start_node"]; if (view == nil) { view = [[BMKAnnotationView alloc]initWithAnnotation:routeAnnotation reuseIdentifier:@"start_node"] ; view.image = [UIImage imageWithContentsOfFile:[self getMyBundlePath1:@"images/icon_nav_start.png"]]; view.centerOffset = CGPointMake(0, -(view.frame.size.height * 0.5)); view.canShowCallout = TRUE; } view.annotation = routeAnnotation; } break; case 1: { view = [mapview dequeueReusableAnnotationViewWithIdentifier:@"end_node"]; if (view == nil) { view = [[BMKAnnotationView alloc]initWithAnnotation:routeAnnotation reuseIdentifier:@"end_node"] ; view.image = [UIImage imageWithContentsOfFile:[self getMyBundlePath1:@"images/icon_nav_end.png"]]; view.centerOffset = CGPointMake(0, -(view.frame.size.height * 0.5)); view.canShowCallout = TRUE; } view.annotation = routeAnnotation; } break; case 2: { view = [mapview dequeueReusableAnnotationViewWithIdentifier:@"bus_node"]; if (view == nil) { view = [[BMKAnnotationView alloc]initWithAnnotation:routeAnnotation reuseIdentifier:@"bus_node"] ; view.image = [UIImage imageWithContentsOfFile:[self getMyBundlePath1:@"images/icon_nav_bus.png"]]; view.canShowCallout = TRUE; } view.annotation = routeAnnotation; } break; case 3: { view = [mapview dequeueReusableAnnotationViewWithIdentifier:@"rail_node"]; if (view == nil) { view = [[BMKAnnotationView alloc]initWithAnnotation:routeAnnotation reuseIdentifier:@"rail_node"] ; view.image = [UIImage imageWithContentsOfFile:[self getMyBundlePath1:@"images/icon_nav_rail.png"]]; view.canShowCallout = TRUE; } view.annotation = routeAnnotation; } break; case 4: { view = [mapview dequeueReusableAnnotationViewWithIdentifier:@"route_node"]; if (view == nil) { view = [[BMKAnnotationView alloc]initWithAnnotation:routeAnnotation reuseIdentifier:@"route_node"] ; view.canShowCallout = TRUE; } else { [view setNeedsDisplay]; }
UIImage* image = [UIImage imageWithContentsOfFile:[self getMyBundlePath1:@"images/icon_direction.png"]]; view.image = [image imageRotatedByDegrees:routeAnnotation.degree]; view.annotation = routeAnnotation; } break; case 5: { view = [mapview dequeueReusableAnnotationViewWithIdentifier:@"waypoint_node"]; if (view == nil) { view = [[BMKAnnotationView alloc]initWithAnnotation:routeAnnotation reuseIdentifier:@"waypoint_node"] ; view.canShowCallout = TRUE; } else { [view setNeedsDisplay]; } UIImage* image = [UIImage imageWithContentsOfFile:[self getMyBundlePath1:@"images/icon_nav_waypoint.png"]]; view.image = [image imageRotatedByDegrees:routeAnnotation.degree]; view.annotation = routeAnnotation; } break; default: break;
}
return view; }
-
(BMKAnnotationView *)mapView:(BMKMapView )view viewForAnnotation:(id <BMKAnnotation>)annotation { if ([annotation isKindOfClass:[RouteAnnotation class]]) { return [self getRouteAnnotationView:view viewForAnnotation:(RouteAnnotation)annotation]; } return nil; }
-
(void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end
而 _routesearch.delegate = self;在设置代理的时候,使用的是BMKRouteSearch百度api中的代理,而此代理必须先实现了代理方法才能设置代理(一般我们些的代理方法,并不需要先遵守哦!)而且我们使用的是arc,所以,这行代码会报错!必须把代理属性设置为weak才行哦!
其它基本上没有什么错误了哈,其它不会可以参考官方demo哦!