Baidu 地圖 SDK 的使用(五)---利用反地理編碼顯示大頭針位置

本人有若干成套學(xué)習(xí)視頻, 可試看! 可試看! 可試看, 重要的事情說(shuō)三遍 包含Java, 數(shù)據(jù)結(jié)構(gòu)與算法, iOS, 安卓, python, flutter等等, 如有需要, 聯(lián)系微信tsaievan.

其實(shí)利用反地理編碼顯示大頭針的位置并不是一個(gè)非常復(fù)雜的內(nèi)容,

在我寫(xiě)的這個(gè) demo 中, 可以看到的是:

我必須將大頭針顯示在屏幕的正中央, 這個(gè)大頭針的視圖是添加在 view 上的,所以在地圖顯示出來(lái)的時(shí)候, 拖動(dòng)地圖并不會(huì)造成大頭針跟著移動(dòng), 我們將大頭針?biāo)幍狞c(diǎn)實(shí)時(shí)地轉(zhuǎn)化為地圖上的點(diǎn),然后將地圖上的坐標(biāo)通過(guò)反地理編碼就可以顯示出當(dāng)前的位置, 基本的思路就是這樣.

我還是用一張思維導(dǎo)圖來(lái)顯示這個(gè)思路:

反地理編碼顯示大頭針的位置思路
具體實(shí)現(xiàn)步驟如下
  • 我在視圖底部的 toolBar 上加上了一個(gè) barButtonItem, 即查找位置,這個(gè)按鈕點(diǎn)擊事件的處理代碼是這樣的:
// -------- 顯示大頭針?biāo)谖恢眯畔?--------
- (IBAction)showPinButtonPlaceAction:(UIBarButtonItem *)sender {
    [kBaiduMapManager showMapCenterLocationWithSuccessBlock:^(UIButton *pinButton) {
        pinButton.center = CGPointMake(self.view.center.x, self.view.center.y - pinButton.bounds.size.height);
        [self.view addSubview:pinButton];
        [self.view bringSubviewToFront:pinButton];
    } andView:self.view];
}

在上面的這個(gè) 方法中,我將 Button 先創(chuàng)建好, 再回調(diào)給 ViewController, 然后再將 self.view 作為參數(shù)傳給這個(gè)方法內(nèi)部, 這樣就用一個(gè)方法的調(diào)用就完成了多件事情

1.button 的創(chuàng)建,這個(gè) button 實(shí)際上就是位于視圖中間的大頭針
2.將 button 添加到視圖的正中央

這個(gè)方法內(nèi)部的實(shí)現(xiàn)是這樣的:

// -------- 在視圖中間顯示一個(gè)大頭針 --------
- (void)showMapCenterLocationWithSuccessBlock:(void(^)(UIButton *pinButton))successBlock andView:(UIView *)view
{
    kBaiduMapManager.geoCodeSearch.delegate = self;
    UIButton *pinButton = [UIButton buttonWithType:UIButtonTypeCustom];
    [pinButton setImage:[UIImage imageNamed:@"cm2_discover_icn_abc"] forState:UIControlStateNormal];
    [pinButton sizeToFit];
    self.pinButton = pinButton;
    successBlock(pinButton);
}
  • 當(dāng)?shù)貓D顯示的區(qū)域發(fā)生變化的時(shí)候, mapView 的代理會(huì)走,在這個(gè)代理中,我們提交反地理編碼請(qǐng)求, 將大頭針底部所指的點(diǎn)轉(zhuǎn)化成地理坐標(biāo), 賦值給反地理編碼請(qǐng)求的屬性
// -------- 當(dāng)前的地圖視圖發(fā)生改變的時(shí)候調(diào)用這個(gè) API --------
- (void)mapView:(BMKMapView *)mapView regionDidChangeAnimated:(BOOL)animated
{
    /* 創(chuàng)建一個(gè)反地理編碼請(qǐng)求 */
    BMKReverseGeoCodeOption *reverseGeoCodeOption = [[BMKReverseGeoCodeOption alloc]init];
    /* 給反地理編碼請(qǐng)求的屬性賦值,告訴請(qǐng)求,你需要將地圖上的哪個(gè)點(diǎn)的坐標(biāo)反地理編碼 */
    reverseGeoCodeOption.reverseGeoPoint = [mapView convertPoint:CGPointMake(self.pinButton.center.x, CGRectGetMaxY(self.pinButton.frame)) toCoordinateFromView:self.pinButton.superview];
    /* 提交反地理編碼請(qǐng)求,提交請(qǐng)求之后,服務(wù)器返回的結(jié)果就會(huì)在代理方法里完成回調(diào) */
    [kBaiduMapManager.geoCodeSearch reverseGeoCode:reverseGeoCodeOption];
}
  • 請(qǐng)求提交后,服務(wù)器通過(guò)代理返回一個(gè)結(jié)果,然后我們?cè)偻ㄟ^(guò) BaiduMapManager 的代理將結(jié)果返回給控制器
#pragma mark *** BMKGeoCodeSearchDelegate 代理 API 回調(diào) ***
- (void)onGetReverseGeoCodeResult:(BMKGeoCodeSearch *)searcher result:(BMKReverseGeoCodeResult *)result errorCode:(BMKSearchErrorCode)error
{
    /* 反地理編碼結(jié)果的回調(diào)通過(guò)代理回傳給控制器 */
    if ([self.delegate respondsToSelector:@selector(baiduMapManager:getAddressName:)]) {
        [self.delegate baiduMapManager:self getAddressName:result.address];
    }
}
  • 控制器實(shí)現(xiàn) BaiduMapManager 的代理方法,將結(jié)果賦值給 label, 這樣就可以實(shí)時(shí)地顯示當(dāng)前大頭針?biāo)傅牡乩砦恢昧?/li>
#pragma mark *** BaiduMapManagerDelegate代理API 回調(diào) ***
- (void)baiduMapManager:(BaiduMapManager *)manager getAddressName:(NSString *)addressName
{
    self.popView.hidden = (addressName.length == 0)?YES:NO;
    [self.view bringSubviewToFront:self.popView];
    self.placeTipLabel.text = addressName;
}
這樣就實(shí)現(xiàn)了實(shí)時(shí)顯示大頭針底部所指位置的需求了
反地理編碼顯示大頭針位置實(shí)現(xiàn)效果

以上這5篇文章只是百度地圖的入門階段, 還有很多地方值得我們?nèi)ネ诰? 在寫(xiě)代碼的過(guò)程中, 也會(huì)遇到很多坑, 有時(shí)候耗很久都跳不出來(lái), 但是這就是學(xué)習(xí)的過(guò)程.世界很大, 牛人很多, 唯有勤奮能夠提高自己.

導(dǎo)了百度的框架, 有50M, 坑爹啊, 之前沒(méi)提交 github, 現(xiàn)在要一次性提交實(shí)在卡得不行, 上 github 又奇慢無(wú)比, 只有打個(gè)包上傳百度云盤(pán)了, 需要的同學(xué)可以下載, 歡迎提出寶貴意見(jiàn), 一起學(xué)習(xí)進(jìn)步

附上源碼鏈接: 下載 demo鏈接

PS. 本人有若干成套學(xué)習(xí)視頻, 包含Java, 數(shù)據(jù)結(jié)構(gòu)與算法, iOS, 安卓, python, flutter等等, 如有需要, 聯(lián)系微信tsaievan.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容