定位的展示与定位的获取方式无关。展示定位功能位于“基础地图(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")
效果图如下:
精度圈设置
//设置显示精度圈,默认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)
效果如下图: