首先按照百度地图引入SDK 官网上都有教程 这里就不多说了
引入相关的头文件 看百度demo里面 下面的是百度demo里面的文件 可以去那里拉
(这里自己简单整理一下 方便自己查看)
import
import
//引入base相关所有的头文件 import
//引入地图功能所有的头文件 import
//引入检索功能所有的头文件 import
//引入云检索功能所有的头文件 import
//引入定位功能所有的头文件 import
//引入计算工具所有的头文件 import
//引入周边雷达功能所有的头文件 //只引入所需的单个头文件
import "RouteAnnotation.h"
import "UIImage+Rotate.h"
声明变量和协议
@interface StorePathViewController ()/** 地图视图 /
//@property (nonatomic, strong) BMKMapView mapView;
@property (weak, nonatomic) IBOutlet BMKMapView mapView;
/* 搜索 /
@property (nonatomic, strong) BMKRouteSearch routesearch;//路线查找
@property (nonatomic, strong) BMKLocationService *locService;//定位@end
按照百度地图文档进行设置代理个释放
- (void)viewWillAppear:(BOOL)animated
{
// [super viewWillAppear:animated];
[self.mapView viewWillAppear];
self.mapView.delegate = self;
self.routesearch.delegate = self;
self.locService.delegate =self;
} - (void)viewWillDisappear:(BOOL)animated
{
[self.mapView viewWillDisappear];
self.mapView.delegate = nil;// 此处记得不用的时候需要置nil,否则影响内存的释放
self.routesearch.delegate = nil;
self.locService.delegate = nil;
}
懒加载
//搜索路线
(BMKRouteSearch *)routesearch{
if (_routesearch == nil) {
_routesearch = [[BMKRouteSearch alloc] init];
}
return _routesearch;
}
//定位-
(BMKLocationService*)locService {
if (_locService == nil) {
_locService = [[BMKLocationService alloc] init];}
return _locService;
}
定位开始
-
(void)viewDidLoad {
[super viewDidLoad];
[self.view addSubview:self.mapView];
[_mapView setZoomEnabled:YES];
[_mapView setZoomLevel:13];//级别,3-19
_mapView.showMapScaleBar = YES;//比例尺
_mapView.showsUserLocation=YES;//显示当前设备的位置
_mapView.showMapScaleBar = YES;_mapView.userTrackingMode = BMKUserTrackingModeFollow;//定位跟随模式
[self.locService startUserLocationService];
[self storeLocationStars];
}
获取当前位置
-(void)didUpdateBMKUserLocation:(BMKUserLocation *)userLocation {
[_mapView updateLocationData:userLocation];CLLocationCoordinate2D coordinate = userLocation.location.coordinate; startlocation = coordinate;
}
对目的地进行标注
-
(void)storeLocationStars {
if (_mainListModel.latitude && _mainListModel.longitude) {
BMKPointAnnotation *point1 = [[BMKPointAnnotation alloc]init];point1.coordinate = CLLocationCoordinate2DMake([_mainListModel.latitude doubleValue], [_mainListModel.longitude doubleValue]); endLocation = point1.coordinate; point1.title = _mainListModel.name; [_mapView addAnnotation:point1];
}
}
开始位置和目的地位置加入检索信息
pragma mark - 开始和终点位置
-
(BMKPlanNode *)startPt {
BMKPlanNode* start = [[BMKPlanNode alloc]init];
start.pt = startlocation;
return start;
}
- (BMKPlanNode )endPt {
BMKPlanNode end = [[BMKPlanNode alloc]init];
end.pt = endLocation;
return end;
}
公交路线开始检索
-(IBAction)onClickBusSearch
{BMKMassTransitRoutePlanOption *MassTransitRouteSearchOption = [[BMKMassTransitRoutePlanOption alloc]init]; MassTransitRouteSearchOption.from = [self startPt]; MassTransitRouteSearchOption.to = [self endPt]; BOOL flag = [_routesearch massTransitSearch:MassTransitRouteSearchOption]; [SVProgressHUD showWithStatus:SearchPathMsg]; if(flag) { NSLog(@"bus检索发送成功"); } else { NSLog(@"bus检索发送失败"); }
}
驾车路线开始检索
pragma mark 驾车搜索
-(IBAction)onClickDriveSearch
{
//[self.mapView removeFromSuperview];/// 驾车查询基础信息类 BMKDrivingRoutePlanOption *drivingRouteSearchOption = [[BMKDrivingRoutePlanOption alloc]init]; drivingRouteSearchOption.from = [self startPt]; drivingRouteSearchOption.to = [self endPt]; BOOL flag = [_routesearch drivingSearch:drivingRouteSearchOption]; if(flag) { NSLog(@"car检索发送成功"); } else { NSLog(@"car检索发送失败"); } [SVProgressHUD showWithStatus:SearchPathMsg];
}
步行路线开始检索
pragma mark 步行搜索
-(IBAction)onClickWalkSearch
{/// 步行查询基础信息类 BMKWalkingRoutePlanOption *walkingRouteSearchOption = [[BMKWalkingRoutePlanOption alloc]init]; walkingRouteSearchOption.from = [self startPt]; walkingRouteSearchOption.to = [self endPt]; BOOL flag = [_routesearch walkingSearch:walkingRouteSearchOption]; [SVProgressHUD showWithStatus:SearchPathMsg]; if(flag) { NSLog(@"walk检索发送成功"); } else { NSLog(@"walk检索发送失败"); }
}
三种路线的计算 (直接拷贝过来的)
pragma mark 公交路线
-
(void)onGetMassTransitRouteResult:(BMKRouteSearch)searcher result:(BMKMassTransitRouteResult)result errorCode:(BMKSearchErrorCode)error {
NSArray* array = [NSArray arrayWithArray:self.mapView.annotations];
[_mapView removeAnnotations:array];
array = [NSArray arrayWithArray:_mapView.overlays];
[_mapView removeOverlays:array];
[self storeLocationStars];if (error == BMK_SEARCH_NO_ERROR) {
[SVProgressHUD dismiss];
BMKMassTransitRouteLine* routeLine = (BMKMassTransitRouteLine*)[result.routes objectAtIndex:0];BOOL startCoorIsNull = YES; CLLocationCoordinate2D startCoor;//起点经纬度 CLLocationCoordinate2D endCoor;//终点经纬度 NSInteger size = [routeLine.steps count]; NSInteger planPointCounts = 0; for (NSInteger i = 0; i < size; i++) { BMKMassTransitStep* transitStep = [routeLine.steps objectAtIndex:i]; for (BMKMassTransitSubStep *subStep in transitStep.steps) { //添加annotation节点 RouteAnnotation* item = [[RouteAnnotation alloc]init]; item.coordinate = subStep.entraceCoor; item.title = subStep.instructions; item.type = 2; [_mapView addAnnotation:item]; if (startCoorIsNull) { startCoor = subStep.entraceCoor; startCoorIsNull = NO; } endCoor = subStep.exitCoor; //轨迹点总数累计 planPointCounts += subStep.pointsCount; //steps中是方案还是子路段,YES:steps是BMKMassTransitStep的子路段(A到B需要经过多个steps);NO:steps是多个方案(A到B有多个方案选择) if (transitStep.isSubStep == NO) {//是子方案,只取第一条方案 break; } else { //是子路段,需要完整遍历transitStep.steps } } } //添加起点标注 RouteAnnotation* startAnnotation = [[RouteAnnotation alloc]init]; startAnnotation.coordinate = startCoor; startAnnotation.title = @"起点"; startAnnotation.type = 0; [_mapView addAnnotation:startAnnotation]; // 添加起点标注 //添加终点标注 RouteAnnotation* endAnnotation = [[RouteAnnotation alloc]init]; endAnnotation.coordinate = endCoor; endAnnotation.title = @"终点"; endAnnotation.type = 1; [_mapView addAnnotation:endAnnotation]; // 添加起点标注 //轨迹点 BMKMapPoint * temppoints = new BMKMapPoint[planPointCounts]; NSInteger index = 0; for (BMKMassTransitStep* transitStep in routeLine.steps) { for (BMKMassTransitSubStep *subStep in transitStep.steps) { for (NSInteger i = 0; i < subStep.pointsCount; i++) { temppoints[index].x = subStep.points[i].x; temppoints[index].y = subStep.points[i].y; index++; } //steps中是方案还是子路段,YES:steps是BMKMassTransitStep的子路段(A到B需要经过多个steps);NO:steps是多个方案(A到B有多个方案选择) if (transitStep.isSubStep == NO) {//是子方案,只取第一条方案 break; } else { //是子路段,需要完整遍历transitStep.steps } } } // 通过points构建BMKPolyline BMKPolyline* polyLine = [BMKPolyline polylineWithPoints:temppoints count:planPointCounts]; [_mapView addOverlay:polyLine]; // 添加路线overlay delete []temppoints; [self mapViewFitPolyLine:polyLine];
}
else {
[SVProgressHUD showErrorWithStatus:ErrorPathMsg];
}
}
驾车
//驾车的路线绘制
-
(void)onGetDrivingRouteResult:(BMKRouteSearch)searcher result:(BMKDrivingRouteResult)result errorCode:(BMKSearchErrorCode)error
{
NSArray* array = [NSArray arrayWithArray:_mapView.annotations];
[_mapView removeAnnotations:array];
array = [NSArray arrayWithArray:_mapView.overlays];
[_mapView removeOverlays:array];
[self storeLocationStars];
if (error == BMK_SEARCH_NO_ERROR) {
[SVProgressHUD dismiss];
BMKDrivingRouteLine* plan = (BMKDrivingRouteLine)[result.routes objectAtIndex:0];
// 计算路线方案中的路段数目
NSInteger size = [plan.steps count];
int planPointCounts = 0;
for (int i = 0; i < size; i++) {
BMKDrivingStep 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]; // 添加起点标注 } //添加annotation节点 RouteAnnotation* item = [[RouteAnnotation alloc]init]; item.coordinate = transitStep.entrace.location; item.title = transitStep.entraceInstruction; item.degree = transitStep.direction * 30; item.type = 4; [_mapView addAnnotation:item]; //轨迹点总数累计 planPointCounts += transitStep.pointsCount; } // 添加途经点 if (plan.wayPoints) { for (BMKPlanNode* tempNode in plan.wayPoints) { RouteAnnotation* item = [[RouteAnnotation alloc]init]; item = [[RouteAnnotation alloc]init]; item.coordinate = tempNode.pt; item.type = 5; item.title = tempNode.name; [_mapView addAnnotation:item]; } } //轨迹点 BMKMapPoint * temppoints = new BMKMapPoint[planPointCounts]; int i = 0; for (int j = 0; j < size; j++) { BMKDrivingStep* transitStep = [plan.steps objectAtIndex:j]; int k=0; for(k=0;k
}else {
[SVProgressHUD showErrorWithStatus:ErrorPathMsg];
}
}
步行
//步行的路线绘制
-
(void)onGetWalkingRouteResult:(BMKRouteSearch)searcher result:(BMKWalkingRouteResult)result errorCode:(BMKSearchErrorCode)error
{NSArray* array = [NSArray arrayWithArray:_mapView.annotations];
[_mapView removeAnnotations:array];
array = [NSArray arrayWithArray:_mapView.overlays];
[_mapView removeOverlays:array];
[self storeLocationStars];
if (error == BMK_SEARCH_NO_ERROR) {
[SVProgressHUD dismiss];
BMKWalkingRouteLine* plan = (BMKWalkingRouteLine)[result.routes objectAtIndex:0];
NSInteger size = [plan.steps count];
int planPointCounts = 0;
for (int i = 0; i < size; i++) {
BMKWalkingStep 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]; // 添加起点标注 } //添加annotation节点 RouteAnnotation* item = [[RouteAnnotation alloc]init]; item.coordinate = transitStep.entrace.location; item.title = transitStep.entraceInstruction; item.degree = transitStep.direction * 30; item.type = 4; [_mapView addAnnotation:item]; //轨迹点总数累计 planPointCounts += transitStep.pointsCount; } //轨迹点 BMKMapPoint * temppoints = new BMKMapPoint[planPointCounts]; int i = 0; for (int j = 0; j < size; j++) { BMKWalkingStep* transitStep = [plan.steps objectAtIndex:j]; int k=0; for(k=0;k
}else {
[SVProgressHUD showErrorWithStatus:ErrorPathMsg];
}
}
//路线标记
-
(BMKAnnotationView *)mapView:(BMKMapView *)view viewForAnnotation:(id
)annotation
{if ([annotation isKindOfClass:[RouteAnnotation class]]) {
// return [self getRouteAnnotationView:view viewForAnnotation:(RouteAnnotation)annotation];
return [(RouteAnnotation)annotation getRouteAnnotationView:view];
}if ([annotation isKindOfClass:[BMKPointAnnotation class]]) {
BMKPinAnnotationView *newAnnotationView = [[BMKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"myAnnotation"];
newAnnotationView.pinColor = BMKPinAnnotationColorRed;
newAnnotationView.animatesDrop = YES;// 设置该标注点动画显示
return newAnnotationView;
}
return nil;
}
//加载线路 (BMKOverlayView*)mapView:(BMKMapView )map viewForOverlay:(id
)overlay polylineView = [[BMKPolylineView alloc] initWithOverlay:overlay];
{
if ([overlay isKindOfClass:[BMKPolyline class]]) {
BMKPolylineView
polylineView.fillColor = [[UIColor cyanColor] colorWithAlphaComponent:1];
polylineView.strokeColor = [[UIColor blueColor] colorWithAlphaComponent:0.7];
polylineView.lineWidth = 3.0;
return polylineView;
}
return nil;
}