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


最近要做個類似這樣的地圖效果。在這里不得不吐槽下iOS百度地圖開發文檔,內容遠沒有安卓版的詳細。。。。

要實現這種效果,這就得用到百度地圖的路徑規划了。開發文檔上是這樣寫的

路徑規划

百度地圖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; 
    }

但是,我們從字面上理解根本不知道返回的字段是什么,文檔上也沒說。。。。。

此時,我們就該利用到百度地圖開發demo了,在demo上它是這樣寫的

- (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對象就是我們想要的結果呢。

為什么這么說呢,因為這句話。

BMKTransitRouteLine* plan = (BMKTransitRouteLine*)[result.routes objectAtIndex:0];

它是取數組中的第一個元素,然后在這個對象中取得路徑點,最后開始繪圖。為證明沒有猜錯,我們在去百度地圖頭文件中看看這個對象到底是什么。

在文件BMKRouteSearchType.h中,我們可以看到

///此類表示一個換乘路線,換乘路線將根據既定策略調配多種交通工具
@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就是我們所需的信息了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM