ios百度地图-路径规划

百度地图的路径规划功能, 在使用百度路径的时候,出现了一些小问题,在此,分享一下自己的最简单的一个路径小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哦!

转载于:https://my.oschina.net/panyong/blog/306558

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值