百度地图定位的封装得到用户所在省份、城市、街道信息。

##准备工作 导入百度地图SDK (需要的是定位功能和检索功能的SDK)

##搞起

为了方便在多个页面调用 我们可以写一个单例。 新建一个类继承自 NSObject

上代码:.h文件

//定位成功的回调 包含海拔 经纬度信息
typedef void(^AFuserLocationCompletion)(BMKUserLocation *userLocation);
//实际的位置信息 省 市
typedef void(^AFReverseGeoCodeResultCompletion)(BMKGeoCodeSearch *searcher,BMKReverseGeoCodeResult *result,BMKSearchErrorCode error);

@interface AFMapManager : NSObject<BMKLocationServiceDelegate,BMKGeoCodeSearchDelegate>{
    BMKLocationService *_locService;
    BMKGeoCodeSearch *_searcher;
    AFuserLocationCompletion _locationCompletion;
    AFReverseGeoCodeResultCompletion _ResultCompletion;
}

+ (AFMapManager *)manager;
//获得经纬度
- (void)af_startUserLocationServiceWithCompletion:(AFuserLocationCompletion)completion;
//根据经纬度 获得具体地址
- (void)af_getAddressWithuserLocation:(BMKUserLocation *)userLocation
                           Completion:(AFReverseGeoCodeResultCompletion)completion;

复制代码

注意要导入百度地图的头文件

#import <BaiduMapAPI_Location/BMKLocationComponent.h>//引入定位功能所有的头文件
#import <BaiduMapAPI_Search/BMKSearchComponent.h>//引入检索功能所有的头文件
复制代码

好吧稍微讲解一下:

定义两个方法。

//获得经纬度
- (void)af_startUserLocationServiceWithCompletion:(AFuserLocationCompletion)completion;
复制代码

第一个方法的作用是获得BMKUserLocation 的一个对象。 其中包含经纬度、海拔等一些信息。 我们下面的方法要根据经纬度获取用户的具体地址信息。

//根据经纬度 获得具体地址
- (void)af_getAddressWithuserLocation:(BMKUserLocation *)userLocation
                           Completion:(AFReverseGeoCodeResultCompletion)completion;
复制代码

第二个方法就是得到具体的省份、城市等信息了。

看一下.m里面的实现

@implementation AFMapManager
+ (AFMapManager *)manager{
    static AFMapManager *manager = nil;
    AFDISPATCH_ONCE_BLOCK(^{
        if (!manager) {
            manager = [[[self class] alloc] init];
        }
    })
    return manager;
}


- (instancetype)init{
    if (self == [super init]) {
        _searcher = [[BMKGeoCodeSearch alloc]init];
        _searcher.delegate = self;
        _locService = [[BMKLocationService alloc] init];
        _locService.delegate = self;
    }
    return self;
}


- (void)af_startUserLocationServiceWithCompletion:(AFuserLocationCompletion)completion{
    _locationCompletion = [completion copy];

    [_locService startUserLocationService];
}

- (void)af_getAddressWithuserLocation:(BMKUserLocation *)userLocation Completion:(AFReverseGeoCodeResultCompletion)completion{
    _ResultCompletion = [completion copy];

    //发起反地理编码
    CLLocationCoordinate2D pt = (CLLocationCoordinate2D){userLocation.location.coordinate.latitude, userLocation.location.coordinate.longitude};
    //逆向编码对象
    BMKReverseGeoCodeOption *reverseGeocodeSearchOption = [[BMKReverseGeoCodeOption alloc]init];
    //设置需要转化的经纬度
    reverseGeocodeSearchOption.reverseGeoPoint = pt;
    //发送逆向地理编码--》会回调 onGetReverseGeoCodeResult
    BOOL flag = [_searcher reverseGeoCode:reverseGeocodeSearchOption];
    if(flag)
    {
        NSLog(@"反geo检索发送成功");
    }
    else
    {
        NSLog(@"反geo检索发送失败");
    }
    
}

#pragma mark - BMKLocationServiceDelegate  

- (void)willStartLocatingUser {
    NSLog(@"location start");
    return;
}

/**
 *在停止定位后,会调用此函数
 */
- (void)didStopLocatingUser {
    NSLog(@"user location stop");
    return;
}

/**
 *用户方向更新后,会调用此函数
 *@param userLocation 新的用户位置
 */
- (void)didUpdateUserHeading:(BMKUserLocation *)userLocation {
    //NSLog(@"user derection change");
    return;
}

/**
 *用户位置更新后,会调用此函数
 *@param userLocation 新的用户位置
 */
// 地理位置变更信息
- (void)didUpdateBMKUserLocation:(BMKUserLocation *)userLocation{
    NSLog(@"didUpdateUserLocation lat %f,long %f",
          userLocation.location.coordinate.latitude,
          userLocation.location.coordinate.longitude);
    
    if (_locationCompletion) {
        _locationCompletion(userLocation);
    }
    
    [_locService stopUserLocationService];
    return;
}


/**
 *定位失败后,会调用此函数
 *@param error 错误号
 */
- (void)didFailToLocateUserWithError:(NSError *)error {
    NSLog(@"定位失败");
    if (_locationCompletion) {
        _locationCompletion(nil);
    }
    
    [_locService stopUserLocationService];
    return;  
}

#pragma - 反向地理编码回调
-(void)onGetReverseGeoCodeResult:(BMKGeoCodeSearch *)searcher result:(BMKReverseGeoCodeResult *)result errorCode:(BMKSearchErrorCode)error
{
    if (_ResultCompletion) {
        _ResultCompletion(searcher,result,error);
    }
}


@end
复制代码

使用方法

在需要定位到地址的文件里面导入头文件

#import "AFMapManager.h"
复制代码

开始定位

    [[AFMapManager manager] af_startUserLocationServiceWithCompletion:^(BMKUserLocation *userLocation) {
        [[AFMapManager manager] af_getAddressWithuserLocation:userLocation Completion:^(BMKGeoCodeSearch *searcher, BMKReverseGeoCodeResult *result, BMKSearchErrorCode error) {
            NSLog(@"地址是 >>%@",result.address);
       }];
    }];
复制代码

这样就可以得到用户的地址了。 省、市、街道的信息也可以单独取出来。

/// 城市名称
result.addressDetail.city;
/// 区县名称
result.addressDetail.district
/// 省份名称
result.addressDetail.province//
/// 街道名称
result.addressDetail.streetName//
/// 街道号码
result.addressDetail.streetNumber//
复制代码

有兴趣的话可以了解一下 BMKReverseGeoCodeResult 这个类

///反地址编码结果
@interface BMKReverseGeoCodeResult : NSObject
{
	BMKAddressComponent* _addressDetail;
	NSString* _address;
	CLLocationCoordinate2D _location;
	NSArray* _poiList;
}
///层次化地址信息
@property (nonatomic, strong) BMKAddressComponent* addressDetail;
///地址名称
@property (nonatomic, strong) NSString* address;
///商圈名称
@property (nonatomic, strong) NSString* businessCircle;
///地址坐标
@property (nonatomic) CLLocationCoordinate2D location;
///地址周边POI信息,成员类型为BMKPoiInfo
@property (nonatomic, strong) NSArray* poiList;

复制代码

代码地址:https://github.com/AlwaysYang/AFMapManager

转载于:https://juejin.im/post/5a31d57651882531926eba4d

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值