美文网首页
百度地图定位 和添加地图围栏

百度地图定位 和添加地图围栏

作者: chulijun | 来源:发表于2018-01-22 14:12 被阅读57次

    (一)自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

    相关文章

      网友评论

          本文标题:百度地图定位 和添加地图围栏

          本文链接:https://www.haomeiwen.com/subject/qrylaxtx.html