·您现在的位置: 云翼网络 >> 文章中心 >> 网站建设 >> app软件开发 >> IOS开发 >> iOS第三方地图-百度地图常用功能使用(POI搜索,地理正反编码,定位,添加标注)

iOS第三方地图-百度地图常用功能使用(POI搜索,地理正反编码,定位,添加标注)

作者:佚名      IOS开发编辑:admin      更新时间:2022-07-23

百度地图官网: http://developer.baidu.com/map/index.php?title=iossdk

百度地图集成

1.引入相关包

注:不需要使用地图功能的可以不用boundle包,模拟器使用的framework和真机不一样具体看官网

2.info.plist中

3.在TARGETS->Build Settings->Other Linker Flags 中添加-ObjC。

4.将一个文件设置为.mm

 

百度地图使用

1.AppDelegate中注册

   _mapManager = [[BMKMapManager alloc]init];
    // 如果要关注网络及授权验证事件,请设定     generalDelegate参数
    BOOL ret = [_mapManager start:@"Y1TKLraxiftqGsewOzLeRVFb"  generalDelegate:self];
    if (!ret) {
        NSLog(@"manager start failed!");
    }

2.使用百度地图

    BMKMapView *_mapView;                //地图
    BMKPoiSearch *_poisearch;            //poi搜索
    BMKGeoCodeSearch  *_geocodesearch;   //geo搜索服务

3.代码

//
//  ViewController.m
//  baidumapTest
//
//  Created by apple on 15/8/26.
//  Copyright (c) 2015年 tqh. All rights reserved.
//

//使用百度地图定位,poi搜索,地理编码功能
#import "ViewController.h"
#import "WJBaiduMapTools.h"
@interface ViewController ()<BMKPoiSearchDelegate,BMKMapViewDelegate,BMKGeoCodeSearchDelegate>{
    BMKMapView *_mapView;                //地图
    BMKPoiSearch *_poisearch;            //poi搜索
    BMKGeoCodeSearch  *_geocodesearch;   //geo搜索服务
}
@end

@implementation ViewController

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
}
-(void)viewWillDisappear:(BOOL)animated
{
    [_mapView viewWillDisappear];
    _mapView.delegate = nil; // 不用时,置nil
    _poisearch.delegate = nil; // 不用时,置nil
}

- (void)viewDidLoad {
    [super viewDidLoad];
    _mapView = [[BMKMapView alloc]initWithFrame:CGRectMake(0, 0, 320, 480)];
    _mapView.delegate = self;
    [self.view addSubview:_mapView];
    [_mapView setZoomLevel:13];
    _mapView.isSelectedAnnotationViewFront = YES;
    //延迟搜索
    [self performSelector:@selector(delay) withObject:self afterDelay:2];
    
//    WJBaiduMapTools *tool = [WJBaiduMapTools instance];
//    [tool startlocation:YES locationSuccess:^(double longitude, double latitude) {
//        NSLog(@"%f,%f",longitude,latitude);
//    } addressSuccess:^(double longitude, double latitude, BMKAddressComponent *address) {
//        NSLog(@"%f,%f",longitude,latitude);
//        NSLog(@"%@ %@",address.city,address.streetName);
//    }];
//    
 
}
- (void)delay {
    [self nameSearch];
}
#PRagma mark - poi搜索
- (void)citySearch {
    _poisearch = [[BMKPoiSearch alloc]init];
    _poisearch.delegate = self;
    BMKCitySearchOption *citySearchOption = [[BMKCitySearchOption alloc]init];
    citySearchOption.pageIndex = 0;
    citySearchOption.pageCapacity = 20;
    citySearchOption.city= @"成都";
    citySearchOption.keyWord = @"餐厅";
    BOOL flag = [_poisearch poiSearchInCity:citySearchOption];
    if(flag)
    {
        NSLog(@"城市内检索发送成功");
    }
    else
    {
        NSLog(@"城市内检索发送失败");
    }
}
#pragma mark - 根据名称搜索
- (void)nameSearch {
    _geocodesearch = [[BMKGeoCodeSearch alloc]init];
    _geocodesearch.delegate = self; // 此处记得不用的时候需要置nil,否则影响内存的释放
    BMKGeoCodeSearchOption *geocodeSearchOption = [[BMKGeoCodeSearchOption alloc]init];
    geocodeSearchOption.city= @"成都";
    geocodeSearchOption.address = @"武侯祠";
    BOOL flag = [_geocodesearch geoCode:geocodeSearchOption];
    if(flag)
    {
        NSLog(@"geo检索发送成功");
    }
    else
    {
        NSLog(@"geo检索发送失败");
    }
}
#pragma mark - 根据经纬度搜索
- (void)reverseGeoPointSearch {
    _geocodesearch = [[BMKGeoCodeSearch alloc]init];
    _geocodesearch.delegate = self; // 此处记得不用的时候需要置nil,否则影响内存的释放
    CLLocationCoordinate2D pt = (CLLocationCoordinate2D){0, 0};
    
    NSString *longitude = @"116.403981";
    NSString *latitude = @"39.915101";
    if (latitude != nil && longitude != nil) {
        pt = (CLLocationCoordinate2D){[latitude floatValue], [longitude floatValue]};
    }
    BMKReverseGeoCodeOption *reverseGeocodeSearchOption = [[BMKReverseGeoCodeOption alloc]init];
    reverseGeocodeSearchOption.reverseGeoPoint = pt;
    BOOL flag = [_geocodesearch reverseGeoCode:reverseGeocodeSearchOption];
    if(flag)
    {
        NSLog(@"反geo检索发送成功");
    }
    else
    {
        NSLog(@"反geo检索发送失败");
    }
}

#pragma mark - BMKMapViewDelegate
//长按获取经纬度,并添加标注
- (void)mapview:(BMKMapView *)mapView onLongClick:(CLLocationCoordinate2D)coordinate {
    NSLog(@"经纬度:%f,%f",coordinate.longitude,coordinate.latitude);
    BMKPointAnnotation* item = [[BMKPointAnnotation alloc]init];
    item.coordinate = coordinate;
    item.title = @"哇哈哈";
    [_mapView addAnnotation:item];
}

- (BMKAnnotationView *)mapView:(BMKMapView *)view viewForAnnotation:(id <BMKAnnotation>)annotation
{
    // 生成重用标示identifier
    NSString *AnnotationViewID = @"xidanMark";
    
    // 检查是否有重用的缓存
    BMKAnnotationView* annotationView = [view dequeueReusableAnnotationViewWithIdentifier:AnnotationViewID];
    
    // 缓存没有命中,自己构造一个,一般首次添加annotation代码会运行到此处
    if (annotationView == nil) {
        annotationView = [[BMKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:AnnotationViewID];
        ((BMKPinAnnotationView*)annotationView).pinColor = BMKPinAnnotationColorRed;
        // 设置重天上掉下的效果(annotation)
        ((BMKPinAnnotationView*)annotationView).animatesDrop = YES;
    }
    
    // 设置位置
    annotationView.centerOffset = CGPointMake(0, -(annotationView.frame.size.height * 0.5));
    annotationView.annotation = annotation;
    // 单击弹出泡泡,弹出泡泡前提annotation必须实现title属性
    annotationView.canShowCallout = YES;
    // 设置是否可以拖拽
    annotationView.draggable = NO;
    
    return annotationView;
}
- (void)mapView:(BMKMapView *)mapView didSelectAnnotationView:(BMKAnnotationView *)view
{
    [mapView bringSubviewToFront:view];
    [mapView setNeedsDisplay];
}
- (void)mapView:(BMKMapView *)mapView didAddAnnotationViews:(NSArray *)views
{
    NSLog(@"didAddAnnotationViews");
}

#pragma mark - BMKPoiSearchDelegate

- (void)onGetPoiResult:(BMKPoiSearch *)searcher result:(BMKPoiResult *)poiResult errorCode:(BMKSearchErrorCode)errorCode {
    // 清楚屏幕中所有的annotation
    NSArray* array = [NSArray arrayWithArray:_mapView.annotations];
    [_mapView removeAnnotations:array];
    if (errorCode == BMK_SEARCH_NO_ERROR) {
        NSLog(@"正常返回");
        NSMutableArray *annotations = [NSMutableArray array];
        for (int i = 0; i < poiResult.poiInfoList.count; i++) {
            BMKPoiInfo* poi = [poiResult.poiInfoList objectAtIndex:i];
            BMKPointAnnotation* item = [[BMKPointAnnotation alloc]init];
            item.coordinate = poi.pt;
            item.title = poi.name;
            NSLog(@"%@",poi.name);
            [annotations addObject:item];
        }
        [_mapView addAnnotations:annotations];
        [_mapView showAnnotations:annotations animated:YES];
    } else if (errorCode == BMK_SEARCH_AMBIGUOUS_ROURE_ADDR){
        NSLog(@"起始点有歧义");
    } else if (errorCode == BMK_SEARCH_AMBIGUOUS_KEYWORD){
        // 各种情况的判断。。。
        NSLog(@"其他情况");
    } else if (errorCode == BMK_SEARCH_NOT_SUPPORT_BUS){
        // 各种情况的判断。。。
        NSLog(@"其他情况");
    } else if (errorCode == BMK_SEARCH_NOT_SUPPORT_BUS_2CITY){
        // 各种情况的判断。。。
        NSLog(@"其他情况");
    } else if (errorCode == BMK_SEARCH_RESULT_NOT_FOUND){
        // 各种情况的判断。。。
        NSLog(@"其他情况");
    } else if (errorCode == BMK_SEARCH_ST_EN_TOO_NEAR){
        // 各种情况的判断。。。
        NSLog(@"其他情况");
    } else if (errorCode == BMK_SEARCH_KEY_ERROR){
        // 各种情况的判断。。。
        NSLog(@"其他情况");
    } else if (errorCode == BMK_SEARCH_NETWOKR_ERROR){
        // 各种情况的判断。。。
        NSLog(@"其他情况");
    } else if (errorCode == BMK_SEARCH_NETWOKR_TIMEOUT){
        // 各种情况的判断。。。
        NSLog(@"其他情况");
    } else if (errorCode == BMK_SEARCH_PERMISSION_UNFINISHED){
        // 各种情况的判断。。。
        NSLog(@"还未完成鉴权,请在鉴权通过后重试");
      
    }else {
        NSLog(@"不知道了");
    }
}


#pragma mark - BMKGeoCodeSearchDelegate
// *返回地址信息搜索结果
- (void)onGetGeoCodeResult:(BMKGeoCodeSearch *)searcher result:(BMKGeoCodeResult *)result errorCode:(BMKSearchErrorCode)error {
    NSArray* array = [NSArray arrayWithArray:_mapView.annotations];
    [_mapView removeAnnotations:array];
    array = [NSArray arrayWithArray:_mapView.overlays];
    [_mapView removeOverlays:array];
    if (error == 0) {
        BMKPointAnnotation* item = [[BMKPointAnnotation alloc]init];
        item.coordinate = result.location;
        item.title = result.address;
        [_mapView addAnnotation:item];
        _mapView.centerCoordinate = result.location;
        NSString* titleStr;
        NSString* showmeg;
        
        titleStr = @"正向地理编码";
        showmeg = [NSString stringWithFormat:@"经度:%f,纬度:%f",item.coordinate.latitude,item.coordinate.longitude];
        UIAlertView *myAlertView = [[UIAlertView alloc] initWithTitle:titleStr message:showmeg delegate:self cancelButtonTitle:nil otherButtonTitles:@"确定",nil];
        [myAlertView show];
        
        //应该在这里得到经纬度然后
    }
}
// *返回反地理编码搜索结果
- (void)onGetReverseGeoCodeResult:(BMKGeoCodeSearch *)searcher result:(BMKReverseGeoCodeResult *)result errorCode:(BMKSearchErrorCode)error {
    NSArray* array = [NSArray arrayWithArray:_mapView.annotations];
    [_mapView removeAnnotations:array];
    array = [NSArray arrayWithArray:_mapView.overlays];
    [_mapView removeOverlays:array];
    if (error == 0) {
        BMKPointAnnotation* item = [[BMKPointAnnotation alloc]init];
        item.coordinate = result.location;
        item.title = result.address;
        [_mapView addAnnotation:item];
        _mapView.centerCoordinate = result.location;
        NSString* titleStr;
        NSString* showmeg;
        titleStr = @"反向地理编码";
        showmeg = [NSString stringWithFormat:@"%@",item.title];
        UIAlertView *myAlertView = [[UIAlertView alloc] initWithTitle:titleStr message:showmeg delegate:self cancelButtonTitle:nil otherButtonTitles:@"确定",nil];
        [myAlertView show];
    }
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
@end

具体代码最下面附上Demo也可以去看百度官方Demo

注意:使用模拟器运行的时候,需要设置它的经纬度

如下图:

百度地图常用功能Demo链接:(我用的是模拟器,用真机的童鞋要记得把包换了哦)

http://pan.baidu.com/s/1dDtuZpZ

注意:如果百度地图不显示,只有网格有几种情况

1,你的程序的bundle id和百度官网上注册生成的key不同

2.你没有导入地图资源文件

3.你没有启动百度地图引擎