iOS - 百度地图一(配置、定位和三种地图切换)

一:到百度地图官网 http://lbsyun.baidu.com 下载BaiduMap_IOSSDK_v3,再集成百度地图到应用中,目前下载的是最新版的SDK3.3.2版

iOS - 百度地图一(配置、定位和三种地图切换)_第1张图片
72C65630-16DB-42F5-BA55-02F79EB1FEFE.png

二:下载好之后,将其导入到项目中,再根据文档进行以下操作

iOS - 百度地图一(配置、定位和三种地图切换)_第2张图片
FDAA40AF-646C-4EC7-B284-83621E23479B.png
首先获取密钥 http://lbsyun.baidu.com/apiconsole/key <和项目的bundle ID 相关,所以一个密钥最好只关联一个项目>,得到的AK就是我们所需要的密钥
iOS - 百度地图一(配置、定位和三种地图切换)_第3张图片
D51A5227-7BD4-43B7-8B3D-4B520F8A4DB6.png
需求注意以下事项:
  • 静态库中采用ObjectC++实现,因此需要您保证您工程中至少有一个.mm后缀的源文件(您可以将任意一个.m后缀的文件改名为.mm),或者在工程属性中指定编译方式,即在Xcode的Project -> Edit Active Target -> Build Setting 中找到 Compile Sources As,并将其设置为"Objective-C++"
  • 如果您只在Xib文件中使用了BMKMapView,没有在代码中使用BMKMapView,编译器在链接时不会链接对应符号,需要在工程属性中显式设定:在Xcode的Project -> Edit Active Target -> Build Setting -> Other Linker Flags中添加-ObjC
  • 授权Key的申请:新、旧Key之间不可通用
  • 自v3.2.0起,百度地图iOS SDK全面支持HTTPS,需要广大开发者导入第三方openssl静态库:libssl.a和libcrypto.a(SDK打好的包存放于thirdlib目录下)
    添加方法:在 TARGETS->Build Phases-> Link Binary With Libaries中点击“+”按钮,在弹出的窗口中点击“Add Other”按钮,选择libssl.a和libcrypto.a添加到工程中 。
  • 如果在iOS9中使用了调起百度地图客户端功能,必须在"Info.plist"中进行如下配置,否则不能调起百度地图客户端。
    LSApplicationQueriesSchemes

    baidumap
  • 自iOS SDK v2.5.0起,为了对iOS8的定位能力做兼容,做了相应的修改,开发者在使用过程中注意事项如下:
    需要在info.plist里添加(以下二选一,两个都添加默认使用使用第一个):
    NSLocationWhenInUseUsageDescription ,允许在前台使用时获取GPS的描述
    NSLocationAlwaysUsageDescription ,允许永久使用GPS的描述
  • 在使用Xcode6进行SDK开发过程中,需要在info.plist中添加:Bundle display name ,且其值不能为空(Xcode6新建的项目没有此配置,若没有会造成manager start failed)

三:手动配置.framework形式开发包

  • 导入下载好的SDK

  • 添加额外需要的framework
    CoreLocation.framework和QuartzCore.framework、 OpenGLES.framework、 SystemConfiguration.framework 、
    CoreGraphics.framework、Security.framework、 libsqlite3.0.tbd(xcode7以前为 libsqlite3.0.dylib)、
    CoreTelephony.framework 、libstdc++.6.0.9.tbd(xcode7以前为libstdc++.6.0.9.dylib)。
    (注:后面三个系统库为v2.9.0新增的系统库,使用v2.9.0及以上版本的地图SDK,务必增加导入这3个系统库。)
    添加方式: 在Xcode的Project -> Active Target ->Build Phases ->Link Binary With Libraries,添加这几个系统库即可。

  • 引入头文件(按需引入即可)
    #import //引入base相关所有的头文件
    #import //引入地图功能所有的头文件
    #import //引入检索功能所有的头文件
    #import //引入云检索功能所有的头文件
    #import //引入定位功能所有的头文件
    #import //引入计算工具所有的头文件
    #import //引入周边雷达功能所有的头文件
    #import //只引入所需的单个头文件

四:可以开始开发了。。。

1 > 在AppDelegate里面初始化BMKMapManager
mapManager = [[BMKMapManager alloc] init];
BOOL ret = [mapManager start:@"在此处输入您的授权Key"  generalDelegate:nil];

if (!ret) {
    
    NSLog(@"manager start failed");
}
2 > 创建BMKMapView
  • 在viewDidLoad里面

    //初始化地图
     _mapView = [[BMKMapView alloc] initWithFrame:CGRectMake(0, 0, mapScreenW, mapScreenH)];
     [self.view addSubview:_mapView];
    
  • 地图View的Delegate,此处记得不用的时候需要置nil,否则影响内存的释放

     -(void)viewWillAppear:(BOOL)animated{
    
         [_mapView viewWillAppear];
    
         _mapView.delegate = self;
     }
    
     -(void)viewDidDisappear:(BOOL)animated{
    
        [_mapView viewWillDisappear];
      
         _mapView.delegate = nil;
     }
    
  • 运行程序可以看到如下界面,地图雏形已经有了

iOS - 百度地图一(配置、定位和三种地图切换)_第4张图片
Simulator Screen Shot 2017年6月23日 下午4.26.19.png

五 :接下来实现地图的定位功能

1 > 定位显示类型

目前为止,BMKMapView的定位模式(userTrackingMode)有4种分别是:

  • BMKUserTrackingModeNone :普通定位模式,显示我的位置,我的位置图标和地图都不会旋转
  • BMKUserTrackingModeFollow : 定位跟随模式,我的位置始终在地图中心,我的位置图标会旋转,地图不会旋转
  • BMKUserTrackingModeFollowWithHeading : 定位罗盘模式,我的位置始终在地图中心,我的位置图标和地图都会跟着旋转
  • BMKUserTrackingModeHeading:普通定位+定位罗盘模式,显示我的位置,我的位置始终在地图中心,我的位置图标会旋转,地图不会旋转。即在普通定位模式的基础上显示方向。
2 > 获取位置信息
  • 初始化定位

     _locationService = [[BMKLocationService alloc] init];
     //定位服务Delegate,调用startUserLocationService定位成功后,用此Delegate来获取定位数据
     //(在视图将要消失的方法里置nil)
     _locationService.delegate = self;
     _mapView.showsUserLocation = NO;//先关闭显示的定位图层
     _mapView.userTrackingMode = BMKUserTrackingModeNone;//设置定位的状态
     _mapView.showsUserLocation = YES;//显示定位图层
     [_locationService startUserLocationService];
    
  • 实现定位的代理方法,获取定位数据

    #pragma mark  -- BMKLocationServiceDelegate
    //用户方向更新后,调用此函数
    - (void)didUpdateUserHeading:(BMKUserLocation *)userLocation{
    
       NSLog(@"heading is %@",userLocation.heading);
    
       [_mapView updateLocationData:userLocation];
    
    }
    
    //用户位置更新后,调用此函数
    - (void)didUpdateBMKUserLocation:(BMKUserLocation *)userLocation{
    
      [_mapView updateLocationData:userLocation];
    
  • 打印的是这样的经纬度数据,我们难以明白是具体的哪个地方,所以需要进行地理反编码


    iOS - 百度地图一(配置、定位和三种地图切换)_第5张图片
    C8E85017-FA34-45A8-B552-61531C4B0E80.png
3 > 获取坐标进行地理反编码
  • 初始化地理编码主类

    //初始化地理编码主类,用来查询、返回结果信息
    _geocodesearch = [[BMKGeoCodeSearch alloc] init];
    _geocodesearch.delegate = self;
    
  • 在获取地理坐标位置的代理函数里面更新

    //用户位置更新后,调用此函数
    - (void)didUpdateBMKUserLocation:(BMKUserLocation *)userLocation{
    
        [_mapView updateLocationData:userLocation];
    
        NSLog(@"didUpdateUserLocation lat %f,long %f",userLocation.location.coordinate.latitude,userLocation.location.coordinate.longitude);
    
        //更新当前位置到地图中间
        _mapView.centerCoordinate = userLocation.location.coordinate;
    
        //地理反编码
        BMKReverseGeoCodeOption *reverseGeocodeSearchOption = [[BMKReverseGeoCodeOption alloc]init];
    
        reverseGeocodeSearchOption.reverseGeoPoint = userLocation.location.coordinate;
    
        BOOL flag = [_geocodesearch reverseGeoCode:reverseGeocodeSearchOption];
    
        if(flag){
      
              NSLog(@"反geo检索发送成功");
      
              [_locationService stopUserLocationService];
      
        }else{
      
          NSLog(@"反geo检索发送失败");
      
         }
    
    }
    
  • 地址反编码

    #pragma mark 地理反编码的  --  BMKGeoCodeSearchDelegate
    -(void)onGetReverseGeoCodeResult:(BMKGeoCodeSearch *)searcher result:(BMKReverseGeoCodeResult *)result errorCode:(BMKSearchErrorCode)error{
    
      NSLog(@"address:%@----%@",result.addressDetail,result.address);
    
      //addressDetail:     层次化地址信息
    
      //address:    地址名称
    
      //businessCircle:  商圈名称
    
      // location:  地址坐标
    
      //  poiList:   地址周边POI信息,成员类型为BMKPoiInfo
    
    }
    
    //定位失败
    - (void)didFailToLocateUserWithError:(NSError *)error{
      
            NSLog(@"error:%@",error);
      }
    
  • 定位成功,截图如下


    iOS - 百度地图一(配置、定位和三种地图切换)_第6张图片
    Uploading 2084C3F7-706D-4E73-9E79-7DA7315BD838_075531.png
D52A96B8-C8AF-4BD5-A3AF-E0CEA17E715D.png

六 :接下来实现地图的三种形式的转换

1 > 切换为卫星地图
//切换为卫星图  
 [_mapView setMapType:BMKMapTypeSatellite];
IMG_7857.PNG
2 > 空白地图
//设置地图为空白类型
_mapView.mapType = BMKMapTypeNone;
3 > 标准地图
_mapView.mapType = BMKMapTypeStandard;

你可能感兴趣的:(iOS - 百度地图一(配置、定位和三种地图切换))