开放平台:百度地图 for iOS 使用相关 转

 

开放平台:百度地图 for iOS 使用相关

 

今天开始使用百度地图的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: 开发定位功能,允许地图应用时时获取地理位置信息,并触发委托.

[csharp] view plaincopy
  1. _mapView.showsUserLocation = YES;//开启定位服务  
所触发的委托:

 

[csharp] view plaincopy
  1. - (void)mapView:(BMKMapView *)mapView didUpdateUserLocation:(BMKUserLocation *)userLocation  
  2. {  
  3.     
  4. }  
2:如果以上委托被调用,说明位置信息已经成功获取,接下来需要将地图位置,移动到定位所在的位置,代码如下:
[csharp] view plaincopy
  1. _mapView.userLocation //记录设备当前所在位置  

 

[csharp] view plaincopy
  1. NSLog(@"!latitude!!!  %f",userLocation.location.coordinate.latitude);//经度  
  2. NSLog(@"!longtitude!!!  %f",userLocation.location.coordinate.longitude);//纬度  

 

 

[csharp] view plaincopy
  1. //传入经纬度,将baiduMapView 锁定到以当前经纬度为中心点的显示区域和合适的显示范围  
  2. - (void)setMapRegionWithCoordinate:(CLLocationCoordinate2D)coordinate  
  3. {  
  4.     BMKCoordinateRegion region;  
  5.     if (!_isSetMapSpan)//这里用一个变量判断一下,只在第一次锁定显示区域时 设置一下显示范围 Map Region   
  6.     {  
  7.         region = BMKCoordinateRegionMake(coordinate, BMKCoordinateSpanMake(0.05, 0.05));//越小地图显示越详细  
  8.         _isSetMapSpan = YES;  
  9.         [baiduMapView setRegion:region animated:YES];//执行设定显示范围  
  10.     }  
  11.     _currentSelectCoordinate = coordinate;  
  12.     [baiduMapView setCenterCoordinate:coordinate animated:YES];//根据提供的经纬度为中心原点 以动画的形式移动到该区域  
  13. }  

执行 setCenterCoordinate:coordinate   以后开始移动,当移动完成后,会执行以下委托:

 

[csharp] view plaincopy
  1. - (void)mapView:(BMKMapView *)mapView regionDidChangeAnimated:(BOOL)animated  
  2. {  
  3.     [baiduMapView.annotations enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {  
  4.         BMKPointAnnotation *item = (BMKPointAnnotation *)obj;  
  5.         if (item.coordinate.latitude == _currentSelectCoordinate.latitude && item.coordinate.longitude == _currentSelectCoordinate.longitude )  
  6.         {  
  7.             [baiduMapView selectAnnotation:obj animated:YES];//执行之后,会让地图中的标注处于弹出气泡框状态  
  8.             *stop = YES;  
  9.         }  
  10.     }];  
  11. }  


 

 

注:0.05 表示显示区域的详细程度,设定的值最小,其显示的地图区域也就更详细,这个自己试试吧. 几句话也描述不清楚.

另外位置信息获取到以后,会不停的去获取,所以不需要使用的时候,把_mapView.showsUserLocation 设置为NO;

第二个:给指定的位置加入标注.

[csharp] view plaincopy
  1. BMKPointAnnotation* item = [[BMKPointAnnotation alloc]init];  
  2. item.coordinate = coordinate;//经纬度  
  3. item.title = titleString;    //标题  
  4. item.subtitle = subTitleString;//子标题  
  5. [baiduMapView addAnnotation:item];  

 

注:为地图类引用 添加一个 标注 执行 addAnnotation 以后 baiduMapView为触发以下委托,此委托可以定制化标注视图

[csharp] view plaincopy
  1. //原理类似 UITableView 循环委托加载 CellforRowWithIndexPath  
  2. - (BMKAnnotationView *)mapView:(BMKMapView *)view viewForAnnotation:(id <BMKAnnotation>)annotation  
  3. {  
  4.     static NSString *AnnotationViewID = @"annotationViewID";  
  5.       
  6.     BMKAnnotationView *annotationView = [view dequeueReusableAnnotationViewWithIdentifier:AnnotationViewID];  
  7.     if (annotationView == nil) {  
  8.         annotationView = [[BMKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:AnnotationViewID];  
  9.         ((BMKPinAnnotationView*)annotationView).animatesDrop = YES;  
  10.         annotationView.leftCalloutAccessoryView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_location.png"]];//气泡框左侧显示的View,可自定义  
  11.           
  12.         UIButton *selectButton = [UIButton buttonWithType:UIButtonTypeCustom];  
  13.         [selectButton setFrame:(CGRect){260,0,50,annotationView.Help_height}];  
  14.         [selectButton setTitle:@"确定" forState:UIControlStateNormal];  
  15.         annotationView.rightCalloutAccessoryView =selectButton;//气泡框右侧显示的View 可自定义  
  16.         [selectButton setBackgroundColor:[UIColor redColor]];  
  17.         [selectButton setShowsTouchWhenHighlighted:YES];  
  18.         [selectButton addTarget:self action:@selector(Location_selectPointAnnotation:) forControlEvents:UIControlEventTouchUpInside];  
  19.     }  
  20.     //以下三行代码用于将自定义视图和标记绑定,一一对应,目的是当点击,右侧自定义视图时,能够知道点击的是那个标记  
  21.     annotationView.rightCalloutAccessoryView.tag = _cacheAnnotationTag;  
  22.     [_cacheAnnotationMDic setObject:annotation forKey:[NSNumber numberWithInteger:_cacheAnnotationTag]];  
  23.     _cacheAnnotationTag++;  
  24.       
  25.     //如果是我的位置标注,则允许用户拖动改标注视图,并赋予绿色样式 处于  
  26.     if ([annotation.title isEqualToString:String_myLocation]) {  
  27.         ((BMKPinAnnotationView *)annotationView).pinColor = BMKPinAnnotationColorGreen;//标注呈绿色样式  
  28.         [annotationView setDraggable:YES];//允许用户拖动  
  29.         [annotationView setSelected:YES animated:YES];//让标注处于弹出气泡框的状态  
  30.     }else  
  31.     {  
  32.         ((BMKPinAnnotationView *)annotationView).pinColor = BMKPinAnnotationColorRed;  
  33.     }  
  34.       
  35.     annotationView.centerOffset = CGPointMake(0, -(annotationView.frame.size.height * 0.5));//不知道干什么用的  
  36.     annotationView.annotation = annotation;//绑定对应的标点经纬度  
  37.     annotationView.canShowCallout = TRUE;//允许点击弹出气泡框  
  38.     return annotationView;  
  39. }  

如果用户手动在地图中点击标注视图或者是 为 标注视图  BMKAnnotationView setSelect:YES 那么会触发以下委托:

 

[csharp] view plaincopy
  1. - (void)mapView:(BMKMapView *)mapView didSelectAnnotationView:(BMKAnnotationView *)view  
  2. {  
  3.     _currentSelectCoordinate = view.annotation.coordinate;  
  4. }  

再当点击弹出的气泡框时亦会触发以下委托:

 

 

[csharp] view plaincopy
  1. - (void)mapView:(BMKMapView *)mapView annotationViewForBubble:(BMKAnnotationView *)view;  

如果要删除标注:

 

[csharp] view plaincopy
  1. NSMutableArray *annotationMArray = [[NSArray arrayWithArray:baiduMapView.annotations] mutableCopy];  
  2. [baiduMapView removeAnnotations:annotationMArray];  

第三个就是开始POI检索

 

初始化:

 

[csharp] view plaincopy
  1. baiduMapSearch = [[BMKSearch alloc] init];  
  2. baiduMapSearch.delegate =self;  
  3. [BMKSearch setPageCapacity:10]; //设置每次搜索多少页  

开始搜索: 提供 搜索 城市 和关键字

 

 

[csharp] view plaincopy
  1. BOOL flag = [baiduMapSearch poiSearchInCity:_currentCity withKey:_searchKeywordString pageIndex:_searchPageIndex];  

搜索委托

 

 

[csharp] view plaincopy
  1. - (void)onGetPoiResult:(NSArray*)poiResultList searchType:(int)type errorCode:(int)error  
  2. {       //这里判断表示顺利搜索成功  
  3.     if (error == BMKErrorOk) {  
  4.     BMKPoiResult* result = [poiResultList objectAtIndex:0];//如果有表示搜索到数据  
  5.     for (int i = 0; i < result.poiInfoList.count; i++) {  
  6.         BMKPoiInfo* poi = [result.poiInfoList objectAtIndex:i];  
  7.         }  
  8.     }  
  9. }  

注:BMKPoiResult 里面展示当前搜索情况,如下:总共搜索到多少条数据,本次搜索到多少条数据,当前搜索到第几页等

 

     BMKPoiInfo 是每一个搜索结果,里面有电话 ,地址,经纬度 等

 

 

最多附上相关资源包: http://www.kuaipan.cn/file/id_10716325655621670.htm

密码:QNWNaf

 

posted @ 2013-03-04 01:46  Jere-Jobs  阅读(598)  评论(0编辑  收藏  举报