iOS百度地图简单使用

作者: 朱凯奇 | 来源:发表于2016-05-18 16:01 被阅读9867次

    百度地图 iOS SDK是一套基于iOS 5.0及以上版本设备的应用程序接口,不仅提供展示地图的基本接口,还提供POI检索、路径规划、地图标注、离线地图、定位、周边雷达等丰富的LBS能力 。

    今天主要介绍以下接口

    1.基础地图
    2.POI检索
    3.定位

    首先配置环境

    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
    }
    

    运行效果入下;


    基本.jpg

    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;
    
    }
    
    

    运行结果

    定位.jpg

    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(@"检索失败");
        }
        
    
    
    }
    

    运行结果

    搜索.jpg

    总结

    百度地图的功能很强大,还有很多检索,都没有写.大家又兴趣可以钻研下,毕竟第三方的接口文档相对比较明了.如有问题,可以留言

    相关文章

      网友评论

      • lulu爱吃肉:楼主 想要一份demo 邮箱地址964997115@qq.com
        多谢大佬
      • b57bc247097e:ios的百度地图定位之后会返回精度值么
      • Bales_chu:我想用百度地图实现传过去一个地理位置比如成都金牛区万达广场 然后能在地图上标注出来

        我是不是要做定位 然后地图的地理位置编码?
      • 863c73f31933:我这边在Xcode8.3的swift3.0下面用iOS7.0.4真机运行,一运行就闪退
      • 863c73f31933:楼上,你们百度地图最低支持到iOS几,现在是用swift开发了嘛?
      • c842763cb42a:旺座现代城:smile:
      • d7261c547c6c:代码一样的,为啥子一直检测失败呢,老哥有遇见一样问题的吗
      • 王小王_2016: 楼主,想咨询下,我这里第一进入软件,检索poi,能进入代理方法,onGetPoiResult,但是提示TIMEOUT,但是退出进程,重新进入软件,就是正常的,为什么啊?
      • 滴答大:你好,请问检索结果中的BMKPoiInfo类为什么城市信息city为nil?
      • 流年划过颜夕:604622757@qq.com demo一份 谢谢啦
      • 余额:可以求一份demo吗
      • 爱吃榴莲的程序员:你好,可以发一个你的DEMO给我的邮箱421891813@qq.com?最近有一个项目是使用百度地图,谢谢!
        bb4cf902bdbc:你好 收到demo了吗 可否给我发一份!! 1304753472@qq.com 谢谢
      • 广益散人:你好 我想分别检索出公交、生活、购物、学校等周边设施。请问该怎么做?另外我发现如果连续执行四次周边检索的方法时,代理方法的执行不是一对一的。执行顺序是先执行四次检索方法,然后连续执行四次数据回调代理方法。
      • 2adbd7dbef1a:给我也发个demo好吗?邮箱是970843360@qq.com
      • 0271fb6f797c:大神,能发下Demo吗?136279559@qq.com,万分感谢 :pray: :pray:
      • 2003cadccffc:能发一下你的 Demo 吗? 我定位之后 不知道为什么 只显示了一个我的位置的蓝色小圆标,但是背景地图没有显示,一片黄色。
      • 44ac717a22c2:为什么自己位置那个蓝色的点不显示啊,是不是少写了什么东西啊
      • 木零落:楼主~ 我用你的代码写完了 不知道为何总是走搜索失败 还想使用下你的demo 邮箱d0ou@163.com 谢谢~
      • 小凡凡520:干货满满
      • 嗲走:地图上添加60个标注(不是大头针,是自定义的图片),地图渲染非常慢,卡顿,有没有解决这个问题的办法呢?
        嗲走:@朱凯奇 研究出来了分享给我哦
        朱凯奇:@嗲走 研究下
      • lihhm:能发个demo吗,为什么我这只显示我的小圆点,地图和其他的都没显示
        朱凯奇:正在发
        lihhm:@朱凯奇 能发下邮箱吗callalx@163.com,谢谢
        朱凯奇:@闭眼看看代码 明天发你
      • 杨空空:你好 有demo吗 最近也在弄这个
        余额:楼主求一份demo啊
        杨空空:@朱凯奇 最后 这个大头针是搜索出来的?
        朱凯奇:@杨空空 代码基本都写出来了
      • 知忧丶:百度地图内存飙升问题如何解决啊
        知忧丶: @朱凯奇 非常感谢,确实使用百度地图时内存会明显上升,不过还会自动下降
        朱凯奇:@死缠烂打的小幸福 模拟器有这个问题,真机不存在内存飙升

      本文标题:iOS百度地图简单使用

      本文链接:https://www.haomeiwen.com/subject/ehjwrttx.html