今天開始使用百度地圖的API實現相關的地理位置功能
在根據官方文檔: http://developer.baidu.com/map/sdkiosdev-2.htm
進行一系列的引入後,還需要注意以下兩個細節,否則編譯和運行時都會出錯:
1:讓XCode 處於 Objective - C++ 混編模式進行編譯: 最簡單方法就是:隨便更改工程檔案中的某一個,將.m更改為.mm .
2:由於靜態庫裡麵包含類別條目(第四點),所以需要讓工程支援類別的編譯: Project->Build Settings->Other Linker Flags 添加值:
-all_load
3:關於 setPaopaoView 警告 臨時解決方案如下: 在 Other Linker Flags新增一個
-w
4:建議合并靜態庫
接下來開始記錄具體用到的功能點:
第一個:成功載入地圖後,開啟定位功能,確認當前使用裝置所在的地理位置,代碼如下:
1: 開發定位功能,允許地圖應用時時擷取地理位置資訊,並觸發委託.
_mapView.showsUserLocation = YES;//開啟定位服務
所觸發的委託:
- (void)mapView:(BMKMapView *)mapView didUpdateUserLocation:(BMKUserLocation *)userLocation{ }
2:如果以上委託被調用,說明位置資訊已經成功擷取,接下來需要將地圖位置,移動到定位所在的位置,代碼如下:
_mapView.userLocation //記錄裝置當前所在位置
NSLog(@"!latitude!!! %f",userLocation.location.coordinate.latitude);//經度NSLog(@"!longtitude!!! %f",userLocation.location.coordinate.longitude);//緯度
//傳入經緯度,將baiduMapView 鎖定到以當前經緯度為中心點的顯示地區和合適的顯示範圍- (void)setMapRegionWithCoordinate:(CLLocationCoordinate2D)coordinate{ BMKCoordinateRegion region; if (!_isSetMapSpan)//這裡用一個變數判斷一下,只在第一次鎖定顯示地區時 設定一下顯示範圍 Map Region { region = BMKCoordinateRegionMake(coordinate, BMKCoordinateSpanMake(0.05, 0.05));//越小地圖顯示越詳細 _isSetMapSpan = YES; [baiduMapView setRegion:region animated:YES];//執行設定顯示範圍 } _currentSelectCoordinate = coordinate; [baiduMapView setCenterCoordinate:coordinate animated:YES];//根據提供的經緯度為中心原點 以動畫的形式移動到該地區}
執行 setCenterCoordinate:coordinate 以後開始移動,當移動完成後,會執行以下委託:
- (void)mapView:(BMKMapView *)mapView regionDidChangeAnimated:(BOOL)animated{ [baiduMapView.annotations enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { BMKPointAnnotation *item = (BMKPointAnnotation *)obj; if (item.coordinate.latitude == _currentSelectCoordinate.latitude && item.coordinate.longitude == _currentSelectCoordinate.longitude ) { [baiduMapView selectAnnotation:obj animated:YES];//執行之後,會讓地圖中的標註處於彈出氣泡框狀態 *stop = YES; } }];}
注:0.05 表示顯示地區的詳細程度,設定的值最小,其顯示的地圖地區也就更詳細,這個自己試試吧. 幾句話也描述不清楚.
另外位置資訊擷取到以後,會不停的去擷取,所以不需要使用的時候,把_mapView.showsUserLocation 設定為NO;
第二個:給指定的位置加入標註.
BMKPointAnnotation* item = [[BMKPointAnnotation alloc]init];item.coordinate = coordinate;//經緯度item.title = titleString; //標題item.subtitle = subTitleString;//子標題[baiduMapView addAnnotation:item];
注:為地圖類引用 添加一個 標註 執行 addAnnotation 以後 baiduMapView為觸發以下委託,此委託可以定製化標註視圖
//原理類似 UITableView 迴圈委託載入 CellforRowWithIndexPath- (BMKAnnotationView *)mapView:(BMKMapView *)view viewForAnnotation:(id <BMKAnnotation>)annotation{ static NSString *AnnotationViewID = @"annotationViewID"; BMKAnnotationView *annotationView = [view dequeueReusableAnnotationViewWithIdentifier:AnnotationViewID]; if (annotationView == nil) { annotationView = [[BMKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:AnnotationViewID];((BMKPinAnnotationView*)annotationView).animatesDrop = YES; annotationView.leftCalloutAccessoryView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_location.png"]];//氣泡框左側顯示的View,可自訂 UIButton *selectButton = [UIButton buttonWithType:UIButtonTypeCustom]; [selectButton setFrame:(CGRect){260,0,50,annotationView.Help_height}]; [selectButton setTitle:@"確定" forState:UIControlStateNormal]; annotationView.rightCalloutAccessoryView =selectButton;//氣泡框右側顯示的View 可自訂 [selectButton setBackgroundColor:[UIColor redColor]]; [selectButton setShowsTouchWhenHighlighted:YES]; [selectButton addTarget:self action:@selector(Location_selectPointAnnotation:) forControlEvents:UIControlEventTouchUpInside]; } //以下三行代碼用於將自訂視圖和標記綁定,一一對應,目的是當點擊,右側自訂視圖時,能夠知道點擊的是那個標記 annotationView.rightCalloutAccessoryView.tag = _cacheAnnotationTag; [_cacheAnnotationMDic setObject:annotation forKey:[NSNumber numberWithInteger:_cacheAnnotationTag]]; _cacheAnnotationTag++; //如果是我的位置標註,則允許使用者拖動改標註視圖,並賦予綠色樣式 處於 if ([annotation.title isEqualToString:String_myLocation]) { ((BMKPinAnnotationView *)annotationView).pinColor = BMKPinAnnotationColorGreen;//標註呈綠色樣式 [annotationView setDraggable:YES];//允許使用者拖動 [annotationView setSelected:YES animated:YES];//讓標註處於彈出氣泡框的狀態 }else { ((BMKPinAnnotationView *)annotationView).pinColor = BMKPinAnnotationColorRed; } annotationView.centerOffset = CGPointMake(0, -(annotationView.frame.size.height * 0.5));//不知道幹什麼用的 annotationView.annotation = annotation;//綁定對應的標點經緯度 annotationView.canShowCallout = TRUE;//允許點擊彈出氣泡框 return annotationView;}
如果使用者手動在地圖中點擊標註視圖或者是 為 標註視圖 BMKAnnotationView setSelect:YES 那麼會觸發以下委託:
- (void)mapView:(BMKMapView *)mapView didSelectAnnotationView:(BMKAnnotationView *)view{ _currentSelectCoordinate = view.annotation.coordinate;}
再當點擊彈出的氣泡框時亦會觸發以下委託:
- (void)mapView:(BMKMapView *)mapView annotationViewForBubble:(BMKAnnotationView *)view;
如果要刪除標註:
NSMutableArray *annotationMArray = [[NSArray arrayWithArray:baiduMapView.annotations] mutableCopy];[baiduMapView removeAnnotations:annotationMArray];
第三個就是開始POI檢索
初始化:
baiduMapSearch = [[BMKSearch alloc] init];baiduMapSearch.delegate =self;[BMKSearch setPageCapacity:10]; //設定每次搜尋多少頁
開始搜尋: 提供 搜尋 城市 和關鍵字
BOOL flag = [baiduMapSearch poiSearchInCity:_currentCity withKey:_searchKeywordString pageIndex:_searchPageIndex];
搜尋委託
- (void)onGetPoiResult:(NSArray*)poiResultList searchType:(int)type errorCode:(int)error{ //這裡判斷表示順利搜尋成功 if (error == BMKErrorOk) {BMKPoiResult* result = [poiResultList objectAtIndex:0];//如果有表示搜尋到資料for (int i = 0; i < result.poiInfoList.count; i++) {BMKPoiInfo* poi = [result.poiInfoList objectAtIndex:i]; } }}
注:BMKPoiResult 裡面展示當前搜尋情況,如下:總共搜尋到多少條資料,本次搜尋到多少條資料,當前搜尋到第幾頁等
BMKPoiInfo 是每一個搜尋結果,裡面有電話 ,地址,經緯度 等
最多附上相關資源套件: http://www.kuaipan.cn/file/id_10716325655621670.htm
密碼:QNWNaf