百度地图定位,标注以及地图中心点问题
关于百度地图的相关配置以及库的合并方法请查看官方文档,上面说的很详细,
下面是在配置好的基础上进行的。
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、介绍的有点不足,望大家指正,还有一些功能正在完善中,