最近要作個相似這樣的地圖效果。在這裏不得不吐槽下iOS百度地圖開發文檔,內容遠沒有安卓版的詳細。。。。數組
要實現這種效果,這就得用到百度地圖的路徑規劃了。開發文檔上是這樣寫的數據結構
路徑規劃app
百度地圖iOS SDK爲開發者提供了公交換乘、駕車和步行三種類型的線路規劃方案,同時根據不一樣的方案還能夠選擇「時間最短」、「距離最短」等策略來完成最終的線路規劃。開發者可根據本身實際的業務需求來自由使用。
公交換乘的線路規範實現方式以下:工具
-(void)viewDidLoad { //初始化檢索對象 _searcher = [[BMKRouteSearch alloc]init]; _searcher.delegate = self; //發起檢索 BMKPlanNode* start = [[[BMKPlanNode alloc]init] autorelease]; start.name = @"龍澤"; BMKPlanNode* end = [[[BMKPlanNode alloc]init] autorelease]; end.name = "西單"; BMKTransitRoutePlanOption *transitRouteSearchOption = [[BMKTransitRoutePlanOption alloc]init]; transitRouteSearchOption.city= @"北京市"; transitRouteSearchOption.startNode = start; transitRouteSearchOption.endNode = end; BOOL flag = [_searcher transitSearch:transitRouteSearchOption]; [transitRouteSearchOption release]; if(flag) { NSLog(@"bus檢索發送成功"); } else { NSLog(@"bus檢索發送失敗"); } } //實現Deleage處理回調結果 -(void)onGetTransitRouteResult:(BMKRouteSearch*)searcher result: (BMKTransitRouteResult*)result errorCode:(BMKSearchErrorCode)error { if (error == BMK_SEARCH_NO_ERROR) { //在此處理正常結果 } else if (error == BMK_SEARCH_AMBIGUOUS_ROURE_ADDR){ //當路線起終點有歧義時通,獲取建議檢索起終點 //result.routeAddrResult } else { NSLog(@"抱歉,未找到結果"); } } //不使用時將delegate設置爲 nil -(void)viewWillDisappear:(BOOL)animated { _searcher.delegate = nil; }
可是,咱們從字面上理解根本不知道返回的字段是什麼,文檔上也沒說。。。。。ui
此時,咱們就該利用到百度地圖開發demo了,在demo上它是這樣寫的atom
- (void)onGetTransitRouteResult:(BMKRouteSearch*)searcher result:(BMKTransitRouteResult*)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) { BMKTransitRouteLine* plan = (BMKTransitRouteLine*)[result.routes objectAtIndex:0]; // 計算路線方案中的路段數目 int size = [plan.steps count]; int planPointCounts = 0; for (int i = 0; i < size; i++) { BMKTransitStep* 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]; // 添加起點標註 } RouteAnnotation* item = [[RouteAnnotation alloc]init]; item.coordinate = transitStep.entrace.location; item.title = transitStep.instruction; item.type = 3; [_mapView addAnnotation:item]; //軌跡點總數累計 planPointCounts += transitStep.pointsCount; } //軌跡點 BMKMapPoint * temppoints = new BMKMapPoint[planPointCounts]; int i = 0; for (int j = 0; j < size; j++) { BMKTransitStep* 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; } }
按照它的邏輯,彷佛好像這個BMKTransitRouteLine對象就是咱們想要的結果呢。spa
爲何這麼說呢,由於這句話。code
BMKTransitRouteLine* plan = (BMKTransitRouteLine*)[result.routes objectAtIndex:0];
它是取數組中的第一個元素,而後在這個對象中取得路徑點,最後開始繪圖。爲證實沒有猜錯,咱們在去百度地圖頭文件中看看這個對象究竟是什麼。對象
在文件BMKRouteSearchType.h中,咱們能夠看到blog
///此類表示一個換乘路線,換乘路線將根據既定策略調配多種交通工具 @interface BMKTransitRouteLine : BMKRouteLine @end
在往下看,咱們還能夠看到
@interface BMKTransitRouteResult : NSObject{ BMKTaxiInfo* _taxiInfo; BMKSuggestAddrInfo* _suggestAddrResult; NSArray* _routes; } ///該路線打車信息 @property (nonatomic, strong) BMKTaxiInfo* taxiInfo; ///返回起點或終點的地址信息結果 @property (nonatomic, strong) BMKSuggestAddrInfo* suggestAddrResult; ///方案數組,成員類型爲BMKTransitRouteLine @property (nonatomic, strong) NSArray* routes; @end
這就證實咱們的想法是沒錯。
找到了咱們所須要的對象,那怎麼具體把它解析出來了?不急,再慢慢往下看
BMKTransitRouteLine對象繼承BMKRouteLine對象,那咱們就得看BMKRouteLine對象了,
///此類表示路線數據結構的基類,表示一條路線,路線可能包括:路線規劃中的換乘/駕車/步行路線 ///此類爲路線數據結構的基類,通常關注其子類對象便可,無需直接生成該類對象 @interface BMKRouteLine : NSObject{ int _distance; BMKTime* _duration; BMKRouteNode* _starting; BMKRouteNode* _terminal; NSString* _title; NSArray* _steps; } ///路線長度 單位: 米 @property (nonatomic) int distance; ///路線耗時 單位: 秒 @property (nonatomic, strong) BMKTime* duration; ///路線起點信息 @property (nonatomic, strong) BMKRouteNode* starting; ///路線終點信息 @property (nonatomic, strong) BMKRouteNode* terminal; ///路線名稱(預留字段,現爲空) @property (nonatomic, strong) NSString* title; ///路線中的全部路段,成員類型爲BMKWalkingStep,BMKDrivingStep,BMKTransitStep @property (nonatomic, strong) NSArray* steps; @end
在這,咱們能夠很確定的知道咱們所需的信息必定在數組steps中(不要問爲何,若是這都看不出的話,那你面壁去)。
在例子中,咱們要檢索公交,那麼應該是steps由BMKTransitStep對象組成的數組,
查看BMKTransitStep對象
///此類表示公交換乘路線中的一個路段 @interface BMKTransitStep : BMKRouteStep{ BMKRouteNode* _entrace; BMKRouteNode* _exit; NSString* _instruction; BMKTransitStepType _stepType; BMKVehicleInfo* _vehicleInfo; } ///路段入口信息 @property (nonatomic, retain) BMKRouteNode* entrace; ///路段出口信息 @property (nonatomic, retain) BMKRouteNode* exit; ///路段換乘說明 @property (nonatomic, retain) NSString* instruction; ///路段類型 @property (nonatomic) BMKTransitStepType stepType; ///當路段爲公交路段或地鐵路段時,能夠獲取交通工具信息 @property (nonatomic, retain) BMKVehicleInfo* vehicleInfo; @end
能夠肯定,咱們最終所須要的信息就在對象BMKVehicleInfo中了,爲保險點,咱們在看下對象BMKVehicleInfo
///路線換乘方案裏的交通工具信息類 @interface BMKVehicleInfo : NSObject{ NSString* _uid; NSString* _title; int _passStationNum; int _totalPrice; int _zonePrice; } ///該交通路線的標識 @property (nonatomic, retain) NSString* uid; ///該交通路線的名稱 @property (nonatomic, retain) NSString* title; ///該交通路線的所乘站數 @property (nonatomic) int passStationNum; ///該交通路線的全程價格 @property (nonatomic) int totalPrice; ///該交通路線的所乘區間的區間價格 @property (nonatomic) int zonePrice; @end
在這已經很明顯了,title就是咱們所需的信息了。