整理了一下项目中的定位功能,对百度地图的封装总结记录一下
首先通过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有无定位给用户的展示,再比如有关物流的应用,通过当前的经纬度判断是否在配送范围等等