百度地图简单使用

来源:互联网 发布:linux编程基础 编辑:程序博客网 时间:2024/05/29 17:08

将最近用的百度地图记录下来(由于不是demo,阅读可能较为困难)

demo,配置问题及文档在百度开放云平台可以查看

主要用了一下几个功能 Ps:以下功能需要真机,效果图暂缺T T,有wifi补上

1.定位功能

2.搜索附近的位置(需要关键字)

3.计算我的位置及大头针位置距离

4.导航我的位置到大头针位置

注意:百度地图由于消耗相对较大添加代理位置官方demo推荐如下做法,不要释放错误和重复释放。

-(void)viewWillAppear:(BOOL)animated {
    [_mapView viewWillAppear];
    _mapView.delegate = self; // 此处记得不用的时候需要置nil,否则影响内存的释放
    _locSearch.delegate = self;
    _locService.delegate = self;
}

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

- (void)dealloc {
    if (_locSearch != nil) {
        _locSearch = nil;
    }
    if (_mapView) {
        _mapView = nil;
    }
    if (_locService) {
        _locService = nil;
    }
    
}

代码:

1)定位后tableView展示附近的位置以及计算距离

//地图定位
-(void)locationSet
{
    _mapView = [[BMKMapView alloc]init];
    _mapView.zoomLevel = 17;
    //初始化BMKLocationService
    _locService = [[BMKLocationService alloc]init];
    //设置定位精确度,默认:kCLLocationAccuracyBest
    [BMKLocationService setLocationDesiredAccuracy:kCLLocationAccuracyNearestTenMeters];
    //指定最小距离更新(米),默认:kCLDistanceFilterNone
    [BMKLocationService setLocationDistanceFilter:100.f];
    _locService.delegate=self;
    //启动LocationService
    [_locService startUserLocationService];
}


//处理方向变更信息
- (void)didUpdateUserHeading:(BMKUserLocation *)userLocation
{
    _mapView.showsUserLocation = YES;//显示定位图层
    [_mapView updateLocationData:userLocation];
    NSLog(@"heading is %@",userLocation.heading);
}

//处理位置坐标更新
- (void)didUpdateBMKUserLocation:(BMKUserLocation *)userLocation
{
    _mapView.showsUserLocation = YES;//显示定位图层
    [_mapView updateLocationData:userLocation];
    //NSLog(@"didUpdateUserLocation lat %f,long %f",userLocation.location.coordinate.latitude,userLocation.location.coordinate.longitude);
    nearbySearch = [[BMKNearbySearchOption alloc]init];
    nearbySearch.pageCapacity = 10;
    nearbySearch.keyword = bankName;
    nearbySearch.location = userLocation.location.coordinate;
    nearbySearch.radius = 2000;
    BOOL flag = [_locSearch poiSearchNearBy:nearbySearch];
    if(flag)
    {
        NSLog(@"城市内附近检索发送成功");
    }
    else
    {
        NSLog(@"城市内检索发送失败");
    }
    coor1 = userLocation.location.coordinate;
}


#pragma mark baidu mapDelegate
- (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) {
        for (int i = 0; i < poiResult.poiInfoList.count; i++) {
            _mapInfo = [poiResult.poiInfoList objectAtIndex:i];
            BMKPointAnnotation* item = [[BMKPointAnnotation alloc]init];
            item.coordinate = _mapInfo.pt;
            item.title = _mapInfo.name;
            [_mapView addAnnotation:item];
            if(i == 0)
            {
                //将第一个点的坐标移到屏幕中央
                _mapView.centerCoordinate = _mapInfo.pt;
            }
            _dataDic = [[NSMutableDictionary alloc]init];
            
            BMKMapPoint mp1 = BMKMapPointForCoordinate(nearbySearch.location);
            BMKMapPoint mp2 = BMKMapPointForCoordinate(_mapInfo.pt);
            CLLocationDistance dis = BMKMetersBetweenMapPoints(mp1, mp2);
            NSString *distance = [NSString stringWithFormat:@"%d",(int)dis];
            [_dataDic setObject:distance forKey:@"distance"];
            [_dataDic setObject:_mapInfo.name forKey:@"name"];
            [_dataDic setObject:_mapInfo.address forKey:@"address"];
            [_dataDic setObject:_mapInfo forKey:@"pt"];
            //[_dataDic setObject:_mapInfo.phone forKey:@"phone"];
            //[_dataDic setValue:_mapInfo.phone forUndefinedKey:@"phone"];
            [_dataArr addObject:_dataDic];
        }
        dataArray = _dataArr;
    } else if (errorCode == BMK_SEARCH_AMBIGUOUS_ROURE_ADDR){
        NSLog(@"起始点有歧义");
    } else {
        // 各种情况的判断。。。
    }
}


2)添加显示位置大头针、添加我的位置及调用网页或者客户端进行导航

//我的位置定位大头针
- (void)addPointAnnotation{
    
    if (pointAnnotation == nil) {
        pointAnnotation = [[BMKPointAnnotation alloc]init];
        pointAnnotation.coordinate = _coor;
        _mapView.centerCoordinate = _coor;
        pointAnnotation.title = @"我的位置";
    }
    [_mapView addAnnotation:pointAnnotation];
}

//银行位置定位大头针
- (void)addBankAnnotation{
    if (bankAnnotation == nil) {
        bankAnnotation = [[BMKPointAnnotation alloc]init];
        bankAnnotation.coordinate = _info.pt;
        bankAnnotation.title = _info.name;
    }
    [_mapView addAnnotation:bankAnnotation];
}


//改变大头针样式
- (BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(id<BMKAnnotation>)annotation{
    //我的位置annotation
    if (annotation == pointAnnotation) {
        NSString *AnnotationViewID = @"renameMark";
        BMKPinAnnotationView *annotationView = (BMKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:AnnotationViewID];
        if (annotationView == nil) {
            annotationView = [[BMKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:AnnotationViewID];
            // 设置颜色
            annotationView.image = [UIImage imageNamed:@"Select_map_location"];
            // 从天上掉下效果
            annotationView.animatesDrop = YES;
            // 设置可拖拽
            annotationView.draggable = YES;
        }
        return annotationView;
    }
    //银行位置annotation
        NSString *AnnotationViewID = @"renameMark";
        BMKPinAnnotationView *annotationView = (BMKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:AnnotationViewID];
        if (annotationView == nil) {
            annotationView = [[BMKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:AnnotationViewID];
            // 设置颜色
            annotationView.image = [UIImage imageNamed:@"Select_map_Nav"];
            // 从天上掉下效果
            annotationView.animatesDrop = YES;
            // 设置可拖拽
            annotationView.draggable = YES;
        }
        return annotationView;
    

}
//点击导航按钮进入导航页面
- (IBAction)navButtonClick:(UIButton *)sender {
    UIActionSheet *sheet = [[UIActionSheet alloc]initWithTitle:nil delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:nil otherButtonTitles:@"网页百度地图",@"百度地图客户端",nil];
    [sheet showInView:self.view];
}
//选择百度地图网页或者百度地图客户端
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex{
    if (buttonIndex == 0) {
        //初始化调启导航时的参数管理类
        BMKNaviPara* para = [[BMKNaviPara alloc]init];
        //指定导航类型
        para.naviType = BMK_NAVI_TYPE_WEB;
        
        //初始化起点节点
        BMKPlanNode* start = [[BMKPlanNode alloc]init];
        //指定起点经纬度
        start.pt = _coor;
        //指定起点名称
        start.name = @"我的位置";
        //指定起点
        para.startPoint = start;
        
        
        //初始化终点节点
        BMKPlanNode* end = [[BMKPlanNode alloc]init];
        end.pt = _info.pt;
        para.endPoint = end;
        //指定终点名称
        end.name = _info.name;
        //指定调启导航的app名称
        para.appName = [NSString stringWithFormat:@"%@", @"testAppName"];
        //调启web导航
        [BMKNavigation openBaiduMapNavigation:para];

    }else if(buttonIndex == 1){
        //初始化调启导航时的参数管理类
        BMKNaviPara* para = [[BMKNaviPara alloc]init];
        //指定导航类型
        para.naviType = BMK_NAVI_TYPE_NATIVE;
        
        //初始化终点节点
        BMKPlanNode* end = [[BMKPlanNode alloc]init];
        //指定终点经纬度
        end.pt = _info.pt;
        //指定终点名称
        end.name = _info.name;
        //指定终点
        para.endPoint = end;
        
        //指定返回自定义scheme
        para.appScheme = @"baidumapsdk://mapsdk.baidu.com";
        
        //调启百度地图客户端导航
        [BMKNavigation openBaiduMapNavigation:para];

    }else{
        NSLog(@"test");
    }
}



0 0