本人有若干成套學(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鏈接