定位开发与百度地图的封装

整理了一下项目中的定位功能,对百度地图的封装总结记录一下
首先通过CocoaPods引入百度 pod ‘BaiduMapKit’
然后为了更方便的在项目中使用它,对其中BMKMapManager这个类进行继承封装
在这个继承类LocManager中,进行一系列的操作:


1.设置全局访问点

+ (instancetype)shared
{
    static LocManager *instance;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance = [[LocManager alloc] init];
    });

    return instance;
}

2.申请百度地图key,进行授权,由于继承自BMKMapManager,所以可以在类中自由的使用其中的方法

//设置key。开启授权坚定
-(void)setBaiduKey
{
    BOOL ret = [self start:baiduKey generalDelegate:self];
    if (!ret) {
        JKLog(@"manager start failed!");
    }
}

3.判断是否授权成功,回调出去,对成功或失败做具体的操作

/**
 *返回授权验证错误
 *@param iError 错误号 : 为0时验证通过,具体参加BMKPermissionCheckResultCode
 */
- (void)onGetPermissionState:(int)iError
{
    if (iError == 0)
    {
        NSLog(@"授权验证成功");
        if (self.BMKPermissionsStateBlock)
        {
            self.BMKPermissionsStateBlock(YES);
        }
    }else{
        NSLog(@"授权验证gg");
        if (self.BMKPermissionsStateBlock)
        {
            self.BMKPermissionsStateBlock(NO);
        }
        [self stop];
    }
}

4.授权成功之后,对外暴露一个方法,用来配置一些参数,以及启动定位服务,这里面主要是一些系统的权限,其中要保证这些参数为全局的,保证系统的权限弹窗不会消失

保证这几个参数为全局的
    CLLocationManager *locationManager;
    CLAuthorizationStatus locationStatus;
    BMKLocationService *locService;
    BMKGeoCodeSearch *geocodesearch;

//开启定位服务
    locService = [[BMKLocationService alloc] init];
    locService.delegate = self;
    [locService startUserLocationService];
    geocodesearch = [[BMKGeoCodeSearch alloc] init];
    geocodesearch.delegate = self;

    locationManager = [[CLLocationManager alloc] init];
    locationManager.delegate = self;
    locationStatus = [CLLocationManager authorizationStatus];
    [locationManager requestAlwaysAuthorization];//一直获取定位信息
    [locationManager requestWhenInUseAuthorization];//使用的时候获取定位信息

5.定位成功和失败的代理,定位成功之后反geo检索
其中:
正向地理编码指的是由地址信息转换为坐标点的过程。
反向地理编码指的是将地球表面的地址坐标转换为标准地址的过程。

//定位失败
-(void)didFailToLocateUserWithError:(NSError *)error
{
    [locService stopUserLocationService];
}

//定位成功 当用户的位置更新后,也会调用这里,在更新完成的最后,关闭定位
- (void)didUpdateBMKUserLocation:(BMKUserLocation *)userLocation
{
    CLLocationCoordinate2D pt = (CLLocationCoordinate2D){0, 0};
    pt = (CLLocationCoordinate2D){userLocation.location.coordinate.latitude, userLocation.location.coordinate.longitude};
    BMKReverseGeoCodeOption *reverseGeocodeSearchOption = [[BMKReverseGeoCodeOption alloc]init];
    reverseGeocodeSearchOption.reverseGeoPoint = pt;
    BOOL flag = [geocodesearch reverseGeoCode:reverseGeocodeSearchOption];
    if(flag)
    {
        //反geo检索发送成功
    }
    else
    {
        //反geo检索发送失败
    }
    [locService stopUserLocationService];
}

6.每当定位权限发生改变时,都会触发的方法

//改变授权状态时
- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
{
}

7.其中最重要的两个方法:地址信息搜索结果,反地理编码搜索结果

/**
 *返回地址信息搜索结果
 *@param searcher 搜索对象
 *@param result 搜索结BMKGeoCodeSearch果
 *@param error 错误号,@see BMKSearchErrorCode
 */
- (void)onGetGeoCodeResult:(BMKGeoCodeSearch *)searcher result:(BMKGeoCodeResult *)result errorCode:(BMKSearchErrorCode)error;
可以得到地址编码的经纬度信息以及地址名称

/**
 *返回反地理编码搜索结果
 *@param searcher 搜索对象
 *@param result 搜索结果
 *@param error 错误号,@see BMKSearchErrorCode
 */
- (void)onGetReverseGeoCodeResult:(BMKGeoCodeSearch *)searcher result:(BMKReverseGeoCodeResult *)result errorCode:(BMKSearchErrorCode)error;

其中反地理编码搜索结果,可以得到当前定位附近的主要信息
这里写图片描述

这里面的poiList包含的是这附近的10条位置信息

//返回反地理编码搜索结果 输入指定的位置进行搜索时,也通过这里返回得到的位置信息
- (void)onGetReverseGeoCodeResult:(BMKGeoCodeSearch *)searcher result:(BMKReverseGeoCodeResult *)result errorCode:(BMKSearchErrorCode)error{
    if (error == BMK_SEARCH_NO_ERROR) {
        //取最近的第一条位置信息进行处理
        BMKPoiInfo* poi = result.poiList.firstObject;
        //当前位置名字
        poi.name
        //当前位置的经纬度信息
        [NSString stringWithFormat:@"%f",poi.pt.latitude];
        [NSString stringWithFormat:@"%f",poi.pt.longitude];
    }
}

8.根据输入的指定位置,搜索时返回的位置信息

/**
 *返回POI搜索结果
 *@param searcher 搜索对象
 *@param poiResult 搜索结果列表
 *@param errorCode 错误号,@see BMKSearchErrorCode
 */
- (void)onGetPoiResult:(BMKPoiSearch*)searcher result:(BMKPoiResult*)poiResult errorCode:(BMKSearchErrorCode)errorCode;


其中返回的结果包含
///本次POI搜索的总结果数
@property (nonatomic) int totalPoiNum;
///当前页的POI结果数
@property (nonatomic) int currPoiNum;
///本次POI搜索的总页数
@property (nonatomic) int pageNum;
///当前页的索引
@property (nonatomic) int pageIndex;
///POI列表,成员是BMKPoiInfo
@property (nonatomic, strong) NSArray* poiInfoList;
///城市列表,成员是BMKCityListInfo
@property (nonatomic, strong) NSArray* cityList;


其中poiInfoList这个数组里面,每一条都包含了如下信息
    NSString* _name;            ///<POI名称
    NSString* _uid;
    NSString* _address;     ///<POI地址
    NSString* _city;            ///<POI所在城市
    NSString* _phone;       ///<POI电话号码
    NSString* _postcode;        ///<POI邮编
    int       _epoitype;        ///<POI类型,0:普通点 1:公交站 2:公交线路 3:地铁站 4:地铁线路
    CLLocationCoordinate2D _pt; ///<POI坐标

在这个自定义继承自BMKMapManager的类中,可以处理一些与自己服务器后台接口相关的操作,比如通过
定位的信息进行状态判断,APP有无定位给用户的展示,再比如有关物流的应用,通过当前的经纬度判断是否在配送范围等等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值