全球定位(单次/连续)
功能场景
本示例展示了在设备连续定位的同时,用户通过操作界面主动获取一次当前位置的场景,例如外勤人员在外业过程中到达某一地点时进行打卡。基于百度地图全球定位服务,这一功能在国内外都可适用。
//mapopen-website-wiki.bj.bcebos.com/demos/全球定位.mov
setOnceLocation(boolean isOnceLocation)
设置是否进行单次定位,单次定位时调用start之后会默认返回一次定位结果
setScanSpan(int scanSpan)
连续定位时间间隔,单位是毫秒 当<1000(1s)时,定时定位无效
setLocOption(LocationClientOption locOption)
LocationClient locClientOne = new LocationClient(this);
LocationClient locClientContinuoue = new LocationClient(this);
private BDAbstractLocationListener oneLocationListener = new BDAbstractLocationListener() {
@Override
public void onReceiveLocation(BDLocation location) {
}
}
locClientOne.registerLocationListener(oneLocationListener);
复制成功
private BDAbstractLocationListener continuoueLocationListener = new BDAbstractLocationListener() {
@Override
public void onReceiveLocation(BDLocation location) {
}
}
locClientContinuoue.registerLocationListener(continuoueLocationListener);
复制成功
LocationClientOption locationClientOption = new LocationClientOption();
// 可选,设置定位模式,默认高精度 LocationMode.Hight_Accuracy:高精度;
locationClientOption.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
/// 设置是否进行单次定位,单次定位时调用start之后会默认返回一次定位结果
locationClientOption.setOnceLocation(true);
// 设置定位参数
locClientOne.setLocOption(locationClientOption);
// 开启定位
locClientOne.start();
复制成功
LocationClientOption locationClientOption = new LocationClientOption();
// 如果设置为0,则代表单次定位,即仅定位一次,默认为0
// 如果设置非0,需设置1000ms以上才有效
locationClientOption.setScanSpan(1000);
// 设置定位参数
locClientContinuoue.setLocOption(locationClientOption);
// 开启定位
locClientContinuoue.start();
复制成功
//mapopen-website-wiki.bj.bcebos.com/demos/iosVideos/location/全球定位@1x.mp4
-(BOOL)requestLocationWithReGeocode:(BOOL)withReGeocode withNetworkState:(BOOL)withNetWorkState completionBlock:(BMKLocatingCompletionBlock _Nonnull)completionBlock;
单次定位请求,定位结果通过Block回调。
如果当前正在连续定位,调用此方法将会失败,返回NO
- (void)startUpdatingLocation;
- (void)stopUpdatingLocation;
-(void)BMKLocationManager:(BMKLocationManager * _Nonnull)manager didUpdateLocation:(BMKLocation * _Nullable)location orError:(NSError * _Nullable)error;
分别创建单次、连续定位管理类,这样可以有效的区分定位结果是来自持续定位还是来自单次定位。
// 创建单次定位管理类:
_coldLocationManager = [[BMKLocationManager alloc] init];
// 创建连续定位管理类:
_hotLocationManager = [[BMKLocationManager alloc] init];
复制成功
_coldLocationManager = [[BMKLocationManager alloc] init];
// 设置返回位置的坐标系类型
_coldLocationManager.coordinateType = BMKLocationCoordinateTypeBMK09LL;
// 设置距离过滤参数
_coldLocationManager.distanceFilter = kCLDistanceFilterNone;
// 设置预期精度参数
_coldLocationManager.desiredAccuracy = kCLLocationAccuracyBest;
// 设置应用位置类型
_coldLocationManager.activityType = CLActivityTypeAutomotiveNavigation;
// 设置是否自动停止位置更新
_coldLocationManager.pausesLocationUpdatesAutomatically = NO;
// 设置位置获取超时时间
_coldLocationManager.locationTimeout = 10;
// 设置获取地址信息超时时间
_coldLocationManager.reGeocodeTimeout = 10;
// 设置delegate
_coldLocationManager.delegate = self;
复制成功
// 开始单次定位
[self.coldLocationManager requestLocationWithReGeocode:YES withNetworkState:YES completionBlock:^(BMKLocation * _Nullable location, BMKLocationNetworkState state, NSError * _Nullable error) {
// 定位失败返回错误信息
if (error) {
NSLog(@"locError:{%zd -%@};", error.code, error.localizedDescription);
return;
}
// 定位成功返回位置信息
if (location) {
}
];
// 开始连续定位
[self.hotLocationManager startUpdatingLocation];
连续定位结果通过BMKLocationManagerDelegate代理方法返回
/// 连续定位回调函数
- (void)BMKLocationManager:(BMKLocationManager *)manager didUpdateLocation:(BMKLocation *)location orError:(NSError *)error {
// 定位失败返回错误信息
if (error) {
NSLog(@"locError:{%zd -%@};", error.code, error.localizedDescription);
return;
}
// 定位成功返回位置信息
if (location) {
}
}
复制成功
4.停止连续定位。单次定位会在定位结果返回后自动停止,单次定位结果返回之前也可通过
-(void)stopUpdatingLocation;方法取消。
[self.hotLocationManager stopUpdatingLocation];
复制成功