- 上一篇:百度地圖集成--繪制線
前言:上一篇介紹了如何繪制線,本篇介紹如何進行駕車路線規(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地址
有沒有幫到你呢???
(歡迎大家對不合適的地方進行指正,看完覺得有幫到你給點個贊??吧)