首先按照百度地图引入SDK 官网上都有教程 这里就不多说了
引入相关的头文件 看百度demo里面 下面的是百度demo里面的文件 可以去那里拉
(这里自己简单整理一下 方便自己查看)
<pre>
import <MapKit/MapKit.h>
import <BaiduMapAPI_Base/BMKBaseComponent.h>//引入base相关所有的头文件
import <BaiduMapAPI_Map/BMKMapComponent.h>//引入地图功能所有的头文件
import <BaiduMapAPI_Search/BMKSearchComponent.h>//引入检索功能所有的头文件
import <BaiduMapAPI_Cloud/BMKCloudSearchComponent.h>//引入云检索功能所有的头文件
import <BaiduMapAPI_Location/BMKLocationComponent.h>//引入定位功能所有的头文件
import <BaiduMapAPI_Utils/BMKUtilsComponent.h>//引入计算工具所有的头文件
import <BaiduMapAPI_Radar/BMKRadarComponent.h>//引入周边雷达功能所有的头文件
//只引入所需的单个头文件
import "RouteAnnotation.h"
import "UIImage+Rotate.h"
</pre>
声明变量和协议
<pre>
@interface StorePathViewController ()<BMKMapViewDelegate,BMKRouteSearchDelegate,BMKLocationServiceDelegate,BMKGeoCodeSearchDelegate>
/** 地图视图 /
//@property (nonatomic, strong) BMKMapView mapView;
@property (weak, nonatomic) IBOutlet BMKMapView mapView;
/* 搜索 /
@property (nonatomic, strong) BMKRouteSearch routesearch;//路线查找
@property (nonatomic, strong) BMKLocationService *locService;//定位
@end
</pre>
按照百度地图文档进行设置代理个释放
<pre>
- (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;
}
</pre>
懒加载
<pre>
//搜索路线
(BMKRouteSearch *)routesearch{
if (_routesearch == nil) {
_routesearch = [[BMKRouteSearch alloc] init];
}
return _routesearch;
}
//定位-
(BMKLocationService*)locService {
if (_locService == nil) {
_locService = [[BMKLocationService alloc] init];}
return _locService;
}
</pre>
定位开始
<pre>
-
(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];
}
</pre>
获取当前位置
<pre>
-(void)didUpdateBMKUserLocation:(BMKUserLocation *)userLocation {
[_mapView updateLocationData:userLocation];
CLLocationCoordinate2D coordinate = userLocation.location.coordinate;
startlocation = coordinate;
}
</pre>
对目的地进行标注
<pre>
-
(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];
}
}
</pre>
开始位置和目的地位置加入检索信息
pragma mark - 开始和终点位置
<pre>
-
(BMKPlanNode *)startPt {
BMKPlanNode* start = [[BMKPlanNode alloc]init];
start.pt = startlocation;
return start;
}
- (BMKPlanNode )endPt {
BMKPlanNode end = [[BMKPlanNode alloc]init];
end.pt = endLocation;
return end;
}
</pre>
公交路线开始检索
<pre>
-(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检索发送失败");
}
}
</pre>
驾车路线开始检索
<pre>
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];
}
</pre>
步行路线开始检索
<pre>
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检索发送失败");
}
}</pre>
三种路线的计算 (直接拷贝过来的)
<pre>
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];
}
}
</pre>
驾车
<pre>
//驾车的路线绘制
-
(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<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 {
[SVProgressHUD showErrorWithStatus:ErrorPathMsg];
}
}
</pre>
步行
<pre>
//步行的路线绘制
-
(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<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;
}else {
[SVProgressHUD showErrorWithStatus:ErrorPathMsg];
}
}
</pre>
<pre>
//路线标记
-
(BMKAnnotationView *)mapView:(BMKMapView *)view viewForAnnotation:(id <BMKAnnotation>)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<BMKOverlay>)overlay
{
if ([overlay isKindOfClass:[BMKPolyline class]]) {
BMKPolylineView polylineView = [[BMKPolylineView alloc] initWithOverlay:overlay];
polylineView.fillColor = [[UIColor cyanColor] colorWithAlphaComponent:1];
polylineView.strokeColor = [[UIColor blueColor] colorWithAlphaComponent:0.7];
polylineView.lineWidth = 3.0;
return polylineView;
}
return nil;
}
</pre>