美文网首页
高德地图的常见使用

高德地图的常见使用

作者: mian小爬 | 来源:发表于2020-08-14 17:46 被阅读0次

    准备工作

    高德地图的集成

    十分详细的官方集成文档.png

    官方文档

    使用高德地图

    1、引入相应的地图头文件

    #import <AMapNaviKit/MAMapKit.h>
    #import <AMapFoundationKit/AMapFoundationKit.h>
    #import <CoreLocation/CoreLocation.h>
    

    2、声明权限

       <key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
       <string>XXX将在XXX等服务中使用您的位置信息!</string>
       <key>NSLocationAlwaysUsageDescription</key>
       <string>XXX将在XXX等服务中使用您的位置信息!</string>
       <key>NSLocationWhenInUseUsageDescription</key>
       <string>XXX将在XXX等服务中使用您的位置信息!</string>
    
    • Location When In Use Usage Description:“前台定位”
    • Location Always Use Usage Description:“后台定位”
    • Location Always and When In Use Usage Description:“获取定位”

    3、用户权限判断

    //MARK: - 权限提示
    - (void)openLocationAction{
        if (![self openLocationServiceWithBlock]) {
           UIAlertController *alertC = [UIAlertController alertControllerWithTitle:@"打开定位开关" message:@"定位开关未开启,请进入系统【设置】>【隐私】>【定位服务】中打开开关,并允许该APP使用定位服务" preferredStyle:UIAlertControllerStyleAlert];
            UIAlertAction *alertA = [UIAlertAction actionWithTitle:@"我知道了" style:UIAlertActionStyleCancel handler:nil];
            [alertC addAction:alertA];
            [self presentViewController:alertC animated:YES completion:nil];
        }
    }
        //MARK: - 权限开启
    - (BOOL)openLocationServiceWithBlock {
        BOOL isOpen = NO;
        if ([CLLocationManager locationServicesEnabled] && [CLLocationManager authorizationStatus] != kCLAuthorizationStatusDenied) {
            isOpen = YES;
        }
        return isOpen;
    }
    

    4、实例化地图对象

        //初始化地图
        MAMapView *mapView = [[MAMapView alloc] initWithFrame:self.view.bounds];
        //把地图添加至view
        [self.view addSubview:mapView];
    

    常见属性和方法

    #pragma mark
    #pragma make - 高德地图的属性
    ///是否显示指南针, 默认YES
    - @property (nonatomic, assign) BOOL showsCompass; 
    
       MAMapTypeStandard = 0,  ///< 普通地图
        MAMapTypeSatellite,     ///< 卫星地图
        MAMapTypeStandardNight, ///< 夜间视图
        MAMapTypeNavi,          ///< 导航视图
        MAMapTypeBus            ///< 公交视图
    - @property (nonatomic) MAMapType mapType; 
    
    ///缩放级别(默认3-19,有室内地图时为3-20),个人感觉15可以的
    - @property (nonatomic) CGFloat zoomLevel;
    
    ///是否显示用户位置
    - @property (nonatomic) BOOL showsUserLocation;
    
    ///是否自定义用户位置精度圈(userLocationAccuracyCircle)对应的 view, 默认为 NO.
    ///如果为YES: 会调用 - (MAOverlayRenderer *)mapView (MAMapView *)mapView rendererForOverlay:(id <MAOverlay>)overlay 若返回nil, 则不加载.
    /// 如果为NO : 会使用默认的样式.
    - @property (nonatomic) BOOL customizeUserLocationAccuracyCircleRepresentation;
    
     ///指定定位是否会被系统自动暂停
    @property (nonatomic) BOOL pausesLocationUpdatesAutomatically;
    
    ///是否允许后台定位。默认为NO。只在iOS 9.0之后起作用。
    ///设置为YES的时候必须保证 Background Modes 中的 Location updates处于选中状态,否则会抛出异常。
    ///注意:定位必须在停止的状态下设置(showsUserLocation = NO),否则无效
    @property (nonatomic) BOOL allowsBackgroundLocationUpdates;
    
    ///设置当前地图的中心点,改变该值时,地图的比例尺级别不会发生变化
    @property (nonatomic) CLLocationCoordinate2D centerCoordinate;
    
    #pragma mark
    #pragma make - 高德地图的方法
    /**
     * @brief 移除标注
     * @param annotation 要移除的标注
     */
    - (void)removeAnnotation:(id <MAAnnotation>)annotation;
    
    /**
     * @brief 移除一组标注
     * @param annotations 要移除的标注数组
     */
    - (void)removeAnnotations:(NSArray *)annotations;
    
    /**
     * @brief 向地图窗口添加标注,需要实现MAMapViewDelegate的-mapView:viewForAnnotation:函数来生成标注对应的View
     * @param annotation 要添加的标注
     */
    - (void)addAnnotation:(id <MAAnnotation>)annotation;
    
    /**
     * @brief 向地图窗口添加一组标注,需要实现MAMapViewDelegate的-mapView:viewForAnnotation:函数来生成标注对应的View
     * @param annotations 要添加的标注数组
     */
    - (void)addAnnotations:(NSArray *)annotations;
    
    /**
     * @brief 选中标注数据对应的view。注意:如果annotation对应的annotationView因不在屏幕范围内而被移入复用池,为了完成选中操作,会将对应的annotationView添加到地图上,并将地图中心点移至annotation.coordinate的位置。
     * @param annotation 标注数据
     * @param animated 是否有动画效果
     */
    // 注:选中之可以手动添加气泡的显示
    - (void)selectAnnotation:(id <MAAnnotation>)annotation animated:(BOOL)animated;
    
    #pragma mark
    #pragma make - 高德地图MAMapViewDelegate代理方法
    /**
    * @brief 位置或者设备方向更新后,会调用此函数
    * @param mapView 地图View
    * @param userLocation 用户定位信息(包括位置与设备方向等数据)
    * @param updatingLocation 标示是否是location数据更新, YES:location数据更新 NO:heading数据更新
    */
    - (void)mapView:(MAMapView *)mapView didUpdateUserLocation:(MAUserLocation *)userLocation updatingLocation:(BOOL)updatingLocation{
    //    if (updatingLocation) {
    //        self.Mylat = userLocation.coordinate.latitude;
    //        self.Mylng = userLocation.coordinate.longitude;
    //        
    //        if (!self.isFirstIn) {
    //            [self.mapView setCenterCoordinate:CLLocationCoordinate2DMake(self.Mylat, self.Mylng)];
    //            self.isFirstIn = YES;
    //        }
    //    } 
    }
    
    /**
     *  @brief 当plist配置NSLocationAlwaysUsageDescription或者NSLocationAlwaysAndWhenInUseUsageDescription,并且[CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined,会调用代理的此方法。
        此方法实现调用后台权限API即可( 该回调必须实现 [locationManager requestAlwaysAuthorization] ); since 6.8.0
     *  @param locationManager  地图的CLLocationManager。
     */
    - (void)mapViewRequireLocationAuth:(CLLocationManager *)locationManager{
        [locationManager requestAlwaysAuthorization];
    }
    
    /**
     * @brief 当选中一个annotation view时,调用此接口. 注意如果已经是选中状态,再次点击不会触发此回调。取消选中需调用-(void)deselectAnnotation:animated:
     * @param mapView 地图View
     * @param view 选中的annotation view
     */
    - (void)mapView:(MAMapView *)mapView didSelectAnnotationView:(MAAnnotationView *)view{
       //    NSLog(@"%@",view);
      //    [((WMCustomAnnotationView *)view) setUpClloutView];
    }
    
    /**
     * @brief 当取消选中一个annotation view时,调用此接口
     * @param mapView 地图View
     * @param view 取消选中的annotation view
     */
    - (void)mapView:(MAMapView *)mapView didDeselectAnnotationView:(MAAnnotationView *)view{
    //    NSLog(@"%@",view);
    //    [((WMCustomAnnotationView *)view) removeAnnotationView];
    }
    

    自定义大头针和气泡

    大头针(imageView)是显示在地图上是一个图片,是高德地图MAAnnotationView的imageView,设置imageView就是设置地图上的大头针了。气泡(CalloutView)一般是显示在大头针(MAPointAnnotation)顶部的一个视图,归根结底是一个view。它是添加在大头针视图(MAAnnotationView)上的一个视图。
    1、新建类
    1.1、新建Annotation类,继承于MAPointAnnotation

    #import <AMapNaviKit/AMapNaviKit.h>
    #import "WMDeviceLocationModel.h"
    @interface WMCustomLocalAnnotation :MAPointAnnotation
    /* 需要传给MAAnnotationView视图的数据 */
    @property (nonatomic, strong) WMDeviceLocationDataModel *dataModel;
    @end
    

    1.2、新建AnnotationView类,继承于MAAnnotationView

    #import <AMapNaviKit/MAMapKit.h>
    #import "WMCustomLocalView.h"
    #import "WMDeviceLocationModel.h"
    @interface WMCustomAnnotationView : MAAnnotationView
    /* AnnotationView对应的数据模型 */
    @property (nonatomic, strong) WMDeviceLocationDataModel * _Nullable dataModel;
    @end
    
    //复写父类init方法
    - (id)initWithAnnotation:(id<MAAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier
    {
        if (self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier]){
           //给大头针视图布局
            [self setupUI]
        }
        return self;
    }
    - (void)setupUI{
    
    }
    

    2、创建Annotation对象,并传值

    // 创建Annotation< WMCustomLocalAnnotation >
    WMCustomLocalAnnotation *annotation = [[WMCustomLocalAnnotation alloc] init]; 
    // 为Annotation的dataModel赋值,local为需要展示的数据
    annotation.dataModel = local;
    // 将annotation对象添加到地图中,调用addAnnotation方法时,会走
    // - (MAAnnotationView *)mapView:(MAMapView *)mapView viewForAnnotation:(id<MAAnnotation>)annotation的代理方法
    [self.mapView addAnnotation:annotation];
    // 设置地图中心点
    [self.mapView setCenterCoordinate: annotation.coordinate];
    
    // 看业务要求,是否需要在添加Annotation前,删除其余Annotation
    for (id anno in self.mapView.annotations) {
           if ([anno isKindOfClass:[WMCustomLocalAnnotation class]]) {
              [self.mapView removeAnnotation:anno];
          }
     }
    

    3、创建WMCustomAnnotationView对象,并赋值

    /**
    * @brief 根据anntation生成对应的View
    * @param mapView 地图View
    * @param annotation 指定的标注
    * @return 生成的标注View
    */
    - (MAAnnotationView *)mapView:(MAMapView *)mapView viewForAnnotation:(id<MAAnnotation>)annotation{
        // 创建WMCustomAnnotationView
        if ([annotation isKindOfClass:[WMCustomLocalAnnotation class]]) {
            WMCustomAnnotationView  *newAnnotationView = (WMCustomAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:@"userInfoAnnotation"];
            if (!newAnnotationView) {
                newAnnotationView = [[WMCustomAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"userInfoAnnotation"];
                // canShowCallout:是否允许弹出callout
                newAnnotationView.canShowCallout = NO;
                ///是否支持拖动
                newAnnotationView.draggable = YES;
            }
            //给气泡赋值
            WMCustomLocalAnnotation *customAnnotation = (WMCustomLocalAnnotation *)annotation;
            newAnnotationView.dataModel = customAnnotation.dataModel;
            return newAnnotationView;
        }
        return nil;
    }
    

    相关文章

      网友评论

          本文标题:高德地图的常见使用

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