百度地图定位,标注以及地图中心点问题

关于百度地图的相关配置以及库的合并方法请查看官方文档,上面说的很详细,

下面是在配置好的基础上进行的。

1、引入百度地图的库的头文件

    //百度地图
    #import <BaiduMapAPI/BMapKit.h>
    #import <BaiduMapAPI/BMKMapView.h>

2、我是直接使用xib进行开发的,我直接让当前显示地图的view继承自BMKMapView,建立属性连接

@property (strong, nonatomic) IBOutlet BMKMapView *myMapView;

3、在-(void)viewWillAppear:(BOOL)animated和-(void)viewWillDisappear:(BOOL)animated中设置地图

-(void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:YES];
    [self setNavBarTranslucent];//导航栏透明,不遮挡地图
    [_myMapView viewWillAppear];
    _myMapView.delegate = self;
    locService.delegate = self;

    //开始定位
    [locService startUserLocationService];
    
}

-(void)viewWillDisappear:(BOOL)animated{
    [super viewWillDisappear:YES];
    
    [self setNavBarBackImage];
    [_myMapView viewWillDisappear];
    //停止定位
    [locService stopUserLocationService];
    _myMapView.delegate = nil;
    locService.delegate  = nil;
    
}

4、在- (void)viewDidLoad中初始化地图和定位

   locService = [[BMKLocationService alloc]init];//初始化定位服务
    _myMapView.showsUserLocation = NO;//不显示当前用户所在位置
    _myMapView.userTrackingMode = BMKUserTrackingModeNone;
    _myMapView.zoomLevel = 17;//地图显示的级别
    _myMapView.showMapScaleBar = YES;//显示比例尺

5、当用户的位置变化以及开始定位时都会调用这个代理方法

#pragma mark -用户位置更新后,会调用此函数
- (void)didUpdateBMKUserLocation:(BMKUserLocation *)userLocation
{
    NSLog(@"didUpdateUserLocation lat %f,long %f",userLocation.location.coordinate.latitude,userLocation.location.coordinate.longitude);
    [_myMapView updateLocationData:userLocation];

   //设置地图的中心点和范围
    BMKCoordinateRegion region ;//表示范围的结构体
    region.center = userLocation.location.coordinate;//中心点(当前定位的点)
    region.span.latitudeDelta = 0.05;//经度范围
    region.span.longitudeDelta = 0.05;//纬度范围
    [_myMapView setRegion:region animated:YES];
    //获取地理位置(自己写的一个方法,把经纬度传进去得到地理位置)
    [self getAddressByCoordinate:userLocation.location.coordinate];

    //停止定位
    [locService stopUserLocationService];

}

- (void)getAddressByCoordinate:(CLLocationCoordinate2D)coordinate {
   CLLocation *location = [[CLLocation alloc] initWithLatitude:coordinate.latitude longitude:coordinate.longitude];
    CLGeocoder *geocoder = [[CLGeocoder alloc]init];
    geocoder.accessibilityValue = @"zh-hans";
    [geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {
        
        CLPlacemark *placemark = [placemarks lastObject];
        NSString *Country = [placemark.addressDictionary objectForKey:@"Country"];  //国家
        NSString *State = [placemark.addressDictionary objectForKey:@"State"];  //省份
        NSString *city = [placemark.addressDictionary objectForKey:@"City"];        //省份
        NSString *SubLocality = [placemark.addressDictionary objectForKey:@"SubLocality"];  //区
        NSString *Street = [placemark.addressDictionary objectForKey:@"Street"];
        NSString *Thoroughfare = [placemark.addressDictionary objectForKey:@"Thoroughfare"];
        
        NSString *Name = [placemark.addressDictionary objectForKey:@"Name"];
        NSLog(@"总:%@,城市:%@,国家:%@,省份:%@,街道:%@,%@--%@",Name,city,Country,State,Street,SubLocality,Thoroughfare);
        if (Thoroughfare == nil) {// 街道定位可能是空值
            Thoroughfare = @"";
        }
        NSString *address = [NSString stringWithFormat:@"%@%@%@%@",State,city,SubLocality,Thoroughfare];
        [self addPointAnnotationWith:location address:address];//添加标注
    }];
}

#pragma mark -添加标注
#pragma mark -添加标注
- (void)addPointAnnotationWith:(CLLocation*)loc address:(NSString*)address
{
    //设置标注
    myAnnotation = [[MyAnnotation alloc]init];
    myAnnotation.coordinate = loc.coordinate;
    myAnnotation.title = address;
    myAnnotation.icon = @"";
    [self.myMapView addAnnotation:myAnnotation];
    //一开始就显示该地方的标注信息
    [_myMapView selectAnnotation:myAnnotation animated:YES];

}

#pragma mark - 根据anntation生成对应的View
- (BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(MyAnnotation*)annotation
{
    static NSString *annoID = @"anno";
    //设置MKPinAnnotationView可以设置大头针的颜色和气泡,MKAnnotationView只能设置大头针视图
    BMKPinAnnotationView *view = (BMKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:annoID];
    if (view ==nil) {
        view = [[BMKPinAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:annoID];
        //设置气泡
        view.canShowCallout = YES;
        //设置大头针的颜色
        view.pinColor = MKPinAnnotationColorGreen;
        //设置大头针显示的数据
        view.annotation = annotation;
        view.image = [UIImage imageNamed:annotation.icon];
        
    }
    return view;
}

在这里我添加的标注是自己定义的一个遵循BMKAnnotation协议的一个标注类

#import <Foundation/Foundation.h>
#import <MapKit/MapKit.h>

@interface MyAnnotation : NSObject<BMKAnnotation>

@property (nonatomic, assign) CLLocationCoordinate2D coordinate;

@property (nonatomic, copy) NSString *title;

@property (nonatomic, copy) NSString *subtitle;

@property (nonatomic, copy) NSString *icon;

- (void)setCoordinate:(CLLocationCoordinate2D)newCoordinate;
@end

.m文件中没有任何方法

我在xib的中心点位置固定了一个大小的imageview,移动地图的时候图片控件不会发生变化,结束移动的时候会在中心点的位置显示当前中心点的地理信息,而这个标注的icon属性,我设置的是加载一个空的图片,这样就可以实现我移动地图的时候,中心点不移动,移送完成之后会立刻显示当前的地理位置信息

这些是实现定位要做的工作,

6、地图停止定位之后会调用下面的方法

- (void)didStopLocatingUser{

    NSLog(@"定位停止");
}

#pragma mark -定位失败后,会调用此函数
- (void)didFailToLocateUserWithError:(NSError *)error
{
    NSLog(@"location error--%@",error.localizedDescription);
}

7、在拖动地图的时候想要在地图中心点显示当前的地理位置信息,此时地图的中心点发生改变,要实现的方法

-(void)mapView:(BMKMapView *)mapView regionDidChangeAnimated:(BOOL)animated{
    CLLocationCoordinate2D coordinate= _myMapView.centerCoordinate;
    //拖动地图的时候,显示当前地图中心点的地理位置,标注会在拖动结束的时候跑到中心点
    [self getAddressByCoordinate:coordinate];//这个是获取当前的地图中心点以及添加标注的方法 ,上面在定位的时候也是这个方法,封装起来便于调用

}

8、点击标注触发的函数

#pragma mark -点击标注触发的事件
- (void)mapView:(BMKMapView *)mapView annotationViewForBubble:(BMKAnnotationView *)view{
    //TODO:点击标题之后返回经纬度,上一个界面根据经纬度查询数据
    NSLog(@"标注被点击了");
}

点击标注点返回上个界面,并传递回来一个经纬度的值,在上个界面中根据经纬度继续加载数据,

9、介绍的有点不足,望大家指正,还有一些功能正在完善中,

握不住的沙,干脆扬了它。
原文地址:https://www.cnblogs.com/zj901203/p/4531119.html