百度地圖的集成 ---路線規(guī)劃之駕車

前言:上一篇介紹了如何繪制線,本篇介紹如何進行駕車路線規(guī)劃

//
//  RideController.m
//  地圖
//
//  Created by apple on 2018/4/2.
//  Copyright ? 2018年 zj. All rights reserved.
//

#import "RideController.h"
#import <BaiduMapAPI_Base/BMKTypes.h> //此頭文件必須放在你要用的類里面,因為里面包含了c++語言,需要把.m文件改為.mm

@interface RideController ()<BMKMapViewDelegate,BMKRouteSearchDelegate>
{
    BMKMapView* _mapView;
    BMKRouteSearch *_routeSearch;
}
@end

@implementation RideController
-(void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    _mapView.delegate = self;
}

-(void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    _mapView.delegate = nil; // 不用時,置nil
}
- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor whiteColor];
    self.title = @"騎行路線規(guī)劃";
    // 設置地圖
    [self setupBMKLocation];
}
- (void)setupBMKLocation {
    _mapView = [[BMKMapView alloc]init];
    _mapView.frame = self.view.bounds;
    _mapView.delegate = self;
    [_mapView setZoomLevel:12.0];
    [self.view addSubview:_mapView];
   
    //==========================騎行路線規(guī)劃=====================================
    //初始化檢索對象
    _routeSearch = [[BMKRouteSearch alloc] init];
    //設置delegate,用于接收檢索結果
    _routeSearch.delegate = self;
    CLLocationCoordinate2D coor[4] = {0};
    coor[0].latitude = 39.832136;
    coor[0].longitude = 116.34095;
    
    coor[1].latitude = 39.832136;
    coor[1].longitude = 116.42095;

    coor[2].latitude = 39.902136;
    coor[2].longitude = 116.42095;

    coor[3].latitude = 39.902136;
    coor[3].longitude = 116.44095;
    //構造騎行查詢基礎信息類
    BMKPlanNode* start = [[BMKPlanNode alloc]init];
    //    start.name = @"北京";
    //    start.cityName = @"天安門";
    start.pt = coor[0];
    BMKPlanNode* end = [[BMKPlanNode alloc]init];
    //    end.name = @"天津";
    //    end.cityName = @"天津站";
    end.pt = coor[2];
    BMKRidingRoutePlanOption *option = [[BMKRidingRoutePlanOption alloc]init];
    option.from = start;
    option.to = end;
    BOOL flag = [_routeSearch ridingSearch:option];
    if (flag)
    {
        NSLog(@"騎行規(guī)劃檢索發(fā)送成功");
    }
    else
    {
        NSLog(@"騎行規(guī)劃檢索發(fā)送失敗");
    }
    
    
    
}
/**
 *返回騎行搜索結果
 *@param searcher 搜索對象
 *@param result 搜索結果,類型為BMKRidingRouteResult
 *@param error 錯誤號,@see BMKSearchErrorCode
 */
-(void)onGetRidingRouteResult:(BMKRouteSearch*)searcher result:(BMKRidingRouteResult*)result errorCode:(BMKSearchErrorCode)error{
    NSLog(@"onGetRidingRouteResult error:%d", (int)error);
    NSArray* array = [NSArray arrayWithArray:_mapView.annotations];
    [_mapView removeAnnotations:array];
    array = [NSArray arrayWithArray:_mapView.overlays];
    [_mapView removeOverlays:array];
    if (error == BMK_SEARCH_NO_ERROR) {
        BMKRidingRouteLine* plan = (BMKRidingRouteLine*)[result.routes objectAtIndex:0];
        NSInteger size = [plan.steps count];
        int planPointCounts = 0;
        for (int i = 0; i < size; i++) {
            BMKRidingStep* transitStep = [plan.steps objectAtIndex:i];
            if (i == 0) {
                BMKPointAnnotation* item = [[BMKPointAnnotation alloc]init];
                item.coordinate = plan.starting.location;
                item.title = @"起點";
                [_mapView addAnnotation:item]; // 添加起點標注
            }
            if(i==size-1){
                BMKPointAnnotation* item = [[BMKPointAnnotation alloc]init];
                item.coordinate = plan.terminal.location;
                item.title = @"終點";
                
                [_mapView addAnnotation:item]; // 添加起點標注
            }
            // 添加annotation節(jié)點
            BMKPointAnnotation* item = [[BMKPointAnnotation alloc]init];
            item.coordinate = transitStep.entrace.location;
            item.title = transitStep.instruction;
            
            [_mapView addAnnotation:item];
            
            //軌跡點總數(shù)累計
            planPointCounts += transitStep.pointsCount;
            
        }
        
        //軌跡點
        BMKMapPoint * temppoints = new BMKMapPoint[planPointCounts];
        int i = 0;
        for (int j = 0; j < size; j++) {
            BMKRidingStep* 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;
                [self mapViewFitPolyLine:polyLine];
       
    } else if (error == BMK_SEARCH_AMBIGUOUS_ROURE_ADDR) {
        
        
    }
    
}

//根據(jù)polyline設置地圖范圍
- (void)mapViewFitPolyLine:(BMKPolyline *) polyLine {
    CGFloat leftTopX, leftTopY, rightBottomX, rightBottomY;
    if (polyLine.pointCount < 1) {
        return;
    }
    BMKMapPoint pt = polyLine.points[0];
    // 左上角頂點
    leftTopX = pt.x;
    leftTopY = pt.y;
    // 右下角頂點
    rightBottomX = pt.x;
    rightBottomY = pt.y;
    for (int i = 1; i < polyLine.pointCount; i++) {
        BMKMapPoint pt = polyLine.points[i];
        leftTopX = pt.x < leftTopX ? pt.x : leftTopX;
        leftTopY = pt.y < leftTopY ? pt.y : leftTopY;
        rightBottomX = pt.x > rightBottomX ? pt.x : rightBottomX;
        rightBottomY = pt.y > rightBottomY ? pt.y : rightBottomY;
    }
    BMKMapRect rect;
    rect.origin = BMKMapPointMake(leftTopX, leftTopY);
    rect.size = BMKMapSizeMake(rightBottomX - leftTopX, rightBottomY - leftTopY);
    UIEdgeInsets padding = UIEdgeInsetsMake(30, 0, 100, 0);
    BMKMapRect fitRect = [_mapView mapRectThatFits:rect edgePadding:padding];
    [_mapView setVisibleMapRect:fitRect];
}
/**
 *根據(jù)overlay生成對應的View
 *@param mapView 地圖View
 *@param overlay 指定的overlay
 *@return 生成的覆蓋物View
 */
- (BMKOverlayView *)mapView:(BMKMapView *)mapView viewForOverlay:(id <BMKOverlay>)overlay{
    if ([overlay isKindOfClass:[BMKPolyline class]]){
        BMKPolylineView* polylineView = [[BMKPolylineView alloc] initWithOverlay:overlay];
        polylineView.strokeColor = [UIColor redColor];
        polylineView.lineWidth = 2.0;
        
        return polylineView;
    }
    return nil;
}

#pragma mark - BMKLocationServiceDelegate 實現(xiàn)相關delegate 處理位置信息更新

/**
 *在地圖View將要啟動定位時,會調用此函數(shù)
 *@param mapView 地圖View
 */
- (void)willStartLocatingUser
{
    NSLog(@"start locate");
}

/**
 *用戶方向更新后,會調用此函數(shù)
 *@param userLocation 新的用戶位置
 */
- (void)didUpdateUserHeading:(BMKUserLocation *)userLocation
{
    NSLog(@"heading is %@",userLocation.heading);
}
/**
 *用戶位置更新后,會調用此函數(shù)
 *@param userLocation 新的用戶位置
 */
- (void)didUpdateBMKUserLocation:(BMKUserLocation *)userLocation
{
    
    NSLog(@"didUpdateUserLocation lat %f,long %f", userLocation.location.coordinate.latitude, userLocation.location.coordinate.longitude);
    
    BMKCoordinateRegion region;
    region.center.latitude = userLocation.location.coordinate.latitude;
    region.center.longitude = userLocation.location.coordinate.longitude;
    region.span.latitudeDelta = 0.2;
    region.span.longitudeDelta = 0.2;
    if (_mapView)
    {
        _mapView.region = region;
    }
    [_mapView setZoomLevel:19.0];
    
    //添加當前位置的標注
    CLLocationCoordinate2D coord;
    coord.latitude = userLocation.location.coordinate.latitude;
    coord.longitude = userLocation.location.coordinate.longitude;
    
    BMKPointAnnotation *_pointAnnotation = [[BMKPointAnnotation alloc] init];
    _pointAnnotation.coordinate = coord;
    
    _pointAnnotation.title = @"我的位置";// 要顯示的標題;注意:如果不設置title,無法點擊annotation,也無法使用回調函數(shù)
    dispatch_async(dispatch_get_main_queue(), ^{
        [_mapView removeOverlays:_mapView.overlays];
        [_mapView setCenterCoordinate:coord animated:true];
        [_mapView addAnnotation:_pointAnnotation];
        // [_mapView selectAnnotation:_pointAnnotation animated:NO]; 默認選中大頭針
        
    });
    
}
//設置標注樣式
-(BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(id<BMKAnnotation>)annotation{
    //大頭針系統(tǒng)樣式
        if ([annotation isKindOfClass:[BMKPointAnnotation class]]) {
            static NSString *pointReuseIndentifier = @"pointReuseIndentifier";
            BMKPinAnnotationView*annotationView = (BMKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:pointReuseIndentifier];
            if (annotationView == nil) {
                annotationView = [[BMKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:pointReuseIndentifier];
            }
            annotationView.pinColor = BMKPinAnnotationColorPurple;
            annotationView.canShowCallout= YES;      //設置氣泡可以彈出,默認為NO
            annotationView.animatesDrop=YES;         //設置標注動畫顯示,默認為NO
            annotationView.draggable = YES;          //設置標注可以拖動,默認為NO
            return annotationView;
        }
        return nil;
}
/**
 *在地圖View停止定位后,會調用此函數(shù)
 *
 */
- (void)didStopLocatingUser
{
    NSLog(@"stop locate");
}

/**
 *定位失敗后,會調用此函數(shù)
 *
 *@param error 錯誤號,參考CLError.h中定義的錯誤號
 */
- (void)didFailToLocateUserWithError:(NSError *)error
{
    NSLog(@"location error");
    //    NSString *city = [[NSUserDefaults standardUserDefaults] objectForKey:@"cityNmae"];
    //    [self.cityBtn setTitle:city forState:UIControlStateNormal];
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


@end

到此就結束了駕車路線規(guī)劃,后續(xù)會更新關于地圖的別的功能,盡請期待.....
demo地址
有沒有幫到你呢???
(歡迎大家對不合適的地方進行指正,看完覺得有幫到你給點個贊??吧)

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容