(一)自iOS 地图SDK v2.5.0起,为了对iOS8的定位能力做兼容,做了相应的修改,使用注意事项如下:
需要在info.plist里添加(以下二选一,两个都添加默认使用NSLocationWhenInUseUsageDescription):
1) NSLocationWhenInUseUsageDescription ,允许在前台使用时获取GPS的描述
2) NSLocationAlwaysUsageDescription ,允许永久使用GPS的描述。
功能位于“基础地图(Map)”功能模块,开发者使用时请注意选择。
核心代码如下:(完整信息请参考Demo)
//以下_mapView为BMKMapView对象 _mapView.showsUserLocation = YES;//显示定位图层 _mapView.userTrackingMode = BMKUserTrackingModeNone;//设置定位的状态为普通定位模式
定位模式
目前为止,BMKMapView的定位模式(userTrackingMode)有4种分别是:
BMKUserTrackingModeNone:
普通定位模式,显示我的位置,我的位置图标和地图都不会旋转
BMKUserTrackingModeFollow :
定位跟随模式,我的位置始终在地图中心,我的位置图标会旋转,地图不会旋转
BMKUserTrackingModeFollowWithHeading :
定位罗盘模式,我的位置始终在地图中心,我的位置图标和地图都会跟着旋转
BMKUserTrackingModeHeading:
v4.1起支持,普通定位+定位罗盘模式,显示我的位置,我的位置始终在地图中心,我的位置图标会旋转,地图不会旋转。即在普通定位模式的基础上显示方向。
(二)以上为定位的分类,选择哪一种可以根据产品需求来确定,接下来要补充的则是自定义大头针的显示。和移动大头针的方法
首先声明成员变量
{
BMKCircle* circle;
BMKPointAnnotation* animatedAnnotation;
BMKPointAnnotation* lockedScreenAnnotation;
}
1)创建大头针
- (void)addAnnotation {
// 大头针 我的位置
CLLocationCoordinate2D location1=CLLocationCoordinate2DMake(_userLoca.location.coordinate.latitude, _userLoca.location.coordinate.longitude);
if (animatedAnnotation == nil) {
animatedAnnotation = [[BMKPointAnnotation alloc]init];
animatedAnnotation.coordinate = location1;
}
[_mapView addAnnotation:animatedAnnotation];
}
-(void)addCompanyAnnotationWithLatitude:(double)latitudeNum WithLongitude:(double)longitudeNum{
// 大头针 公司位置
CLLocationCoordinate2D location1=CLLocationCoordinate2DMake(latitudeNum,longitudeNum);
if (lockedScreenAnnotation == nil) {
lockedScreenAnnotation = [[BMKPointAnnotation alloc]init];
lockedScreenAnnotation.title = @"我是动画Annotation";
}
lockedScreenAnnotation.coordinate = location1;
[_mapView addAnnotation:lockedScreenAnnotation];
}
//自定义百度地图的大头针 实现两种大头针区分显示的代理方法
-(BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(id)annotation{
//动画annotation
if (annotation == animatedAnnotation) {
NSString *AnnotationViewID = @"AnimatedAnnotation"; MyAnimatedAnnotationView *annotationView = nil;
if (annotationView == nil) {
annotationView = [[MyAnimatedAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:AnnotationViewID];
}
NSMutableArray *images = [NSMutableArray array];
UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"My_Local"]];
[images addObject:image];
annotationView.annotationImages = images;
return annotationView;
}
//动画lockedScreenAnnotation
if (annotation == lockedScreenAnnotation) {
NSString *AnnotationViewID = @"lockedScreenAnnotation";
MyAnimatedAnnotationView *annotationView = nil;
if (annotationView == nil) {
annotationView = [[MyAnimatedAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:AnnotationViewID];
}
NSMutableArray *images = [NSMutableArray array];
UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"Cump_Local"]];
[images addObject:image];
annotationView.annotationImages = images;
return annotationView;
}
return nil;
}
移动大头针
MyAnimatedAnnotationView *annotationView =(MyAnimatedAnnotationView*) [_mapView viewForAnnotation:animatedAnnotation];
CLLocationCoordinate2D location1=CLLocationCoordinate2DMake(_userLoca.location.coordinate.latitude, _userLoca.location.coordinate.longitude);
animatedAnnotation.coordinate = location1;
通过。viewForAnnotation 这个函数,传你要移动的大头针类型,等待这个的大头针的View ,然后重新赋值其经纬度。MyAnimatedAnnotationView 为自定义的大头针View ,会在文章最后附上自定义代码。
(三)获得地图上两点之间的距离。
1.获得第一个坐标点
BMKMapPoint userLocalpoint1 = BMKMapPointForCoordinate(userLocation.location.coordinate);
2.获得第二个坐标点 (这个坐标点在我的项目中是由后台返回的经纬度,在这里是使用字段取值的方式获得)
CLLocationCoordinate2D location2 =CLLocationCoordinate2DMake([[_dataDic objectForKey:@"address_lat"] doubleValue],[[_dataDic objectForKey:@"address_lng"] doubleValue]);
BMKMapPoint point2 = BMKMapPointForCoordinate(location2);
3.通过下面的函数 获取两者之间的距离
CLLocationDistance distance = BMKMetersBetweenMapPoints(userLocalpoint1, point2);
(四)添加圆形地图围栏
百度地图的圆形围栏 类:BMKCircle
1)BMKCircle* circle; //声明变量
2)mapView遵循BMKMapViewDelegate代理,并实现添加覆盖物的代理方法
#pragma mark implement BMKMapViewDelegate//根据overlay生成对应的View- (BMKOverlayView *)mapView:(BMKMapView *)mapView viewForOverlay:(id)overlay
{
if ([overlay isKindOfClass:[BMKCircle class]])
{ BMKCircleView* circleView = [[BMKCircleView alloc] initWithOverlay:overlay];
circleView.fillColor = [SHDMapCircleColor colorWithAlphaComponent:0.2];
circleView.strokeColor = [SHDMapCircleColor colorWithAlphaComponent:1.0];
circleView.lineWidth = 1.0;
return circleView;
}
return nil;
}
参数说明
circleView.fillColor : 为设置外边框的颜色
circleView.lineWidth = 1.0; 为设置的边框宽度
circleView.strokeColor : 为设置圆行覆盖物内部填充颜色
(五)附加自定义大头针View的完整代码。
1. 头文件
//// MyAnimatedAnnotationView.h// IphoneMapSdkDemo//// Created by wzy on 14-11-27.// Copyright (c) 2014年 Baidu. All rights reserved.//#import@interface MyAnimatedAnnotationView : BMKAnnotationView
@property (nonatomic, strong) NSMutableArray *annotationImages;
@property (nonatomic, strong) UIImageView *annotationImageView;
@end
2.实现文件
//// MyAnimatedAnnotationView.m// IphoneMapSdkDemo//// Created by wzy on 14-11-27.// Copyright (c) 2014年 Baidu. All rights reserved.//#import "MyAnimatedAnnotationView.h"@implementation MyAnimatedAnnotationView@synthesize annotationImageView = _annotationImageView;@synthesize annotationImages = _annotationImages;- (id)initWithAnnotation:(id)annotation reuseIdentifier:(NSString *)reuseIdentifier {
self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier];
if (self) {
// [self setBounds:CGRectMake(0.f, 0.f, 30.f, 30.f)];
[self setBounds:CGRectMake(0.f, 0.f, 32.f, 32.f)];
[self setBackgroundColor:[UIColor clearColor]];
_annotationImageView = [[UIImageView alloc] initWithFrame:self.bounds];
_annotationImageView.contentMode = UIViewContentModeCenter;
[self addSubview:_annotationImageView];
}
return self;
}
- (void)setAnnotationImages:(NSMutableArray *)images {
_annotationImages = images;
[self updateImageView];
}
- (void)updateImageView {
if ([_annotationImageView isAnimating]) {
[_annotationImageView stopAnimating];
}
_annotationImageView.animationImages = _annotationImages;
_annotationImageView.animationDuration = 0.5 * [_annotationImages count];
_annotationImageView.animationRepeatCount = 0;
[_annotationImageView startAnimating];
}
@end