百度地圖定位工具類

導(dǎo)語:

公司的項(xiàng)目中用到了百度地圖的相關(guān)功能(定位、導(dǎo)航责静、自定義大頭針)其中封裝了幾個(gè)百度地圖的工具類袁滥,方便開發(fā)使用。

1.百度地位基礎(chǔ)知識(shí)

由于系統(tǒng)原因灾螃,iOS不允許使用第三方定位题翻,因此地圖SDK中的定位方法,本質(zhì)上是對(duì)原生定位的二次封裝腰鬼。通過封裝嵌赠,開發(fā)者可更便捷的使用。此外熄赡,地圖SDK中還提供了相應(yīng)的定位圖層(支持定位三態(tài)效果)姜挺,幫助開發(fā)者顯示當(dāng)前位置信息。

2.具體實(shí)現(xiàn)代碼

創(chuàng)建一個(gè)定位工具管理類
.h文件

#import <Foundation/Foundation.h>
//定義一個(gè)block彼硫,定位成功后返回經(jīng)緯度
typedef void(^LocationBlock)(NSString *lat,NSString *lon);

@interface BDLocationManager : NSObject

///當(dāng)前位置的緯度
@property(nonatomic,copy)NSString *lat;
///當(dāng)前位置的經(jīng)度
@property(nonatomic,copy)NSString *lon;
///當(dāng)前位置的地址信息
@property(nonatomic,copy)NSString *address;

+(instancetype)sharedManager;

///獲取當(dāng)前位置經(jīng)緯度
-(void)getGps:(LocationBlock)block;


@end

.m文件

#import "BDLocationManager.h"
#import <BaiduMapAPI_Location/BMKLocationService.h>
#import <CoreLocation/CoreLocation.h>
#import <BaiduMapAPI_Search/BMKSearchComponent.h>

@interface BDLocationManager ()<BMKLocationServiceDelegate,UIAlertViewDelegate,BMKGeoCodeSearchDelegate>

///定義block
@property(nonatomic,copy)LocationBlock block;
/**
 * 定位管理
 */
@property(nonatomic,strong)BMKLocationService *locService;

/**
 * 地理編碼
 */
@property(nonatomic,strong) BMKGeoCodeSearch *geoCode;

@end

@implementation BDLocationManager

+ (instancetype)sharedManager {
    static BDLocationManager *_instance = nil;
    static dispatch_once_t oncetoken; 
    dispatch_once(&oncetoken, ^{
        _instance = [[BDLocationManager alloc] init];
    });
    
    return _instance;
}

- (instancetype)init {
    if (self = [super init]) {
        //初始化BMKLocationService
        _locService = [[BMKLocationService alloc]init];
        //設(shè)置定位精度
        [_locService setDesiredAccuracy:kCLLocationAccuracyBest];
        _locService.delegate = self;
        _locService.distanceFilter = 30.f;

        if ([CLLocationManager locationServicesEnabled]) {
            NSLog(@"定位服務(wù)可用");
            CLAuthorizationStatus status = [CLLocationManager authorizationStatus];
            if ([CLLocationManager authorizationStatus]==kCLAuthorizationStatusAuthorizedWhenInUse||[CLLocationManager authorizationStatus]==kCLAuthorizationStatusAuthorizedAlways) {
                NSLog(@"用戶授權(quán)");
            } else if(status == kCLAuthorizationStatusDenied) {
                //定位服務(wù)開啟  --但是用戶沒有允許他定位
                NSLog(@"用戶未授權(quán),跳轉(zhuǎn)設(shè)置界面");
                UIAlertView *alertView=[[UIAlertView alloc]initWithTitle:@"您的定位未經(jīng)授權(quán)" message:@"PGS需要根據(jù)您的位置獲取信息" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"去設(shè)置", nil];
                alertView.delegate=self;
                [alertView show];
            }
        } else {
            NSLog(@"去開啟定位服務(wù)");
        }
    }
    return self;
}

//獲取當(dāng)前的地理位置
- (void)getGps:(LocationBlock)block {
    self.block = block;
    //啟動(dòng)LocationService
    [_locService startUserLocationService];
}

//處理位置坐標(biāo)更新
- (void)didUpdateBMKUserLocation:(BMKUserLocation *)userLocation {
    //獲取到位置信息 賦值
    [BDLocationManager sharedManager].lat = [@(userLocation.location.coordinate.latitude) stringValue];
    [BDLocationManager sharedManager].lon = [@(userLocation.location.coordinate.longitude) stringValue];
    
    self.block([@(userLocation.location.coordinate.latitude) stringValue],[@(userLocation.location.coordinate.longitude) stringValue]);
    
    //初始化反地址編碼選項(xiàng)(數(shù)據(jù)模型)
    BMKReverseGeoCodeOption *option = [[BMKReverseGeoCodeOption alloc] init];
    //將TextField中的數(shù)據(jù)傳到反地址編碼模型
    option.reverseGeoPoint= CLLocationCoordinate2DMake(userLocation.location.coordinate.latitude, userLocation.location.coordinate.longitude);
    
    //調(diào)用反地址編碼方法炊豪,讓其在代理方法中輸出
    if ([self.geoCode reverseGeoCode:option]) {
        NSLog(@"反檢索發(fā)送成功");
    } else {
        NSLog(@"反檢索發(fā)送失敗");
    }

    //關(guān)閉定位服務(wù)
//    [_locService stopUserLocationService];
}

/**
 *定位失敗后,會(huì)調(diào)用此函數(shù)
 *@param error 錯(cuò)誤號(hào)
 */
- (void)didFailToLocateUserWithError:(NSError *)error {
    NSLog(@"定位失敗");
}

#pragma mark geoCode的Get方法乌助,實(shí)現(xiàn)延時(shí)加載
- (BMKGeoCodeSearch *)geoCode {
    if(!_geoCode) {
            _geoCode= [[BMKGeoCodeSearch alloc] init];
            _geoCode.delegate= self;
        }
    
    return _geoCode;
    
}

/**
 *返回反地理編碼搜索結(jié)果
 *@param searcher 搜索對(duì)象
 *@param result 搜索結(jié)果
 *@param error 錯(cuò)誤號(hào)溜在,@see BMKSearchErrorCode
 */
- (void)onGetReverseGeoCodeResult:(BMKGeoCodeSearch *)searcher result:(BMKReverseGeoCodeResult *)result errorCode:(BMKSearchErrorCode)error {
    //BMKReverseGeoCodeResult是編碼的結(jié)果,包括地理位置他托,道路名稱掖肋,uid,城市名等信息
    if (error == BMK_SEARCH_NO_ERROR) {
        //在此處理正常結(jié)果
        [BDLocationManager sharedManager].address = result.address;
        
        NSLog(@"位置:%@",[BDLocationManager sharedManager].address);
    } else {
        NSLog(@"抱歉赏参,未找到結(jié)果");
    }
    
}

//實(shí)現(xiàn)相關(guān)delegate 處理位置信息更新
//處理方向變更信息
- (void)didUpdateUserHeading:(BMKUserLocation *)userLocation {
//    NSLog(@"處理方向變更信息 heading is %@",userLocation.heading);
}

#pragma mark 跳轉(zhuǎn)設(shè)置界面
-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    if (buttonIndex == 1) {
        NSURL * url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
        
        if([[UIApplication sharedApplication] canOpenURL:url]) {
            NSURL*url =[NSURL URLWithString:UIApplicationOpenSettingsURLString];
            [[UIApplication sharedApplication] openURL:url];
        }
    }
}

@end
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末志笼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子把篓,更是在濱河造成了極大的恐慌纫溃,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件韧掩,死亡現(xiàn)場離奇詭異紊浩,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門坊谁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來费彼,“玉大人,你說我怎么就攤上這事口芍」坎” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵鬓椭,是天一觀的道長颠猴。 經(jīng)常有香客問我,道長小染,這世上最難降的妖魔是什么翘瓮? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮氧映,結(jié)果婚禮上春畔,老公的妹妹穿的比我還像新娘。我一直安慰自己岛都,他們只是感情好律姨,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著臼疫,像睡著了一般择份。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上烫堤,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天荣赶,我揣著相機(jī)與錄音,去河邊找鬼鸽斟。 笑死拔创,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的富蓄。 我是一名探鬼主播剩燥,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼立倍!你這毒婦竟也來了灭红?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤口注,失蹤者是張志新(化名)和其女友劉穎变擒,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體寝志,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡娇斑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年策添,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片毫缆。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡舰攒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出悔醋,到底是詐尸還是另有隱情,我是刑警寧澤兽叮,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布芬骄,位于F島的核電站,受9級(jí)特大地震影響鹦聪,放射性物質(zhì)發(fā)生泄漏账阻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一泽本、第九天 我趴在偏房一處隱蔽的房頂上張望淘太。 院中可真熱鬧,春花似錦规丽、人聲如沸蒲牧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽冰抢。三九已至,卻和暖如春艘狭,著一層夾襖步出監(jiān)牢的瞬間挎扰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來泰國打工巢音, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留遵倦,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓官撼,卻偏偏與公主長得像梧躺,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子歧寺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,518評(píng)論 25 707
  • 根據(jù)官網(wǎng)的教程燥狰,得到百度定位的代碼流程如下: 先創(chuàng)建一個(gè) LocationClient 對(duì)象 注冊(cè)一個(gè)定位回調(diào)監(jiān)聽...
    紅燒排骨飯閱讀 1,160評(píng)論 0 0
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件斜筐、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,029評(píng)論 4 62
  • 這是我的家鄉(xiāng)顷链,低調(diào)不奢華又不起眼目代,卻是盛滿我思念的地方。 第一次一個(gè)人遠(yuǎn)行便是去了蘇州,仿佛水做的城榛了,夕陽西下在讶,外...
    橙藜威明閱讀 756評(píng)論 3 11
  • 因?yàn)槟悖颐刻旌芡聿潘螅乙恢痹诘饶?想和你說說話构哺,即使是我睡著了醒來,也會(huì)莫名的拿手機(jī)看战坤,然而...我卻始終沒有...
    小妞123閱讀 340評(píng)論 1 2