iOS百度地图简单使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS百度地图简单使用相关的知识,希望对你有一定的参考价值。

本文介绍三种接口:

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 }

运行效果如下

技术分享

注意:模拟器是有很多问题的,如果定位不了什么的,都是正常的

以上是关于iOS百度地图简单使用的主要内容,如果未能解决你的问题,请参考以下文章

什么是百度地图android sdk

iOS 百度坐标、GPS坐标、 高德坐标相互转换

百度地图API之如何制作驾车导航

iOS应用内跳转百度高德苹果地图

使用百度地图API查地理坐标

安卓不使用第三方SDK怎么开发街景地图