定位的展示与定位的获取方式无关。展示定位功能位于“基础地图(Map)”功能模块。 控制定位展示的核心代码如下:
//以下_mapView为BMKMapView对象 //显示定位图层 _mapView.showsUserLocation = YES;
//显示定位图层 mapView?.showsUserLocation = true
效果图如下:
iOS地图SDK 4.2.0版本后不再提供Location定位组件,百度地图开放平台在系统定位基础之上,为广大开发者全新提供了iOS端独立的定位SDK产品, 欢迎广大开发者的使用。 在定位SDK的定位结果回调方法中,调用地图SDK的相应方法,更新地图上展示的定位图标的位置和朝向等显示效果,具体核心代码如下:(完整代码请参考Demo中的BMKLocationModePage)
@property (nonatomic, strong) BMKUserLocation *userLocation; //当前位置对象 //由于以下代理方法中分别且仅只返回heading或location信息,请开发者务必将该对象定义为全局类型,避免在以下回调用使用局部的BMKUserLocation对象,导致出现定位显示错误位置的情况。 // 定位SDK中,方向变更的回调 - (void)BMKLocationManager:(BMKLocationManager *)manager didUpdateHeading:(CLHeading *)heading { if (!heading) { return; } if (!self.userLocation) { self.userLocation = [[BMKUserLocation alloc] init]; } self.userLocation.heading = heading; [self.mapView updateLocationData:self.userLocation]; } // 定位SDK中,位置变更的回调 - (void)BMKLocationManager:(BMKLocationManager *)manager didUpdateLocation:(BMKLocation *)location orError:(NSError *)error { if (error) { NSLog(@"locError:{%ld - %@};", (long)error.code, error.localizedDescription); } if (!location) { return; } if (!self.userLocation) { self.userLocation = [[BMKUserLocation alloc] init]; } self.userLocation.location = location.location; [self.mapView updateLocationData:self.userLocation]; }
//MARK:BMKLocationManagerDelegate /** @brief 该方法为BMKLocationManager提供设备朝向的回调方法 @param manager 提供该定位结果的BMKLocationManager类的实例 @param heading 设备的朝向结果 */ func bmkLocationManager(_ manager: BMKLocationManager, didUpdate heading: CLHeading?) { NSLog("用户方向更新") userLocation.heading = heading mapView.updateLocationData(userLocation) } /** @brief 连续定位回调函数 @param manager 定位 BMKLocationManager 类 @param location 定位结果,参考BMKLocation @param error 错误信息。 */ func bmkLocationManager(_ manager: BMKLocationManager, didUpdate location: BMKLocation?, orError error: Error?) { if let _ = error?.localizedDescription { NSLog("locError:%@;", (error?.localizedDescription)!) } userLocation.location = location?.location //实现该方法,否则定位图标不出现 mapView.updateLocationData(userLocation) } /** @brief 当定位发生错误时,会调用代理的此方法 @param manager 定位 BMKLocationManager 类 @param error 返回的错误,参考 CLError */ func bmkLocationManager(_ manager: BMKLocationManager, didFailWithError error: Error?) { NSLog("定位失败") }
其他定位相关的开发指南,请参考iOS定位SDK文档。 注意:iOS定位SDK返回纬度默认为国测局坐标系BMKLocationCoordinateTypeGCJ02,iOS地图SDK默认全局坐标系为百度坐标系BMKLocationCoordinateTypeBMK09LL
BMKMapView的定位模式(userTrackingMode)有4种。
普通定位模式
显示我的位置,我的位置图标和地图都不会旋转
_mapView.userTrackingMode = BMKUserTrackingModeNone;
mapView?.userTrackingMode = BMKUserTrackingModeNone
效果如下图:
定位方向模式
显示我的位置,我的位置图标会旋转,地图不会旋转
_mapView.userTrackingMode = BMKUserTrackingModeHeading;
mapView?.userTrackingMode = BMKUserTrackingModeHeading
效果如下图:
定位跟随模式
我的位置始终在地图中心,我的位置图标会旋转,地图不会旋转
_mapView.userTrackingMode = BMKUserTrackingModeFollow;
mapView?.userTrackingMode = BMKUserTrackingModeFollow
效果如下图:
定位罗盘模式
我的位置始终在地图中心,我的位置图标和地图都会跟着旋转
_mapView.userTrackingMode = BMKUserTrackingModeFollowWithHeading;
mapView?.userTrackingMode = BMKUserTrackingModeFollowWithHeading
效果如下图:
BMKLocationViewDisplayParam类提供了定位图层的配置项,可以通过BMKMapView的updateLocationViewWithParam方法自定义定位图层,代码示例如下:
// self.mapView是BMKMapView对象 BMKLocationViewDisplayParam *param = [[BMKLocationViewDisplayParam alloc] init]; //根据配置参数更新定位图层样式 [self.mapView updateLocationViewWithParam:param];
let param: BMKLocationViewDisplayParam = BMKLocationViewDisplayParam.init() //根据配置参数更新定位图层样式 mapView.updateLocationView(with: param)
定位图标设置
//定位图标名称,需要将该图片放到 mapapi.bundle/images 目录下 param.locationViewImgName = @"icon_nav_bus"; //用户自定义定位图标,V4.2.1以后支持 param.locationViewImage = [UIImage imageNamed:@"location.png"];
//定位图标名称,需要将该图片放到 mapapi.bundle/images 目录下 param.locationViewImgName = "icon_nav_bus" //用户自定义定位图标,V4.2.1以后支持 param.locationViewImage = UIImage(named: "location.png")
效果图如下:
Since 6.5.7 iOS地图SDK新增整体自定义和箭头模式自定义,支持gif动画。
新增接口:
旧接口:只支持全局整体设置图标 /// 用户自定义定位图标,V4.2.1以后支持 @property (nonatomic, strong) UIImage *locationViewImage; 新增接口: ///是否是定位图标箭头模式自定义,YES:箭头模式自定义, NO:整体自定义,默认NO @property (nonatomic, assign) BOOL isLocationArrowModeCustom; /* 以下为定位图标整体自定义,自定义图片和gif图二选一,Gif图优先级大于图片*/ ///新版用户自定义定位图标,since 6.5.7 @property (nonatomic, strong) UIImage *locationViewImageNew; ///定位图标整体自定义gif图文件路径,since 6.5.7 @property (nonatomic, copy) NSString *locationViewGifImageFilePath; ///定位图标整体自定义大小缩放系数,默认为1,可设置范围0.5~2.0,基于固定尺寸CGSizeMake(30, 30)缩放,since 6.5.7 @property (nonatomic, assign) CGFloat locationViewImageSizeScale; /// 定位图标整体样式自定义呼吸效果,默认为NO,since 6.5.7 @property (nonatomic, assign) BOOL breatheEffectOpenForWholeStyle; /* 以下为箭头模式定位图标自定义,可分别自定义中心圆点图片和箭头图片,中心图标自定义图片和gif图二选一,Gif图优先级大于图片*/ ///箭头模式定位图标中心图片,无方向,since 6.5.7 @property (nonatomic, strong) UIImage *locationViewCenterImage; ///箭头模式定位图标中心圆点gif图文件路径,无方向,since 6.5.7 @property (nonatomic, copy) NSString *locationViewCenterGifImageFilePath; ///箭头模式定位图标中心圆点图片大小缩放系数,默认为1,可设置范围0.5~2.0,基于固定尺寸CGSizeMake(30, 30)缩放,since 6.5.7 @property (nonatomic, assign) CGFloat locationViewCenterImageSizeScale; ///箭头模式定位图标周边箭头轮廓图片,箭头向上为正,since 6.5.7 @property (nonatomic, strong) UIImage *locationViewAroundArrowsImage; ///箭头模式定位图标周边箭头轮廓图片大小缩放系数,默认为1,可设置范围0.2~3.0,基于图片大小缩放,since 6.5.7 @property (nonatomic, assign) CGFloat locationViewAroundArrowsImageSizeScale; /// 箭头样式定位图标呼吸效果,默认为YES,since 6.5.7 @property (nonatomic, assign) BOOL breatheEffectOpenForArrowsStyle;
1.整体自定义图标
param.locationViewImageNew = [UIImage imageNamed:@"icon_car"];
https://mapopen-pub-iossdk.cdn.bcebos.com/map/v6_5_7/location_1.MP4
2.整体自定义GIF
param.locationViewGifImageFilePath = [NSString stringWithFormat:@"%@/6.gif", [NSBundle mainBundle].resourcePath]; param.locationViewImageSizeScale = 2;
https://mapopen-pub-iossdk.cdn.bcebos.com/map/v6_5_7/location_2.MP4
3.箭头模式图标(注:1.剪头模式不适合普通定位方式(只展示中心自定义图片,不展示箭头),仅适用于方向、跟随、罗盘方式 2.中心图片不旋转 3.默认有向内呼吸效果)
param.isLocationArrowModeCustom = YES; param.locationViewCenterImage = [UIImageimageNamed:@"icon_car"]; param.locationViewCenterImageSizeScale = 1.5; param.locationViewAroundArrowsImageScale = 3; param.locationViewAroundArrowsImage = [UIImageimageNamed:@"loc_cur_outdot"];
https://mapopen-pub-iossdk.cdn.bcebos.com/map/v6_5_7/location_3.MP4
4.箭头模式GIF(注:1.剪头模式不适合普通定位方式(只展示中心自定义图片,不展示箭头),仅适用于方向、跟随、罗盘方式 2.中心GIF不旋转 3.默认有向内呼吸效果)
param.isLocationArrowModeCustom = YES; param.locationViewCenterGifImageFilePath = [NSString stringWithFormat:@"%@/6.gif", [NSBundle mainBundle].resourcePath]; param.locationViewCenterImageSizeScale = 1.5; param.locationViewAroundArrowsImageScale = 3; param.locationViewAroundArrowsImage = [UIImageimageNamed:@"loc_cur_outdot"];
https://mapopen-pub-iossdk.cdn.bcebos.com/map/v6_5_7/location_4.MP4
5.无呼吸效果(默认YES,不适合普通定位方式,仅适用于方向、跟随、罗盘方式 )
param.isLocationArrowModeCustom = YES; param.locationViewCenterGifImageFilePath = [NSString stringWithFormat:@"%@/6.gif", [NSBundle mainBundle].resourcePath]; param.locationViewCenterImageSizeScale = 1.5; param.locationViewAroundArrowsImageScale = 3; param.locationViewAroundArrowsImage = [UIImageimageNamed:@"loc_cur_outdot"]; param.breatheEffectOpenForArrowsStyle = NO;
https://mapopen-pub-iossdk.cdn.bcebos.com/map/v6_5_7/location_5.MP4
精度圈设置
//设置显示精度圈,默认YES param.isAccuracyCircleShow = YES; //精度圈 边框颜色 param.accuracyCircleStrokeColor = [UIColor colorWithRed:1 green:0 blue:0 alpha:0.5]; //精度圈 填充颜色 param.accuracyCircleFillColor = [UIColor colorWithRed:0 green:1 blue:0 alpha:0.3];
//设置显示精度圈,默认YES param.isAccuracyCircleShow = true //精度圈 边框颜色 param.accuracyCircleStrokeColor = UIColor(red: 1, green: 0, blue: 0, alpha: 0.5) //精度圈 填充颜色 param.accuracyCircleFillColor = UIColor(red: 0, green: 1, blue: 0, alpha: 0.3)
效果如下图: