iOS百度地圖開發之路徑規則

最近要作個相似這樣的地圖效果。在這裏不得不吐槽下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就是咱們所需的信息了。

相關文章
相關標籤/搜索