本文介绍三种接口:
1.基础地图
2.POI检索
3.定位
首先是配置环境,有两种方法,方法在官方教程里都有,不再多说
1.使用CocoaPods自动配置【这个方法特别好,因为当你使用CocoaPods配置完之后就可以直接使用了,简单到你都不敢相信,我他妈用手动配置,每次都有各种问题,解决起来烦死人,使用CocoaPods配置,可能会报一个错(linker command failed with exit code 1 (use -v to see invocation)),但是,很好解决,只需要找到Build settings->Linking->Other Linker Flags,添加一个-all_load就可以了 】
2.手动配置【这个方法就是狗屎 bull shit】
特别注意:
1 1、如果在iOS9中使用了调起百度地图客户端功能,必须在"Info.plist"中进行如下配置,否则不能调起百度地图客户端。 2 <key>LSApplicationQueriesSchemes</key> 3 <array> 4 <string>baidumap</string> 5 </array> 6 2、自iOS SDK v2.5.0起,为了对iOS8的定位能力做兼容,需要在info.plist里添加(以下二选一,两个都添加默认使用 NSLocationWhenInUseUsageDescription): 7 NSLocationWhenInUseUsageDescription ,允许在前台使用时获取GPS的描述 8 NSLocationAlwaysUsageDescription ,允许永久使用GPS的描述 9 3、在使用Xcode6进行SDK开发过程中,需要在info.plist中添加:Bundle display name ,且其值不能为空(Xcode6新建的项目没有此配置,若没有会造成manager start fail
配置完成后
在AppDelegate.m文件中添加对BMKMapManager的初始化,并填入申请的授权Key
1 #import "AppDelegate.h" 2 #import <BaiduMapAPI_Base/BMKMapManager.h> 3 @interface AppDelegate () 4 5 @end 6 7 @implementation AppDelegate 8 9 10 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 11 12 //创建并初始化一个引擎对象 13 BMKMapManager *manager = [[BMKMapManager alloc] init]; 14 //启动地图引擎 15 BOOL success = [manager start:@"zBWLNgRUrTp9CVb5Ez6gZpNebljmYylO" generalDelegate:nil]; 16 17 if (!success) { 18 NSLog(@"失败"); 19 } 20 // Override point for customization after application launch. 21 return YES; 22 }
1.基础地图
1 #import "ViewController.h" 2 #import <BaiduMapAPI_Map/BMKMapView.h> 3 @interface ViewController ()<BMKMapViewDelegate> 4 5 @property (nonatomic,strong) BMKMapView *mapView;//地图视图 6 @end 7 8 @implementation ViewController 9 10 - (void)viewDidLoad { 11 [super viewDidLoad]; 12 //初始化地图 13 self.mapView = [[BMKMapView alloc] initWithFrame:self.view.frame]; 14 self.mapView.delegate =self; 15 //设置地图的显示样式 16 self.mapView.mapType = BMKMapTypeSatellite;//卫星地图 17 18 //设定地图是否打开路况图层 19 self.mapView.trafficEnabled = YES; 20 21 //底图poi标注 22 self.mapView.showMapPoi = NO; 23 24 //在手机上当前可使用的级别为3-21级 25 self.mapView.zoomLevel = 21; 26 27 //设定地图View能否支持旋转 28 self.mapView.rotateEnabled = NO; 29 30 //设定地图View能否支持用户移动地图 31 self.mapView.scrollEnabled = NO; 32 33 //添加到view上 34 [self.view addSubview:self.mapView]; 35 36 //还有很多属性,根据需求查看API 37 }
因为我们选的样式是卫星地图,所有效果如下
2.定位
1 #import "ViewController.h" 2 #import <BaiduMapAPI_Map/BMKMapView.h> 3 #import <BaiduMapAPI_Location/BMKLocationService.h> 4 @interface ViewController ()<BMKLocationServiceDelegate,BMKMapViewDelegate> 5 6 @property (nonatomic,strong) BMKMapView *mapView;//地图视图 7 @property (nonatomic,strong) BMKLocationService *service;//定位服务 8 9 @end 10 11 @implementation ViewController 12 13 14 - (void)viewDidLoad { 15 [super viewDidLoad]; 16 17 //初始化地图 18 self.mapView = [[BMKMapView alloc] initWithFrame:self.view.frame]; 19 self.mapView.delegate =self; 20 21 //添加到view上 22 [self.view addSubview:self.mapView]; 23 24 //初始化定位 25 self.service = [[BMKLocationService alloc] init]; 26 27 //设置代理 28 self.service.delegate = self; 29 30 //开启定位 31 [self.service startUserLocationService]; 32 33 34 // Do any additional setup after loading the view, typically from a nib. 35 } 36 37 #pragma mark -------BMKLocationServiceDelegate 38 39 /** 40 *用户位置更新后,会调用此函数 41 *@param userLocation 新的用户位置 42 */ 43 - (void)didUpdateBMKUserLocation:(BMKUserLocation *)userLocation { 44 45 46 //展示定位 47 self.mapView.showsUserLocation = YES; 48 49 //更新位置数据 50 [self.mapView updateLocationData:userLocation]; 51 52 //获取用户的坐标 53 self.mapView.centerCoordinate = userLocation.location.coordinate; 54 55 self.mapView.zoomLevel =18; 56 57 }
效果如下
3.POI检索
1 #import "ViewController.h" 2 #import <BaiduMapAPI_Map/BMKMapView.h> 3 #import <BaiduMapAPI_Location/BMKLocationService.h> 4 #import <BaiduMapAPI_Search/BMKPoiSearch.h> 5 #import <BaiduMapAPI_Map/BMKAnnotation.h> 6 #import <BaiduMapAPI_Map/BMKPointAnnotation.h> 7 #import <BaiduMapAPI_Map/BMKPinAnnotationView.h> 8 9 10 #define kWidth [UIScreen mainScreen].bounds.size.width 11 @interface ViewController ()<BMKLocationServiceDelegate,BMKPoiSearchDelegate,BMKMapViewDelegate> 12 13 @property (nonatomic,strong) BMKMapView *mapView;//地图视图 14 @property (nonatomic,strong) BMKLocationService *service;//定位服务 15 @property (nonatomic,strong) BMKPoiSearch *poiSearch;//搜索服务 16 17 @property (nonatomic,strong) NSMutableArray *dataArray; 18 @end 19 20 @implementation ViewController 21 22 - (NSMutableArray *)dataArray { 23 if (!_dataArray) { 24 _dataArray = [NSMutableArray array]; 25 26 } 27 return _dataArray; 28 29 } 30 - (void)viewDidLoad { 31 [super viewDidLoad]; 32 33 //初始化地图 34 self.mapView = [[BMKMapView alloc] initWithFrame:self.view.frame]; 35 self.mapView.delegate =self; 36 // //设置地图的显示样式 37 // self.mapView.mapType = BMKMapTypeSatellite;//卫星地图 38 // 39 // //设置路况 40 // self.mapView.trafficEnabled = YES; 41 // 42 // //底图poi标注 43 // self.mapView.showMapPoi = NO; 44 // 45 // //在手机上当前可使用的级别为3-21级 46 // self.mapView.zoomLevel = 21; 47 // 48 // //旋转 49 // self.mapView.rotateEnabled = NO; 50 // 51 // //拖拽 52 // self.mapView.scrollEnabled = NO; 53 // 54 55 [self.view addSubview:self.mapView]; 56 57 //初始化定位 58 self.service = [[BMKLocationService alloc] init]; 59 60 //设置代理 61 self.service.delegate = self; 62 63 //开启定位 64 [self.service startUserLocationService]; 65 66 67 // Do any additional setup after loading the view, typically from a nib. 68 } 69 70 #pragma mark -------BMKLocationServiceDelegate 71 72 73 /** 74 *用户位置更新后,会调用此函数 75 *@param userLocation 新的用户位置 76 */ 77 - (void)didUpdateBMKUserLocation:(BMKUserLocation *)userLocation { 78 79 80 //展示定位 81 self.mapView.showsUserLocation = YES; 82 83 //更新位置数据 84 [self.mapView updateLocationData:userLocation]; 85 86 //获取用户的坐标 87 self.mapView.centerCoordinate = userLocation.location.coordinate; 88 89 self.mapView.zoomLevel =18; 90 91 92 93 //初始化搜索 94 self.poiSearch =[[BMKPoiSearch alloc] init]; 95 96 97 self.poiSearch.delegate = self; 98 99 100 101 //初始化一个周边云检索对象 102 BMKNearbySearchOption *option = [[BMKNearbySearchOption alloc] init]; 103 104 //索引 默认为0 105 option.pageIndex = 0; 106 107 //页数默认为10 108 option.pageCapacity = 50; 109 110 //搜索半径 111 option.radius = 200; 112 113 //检索的中心点,经纬度 114 option.location = userLocation.location.coordinate; 115 116 //搜索的关键字 117 option.keyword = @"小吃"; 118 119 120 121 //根据中心点、半径和检索词发起周边检索 122 BOOL flag = [self.poiSearch poiSearchNearBy:option]; 123 if (flag) { 124 NSLog(@"搜索成功"); 125 //关闭定位 126 [self.service stopUserLocationService]; 127 } 128 else { 129 130 NSLog(@"搜索失败"); 131 } 132 133 } 134 135 136 #pragma mark -------BMKPoiSearchDelegate 137 /** 138 *返回POI搜索结果 139 *@param searcher 搜索对象 140 *@param poiResult 搜索结果列表 141 *@param errorCode 错误号,@see BMKSearchErrorCode 142 */ 143 - (void)onGetPoiResult:(BMKPoiSearch *)searcher result:(BMKPoiResult *)poiResult errorCode:(BMKSearchErrorCode)errorCode { 144 145 //若搜索成功 146 if (errorCode ==BMK_SEARCH_NO_ERROR) { 147 148 //POI信息类 149 //poi列表 150 for (BMKPoiInfo *info in poiResult.poiInfoList) { 151 152 [self.dataArray addObject:info]; 153 154 //初始化一个点的注释 //只有三个属性 155 BMKPointAnnotation *annotoation = [[BMKPointAnnotation alloc] init]; 156 157 //坐标 158 annotoation.coordinate = info.pt; 159 160 //title 161 annotoation.title = info.name; 162 163 //子标题 164 annotoation.subtitle = info.address; 165 166 //将标注添加到地图上 167 [self.mapView addAnnotation:annotoation]; 168 } 169 } 170 171 172 } 173 174 /** 175 *返回POI详情搜索结果 176 *@param searcher 搜索对象 177 *@param poiDetailResult 详情搜索结果 178 *@param errorCode 错误号,@see BMKSearchErrorCode 179 */ 180 - (void)onGetPoiDetailResult:(BMKPoiSearch *)searcher result:(BMKPoiDetailResult *)poiDetailResult errorCode:(BMKSearchErrorCode)errorCode { 181 182 NSLog(@"%@",poiDetailResult.name); 183 184 } 185 186 187 #pragma mark -------------BMKMapViewDelegate 188 189 /** 190 *根据anntation生成对应的View 191 *@param mapView 地图View 192 *@param annotation 指定的标注 193 *@return 生成的标注View 194 */ 195 - (BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(id<BMKAnnotation>)annotation { 196 197 //如果是注释点 198 if ([annotation isKindOfClass:[BMKPointAnnotation class]]) { 199 200 //根据注释点,创建并初始化注释点视图 201 BMKPinAnnotationView *newAnnotation = [[BMKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"an"]; 202 203 //设置大头针的颜色 204 newAnnotation.pinColor = BMKPinAnnotationColorRed; 205 206 //设置动画 207 newAnnotation.animatesDrop = YES; 208 209 return newAnnotation; 210 211 } 212 213 return nil; 214 } 215 /** 216 *当选中一个annotation views时,调用此接口 217 *@param mapView 地图View 218 *@param views 选中的annotation views 219 */ 220 - (void)mapView:(BMKMapView *)mapView didSelectAnnotationView:(BMKAnnotationView *)view { 221 222 //poi详情检索信息类 223 BMKPoiDetailSearchOption *option = [[BMKPoiDetailSearchOption alloc] init]; 224 225 226 BMKPoiInfo *info = self.dataArray.firstObject; 227 228 //poi的uid,从poi检索返回的BMKPoiResult结构中获取 229 option.poiUid = info.uid; 230 231 /** 232 *根据poi uid 发起poi详情检索 233 *异步函数,返回结果在BMKPoiSearchDelegate的onGetPoiDetailResult通知 234 *@param option poi详情检索参数类(BMKPoiDetailSearchOption) 235 *@return 成功返回YES,否则返回NO 236 */ 237 BOOL flag = [self.poiSearch poiDetailSearch:option]; 238 239 if (flag) { 240 NSLog(@"检索成功"); 241 } 242 else { 243 244 NSLog(@"检索失败"); 245 } 246 247 }
运行效果如下
注意:模拟器是有很多问题的,如果定位不了什么的,都是正常的