百度地圖之標註一組地理座標

征途LN發表於2014-11-13

一、需求

開發移動地圖相關的應用有時會有這樣的需求:在地圖上顯示自己的定位,然後想檢視周邊使用這個應用的有哪些人。當然完成這個功能需要後臺資料的支援,你要把自己的位置資訊發給後臺,後臺在根據你的位置查詢資料庫返回你周圍的使用者的資訊,這些資訊包括經緯度座標、描述等。這裡只描述客戶端如何實現,至於後臺返回的這些資料就在本地建立家資料了,下面就用百度地圖實現這個功能。


二、實現效果展示


三、程式碼(定位功能上一篇文章已經描述,下面只實現顯示一組座標)

1、建立變數接受協議

@interface BaiduMapViewController ()<BMKMapViewDelegate,BMKLocationServiceDelegate>
{
    BMKMapView * _mapView; //地圖
    BMKLocationService * _locationService; //定位
    
    NSMutableArray * _points;//地理座標的集合
    NSMutableArray * _titles;//標註
}
@property (nonatomic,strong) CLLocationManager  *locationManager; //iOS8以後定位授權機制的改變,需要手動授權
@end

2、建立檢視+初始化相應資料

- (void)viewDidLoad {
    [super viewDidLoad];
    _mapView = [[BMKMapView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
    [self.view addSubview:_mapView];
    [_mapView setZoomLevel:14];
    //定位
    _locationService = [[BMKLocationService alloc]init];
    
    //顯示周圍
    UIButton * showAround = [UIButton buttonWithType:UIButtonTypeCustom];
    [showAround setTitle:@"顯示周圍" forState:UIControlStateNormal];
    [showAround setTitleColor:[UIColor greenColor] forState:UIControlStateNormal];
    showAround.frame = CGRectMake(200, 0, 80, 30);
    [showAround addTarget:self action:@selector(showAround) forControlEvents:UIControlEventTouchUpInside];
    [self.navigationController.navigationBar addSubview:showAround];
    
    
    //建立地理座標和標註title
    CGPoint  item1 = CGPointMake(39.915101, 116.403981);
    CGPoint  item2 = CGPointMake(39.945210, 116.403981);
    CGPoint  item3 = CGPointMake(39.935301, 116.403991);
    CGPoint  item4 = CGPointMake(39.925421, 116.403971);
    _points  = [[NSMutableArray alloc] initWithObjects:NSStringFromCGPoint(item1),   NSStringFromCGPoint(item2),NSStringFromCGPoint(item3),NSStringFromCGPoint(item4),nil];
    
    _titles = [[NSMutableArray alloc]initWithObjects:@"天安門",@"神剎海",@"景山公園",@"故宮", nil];
    
}

3、管理地圖的生命週期:自2.0.0起,BMKMapView新增viewWillAppear、viewWillDisappear方法來控制BMKMapView的生命週期,並且在一個時刻只能有一個BMKMapView接受回撥訊息,因此在使用BMKMapView的viewController中需要在viewWillAppear、viewWillDisappear方法中呼叫BMKMapView的對應的方法,並處理delegate

#pragma mark - viewWillAppear
-(void)viewWillAppear:(BOOL)animated{
    [_mapView viewWillAppear];
    _mapView.delegate = self;
    _locationService.delegate = self;
}

#pragma mark - viewDidAppear
-(void)viewWillDisappear:(BOOL)animated{
    [_mapView viewWillDisappear];
    _mapView.delegate = nil;
    _locationService.delegate = nil;
   
}

4、當點選“顯示周邊”按鈕的時建立大頭針

-(void)showAround{
    if (_points.count) {
        NSMutableArray * annotations = [[NSMutableArray alloc]init];
        for (int i = 0; i < _points.count; i++) {
            CGPoint point = CGPointFromString(_points[i]);
            CLLocationCoordinate2D pt = (CLLocationCoordinate2D){point.x,point.y};
            //建立大頭針
            BMKPointAnnotation * item = [[BMKPointAnnotation alloc]init];
            //設定大頭針的座標
            item.coordinate = pt;
            //設定大頭針的標註
            item.title = _titles[i];
            [annotations addObject:item];
            if(i == 0)
            {
                //將第一個點的座標移到螢幕中央
                _mapView.centerCoordinate = pt;
            }

        }
        //新增大頭針到地圖上
        [_mapView addAnnotations:annotations];

    }
}

#pragma mark 當呼叫[_mapView addAnnotations:annotations]時回出發地圖的代理方法,建立大頭針
-(BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(id<BMKAnnotation>)annotation{
    NSString * ID = @"annotationViewID";
    BMKPinAnnotationView * view = (BMKPinAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:ID];
    if (view == nil) {
        view = [[BMKPinAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:ID];
        view.pinColor = BMKPinAnnotationColorPurple;
        view.animatesDrop = YES;
    }
    view.centerOffset = CGPointMake(0, -(view.frame.size.height*.5));
    view.annotation = annotation; //設定代理
    view.canShowCallout = TRUE;
    return view;
}


關於地圖的其他功能待續……

相關文章