iOS百度地图简单使用详解
百度地图 ios sdk是一套基于ios 5.0及以上版本设备的应用程序接口,不仅提供展示地图的基本接口,还提供poi检索、路径规划、地图标注、离线地图、定位、周边雷达等丰富的lbs能力 。
今天主要介绍以下接口
- 基础地图
- poi检索
- 定位
首先配置环境
1.自动配置.framework形式开发包(使用cocoapods)<推荐>
2.手动配置.framework形式开发包
特别注意:
(api里有很多注意点,大家可以具体去看.但是我说的后两点少其中一个都会失败,第一点是有需求的话,必须加上)
1、如果在ios9中使用了调起百度地图客户端功能,必须在"info.plist"中进行如下配置,否则不能调起百度地图客户端。
<key>lsapplicationqueriesschemes</key> <array> <string>baidumap</string> </array>
2、自ios sdk v2.5.0起,为了对ios8的定位能力做兼容,需要在info.plist里添加(以下二选一,两个都添加默认使用 nslocationwheninuseusagedescription):
nslocationwheninuseusagedescription ,允许在前台使用时获取gps的描述
nslocationalwaysusagedescription ,允许永久使用gps的描述
3、在使用xcode6进行sdk开发过程中,需要在info.plist中添加:bundle display name ,且其值不能为空(xcode6新建的项目没有此配置,若没有会造成manager start fail
配置完成后
appdelegate.m文件中添加对bmkmapmanager的初始化,并填入申请的授权key
#import "appdelegate.h" #import <baidumapapi_base/bmkmapmanager.h> @interface appdelegate () @end @implementation appdelegate - (bool)application:(uiapplication *)application didfinishlaunchingwithoptions:(nsdictionary *)launchoptions { //创建并初始化一个引擎对象 bmkmapmanager *manager = [[bmkmapmanager alloc] init]; //启动地图引擎 bool success = [manager start:@"zbwlngrurtp9cvb5ez6gzpnebljmyylo" generaldelegate:nil]; if (!success) { nslog(@"失败"); } // override point for customization after application launch. return yes; }
1.基础地图
#import "viewcontroller.h" #import <baidumapapi_map/bmkmapview.h> @interface viewcontroller ()<bmkmapviewdelegate> @property (nonatomic,strong) bmkmapview *mapview;//地图视图 @end @implementation viewcontroller - (void)viewdidload { [super viewdidload]; //初始化地图 self.mapview = [[bmkmapview alloc] initwithframe:self.view.frame]; self.mapview.delegate =self; //设置地图的显示样式 self.mapview.maptype = bmkmaptypesatellite;//卫星地图 //设定地图是否打开路况图层 self.mapview.trafficenabled = yes; //底图poi标注 self.mapview.showmappoi = no; //在手机上当前可使用的级别为3-21级 self.mapview.zoomlevel = 21; //设定地图view能否支持旋转 self.mapview.rotateenabled = no; //设定地图view能否支持用户移动地图 self.mapview.scrollenabled = no; //添加到view上 [self.view addsubview:self.mapview]; //还有很多属性,根据需求查看api }
运行效果入下;
2.定位
#import "viewcontroller.h" #import <baidumapapi_map/bmkmapview.h> #import <baidumapapi_location/bmklocationservice.h> @interface viewcontroller ()<bmklocationservicedelegate,bmkmapviewdelegate> @property (nonatomic,strong) bmkmapview *mapview;//地图视图 @property (nonatomic,strong) bmklocationservice *service;//定位服务 @end @implementation viewcontroller - (void)viewdidload { [super viewdidload]; //初始化地图 self.mapview = [[bmkmapview alloc] initwithframe:self.view.frame]; self.mapview.delegate =self; //添加到view上 [self.view addsubview:self.mapview]; //初始化定位 self.service = [[bmklocationservice alloc] init]; //设置代理 self.service.delegate = self; //开启定位 [self.service startuserlocationservice]; // do any additional setup after loading the view, typically from a nib. } #pragma mark -------bmklocationservicedelegate /** *用户位置更新后,会调用此函数 *@param userlocation 新的用户位置 */ - (void)didupdatebmkuserlocation:(bmkuserlocation *)userlocation { //展示定位 self.mapview.showsuserlocation = yes; //更新位置数据 [self.mapview updatelocationdata:userlocation]; //获取用户的坐标 self.mapview.centercoordinate = userlocation.location.coordinate; self.mapview.zoomlevel =18; }
运行结果
poi检索
#import "viewcontroller.h" #import <baidumapapi_map/bmkmapview.h> #import <baidumapapi_location/bmklocationservice.h> #import <baidumapapi_search/bmkpoisearch.h> #import <baidumapapi_map/bmkannotation.h> #import <baidumapapi_map/bmkpointannotation.h> #import <baidumapapi_map/bmkpinannotationview.h> #define kwidth [uiscreen mainscreen].bounds.size.width @interface viewcontroller ()<bmklocationservicedelegate,bmkpoisearchdelegate,bmkmapviewdelegate> @property (nonatomic,strong) bmkmapview *mapview;//地图视图 @property (nonatomic,strong) bmklocationservice *service;//定位服务 @property (nonatomic,strong) bmkpoisearch *poisearch;//搜索服务 @property (nonatomic,strong) nsmutablearray *dataarray; @end @implementation viewcontroller - (nsmutablearray *)dataarray { if (!_dataarray) { _dataarray = [nsmutablearray array]; } return _dataarray; } - (void)viewdidload { [super viewdidload]; //初始化地图 self.mapview = [[bmkmapview alloc] initwithframe:self.view.frame]; self.mapview.delegate =self; // //设置地图的显示样式 // self.mapview.maptype = bmkmaptypesatellite;//卫星地图 // // //设置路况 // self.mapview.trafficenabled = yes; // // //底图poi标注 // self.mapview.showmappoi = no; // // //在手机上当前可使用的级别为3-21级 // self.mapview.zoomlevel = 21; // // //旋转 // self.mapview.rotateenabled = no; // // //拖拽 // self.mapview.scrollenabled = no; // [self.view addsubview:self.mapview]; //初始化定位 self.service = [[bmklocationservice alloc] init]; //设置代理 self.service.delegate = self; //开启定位 [self.service startuserlocationservice]; // do any additional setup after loading the view, typically from a nib. } #pragma mark -------bmklocationservicedelegate /** *用户位置更新后,会调用此函数 *@param userlocation 新的用户位置 */ - (void)didupdatebmkuserlocation:(bmkuserlocation *)userlocation { //展示定位 self.mapview.showsuserlocation = yes; //更新位置数据 [self.mapview updatelocationdata:userlocation]; //获取用户的坐标 self.mapview.centercoordinate = userlocation.location.coordinate; self.mapview.zoomlevel =18; //初始化搜索 self.poisearch =[[bmkpoisearch alloc] init]; self.poisearch.delegate = self; //初始化一个周边云检索对象 bmknearbysearchoption *option = [[bmknearbysearchoption alloc] init]; //索引 默认为0 option.pageindex = 0; //页数默认为10 option.pagecapacity = 50; //搜索半径 option.radius = 200; //检索的中心点,经纬度 option.location = userlocation.location.coordinate; //搜索的关键字 option.keyword = @"小吃"; //根据中心点、半径和检索词发起周边检索 bool flag = [self.poisearch poisearchnearby:option]; if (flag) { nslog(@"搜索成功"); //关闭定位 [self.service stopuserlocationservice]; } else { nslog(@"搜索失败"); } } #pragma mark -------bmkpoisearchdelegate /** *返回poi搜索结果 *@param searcher 搜索对象 *@param poiresult 搜索结果列表 *@param errorcode 错误号,@see bmksearcherrorcode */ - (void)ongetpoiresult:(bmkpoisearch *)searcher result:(bmkpoiresult *)poiresult errorcode:(bmksearcherrorcode)errorcode { //若搜索成功 if (errorcode ==bmk_search_no_error) { //poi信息类 //poi列表 for (bmkpoiinfo *info in poiresult.poiinfolist) { [self.dataarray addobject:info]; //初始化一个点的注释 //只有三个属性 bmkpointannotation *annotoation = [[bmkpointannotation alloc] init]; //坐标 annotoation.coordinate = info.pt; //title annotoation.title = info.name; //子标题 annotoation.subtitle = info.address; //将标注添加到地图上 [self.mapview addannotation:annotoation]; } } } /** *返回poi详情搜索结果 *@param searcher 搜索对象 *@param poidetailresult 详情搜索结果 *@param errorcode 错误号,@see bmksearcherrorcode */ - (void)ongetpoidetailresult:(bmkpoisearch *)searcher result:(bmkpoidetailresult *)poidetailresult errorcode:(bmksearcherrorcode)errorcode { nslog(@"%@",poidetailresult.name); } #pragma mark -------------bmkmapviewdelegate /** *根据anntation生成对应的view *@param mapview 地图view *@param annotation 指定的标注 *@return 生成的标注view */ - (bmkannotationview *)mapview:(bmkmapview *)mapview viewforannotation:(id<bmkannotation>)annotation { //如果是注释点 if ([annotation iskindofclass:[bmkpointannotation class]]) { //根据注释点,创建并初始化注释点视图 bmkpinannotationview *newannotation = [[bmkpinannotationview alloc] initwithannotation:annotation reuseidentifier:@"an"]; //设置大头针的颜色 newannotation.pincolor = bmkpinannotationcolorred; //设置动画 newannotation.animatesdrop = yes; return newannotation; } return nil; } /** *当选中一个annotation views时,调用此接口 *@param mapview 地图view *@param views 选中的annotation views */ - (void)mapview:(bmkmapview *)mapview didselectannotationview:(bmkannotationview *)view { //poi详情检索信息类 bmkpoidetailsearchoption *option = [[bmkpoidetailsearchoption alloc] init]; bmkpoiinfo *info = self.dataarray.firstobject; //poi的uid,从poi检索返回的bmkpoiresult结构中获取 option.poiuid = info.uid; /** *根据poi uid 发起poi详情检索 *异步函数,返回结果在bmkpoisearchdelegate的ongetpoidetailresult通知 *@param option poi详情检索参数类(bmkpoidetailsearchoption) *@return 成功返回yes,否则返回no */ bool flag = [self.poisearch poidetailsearch:option]; if (flag) { nslog(@"检索成功"); } else { nslog(@"检索失败"); } }
运行结果
总结
百度地图的功能很强大,还有很多检索,都没有写.大家又兴趣可以钻研下,毕竟第三方的接口文档相对比较明了.以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。