iOS 开发 高德地图-----初见

c08b3cd7cc3000756029d5229ebdec2b.jpg

小菜鸟的内心独白: 关于地图类的SDK 起初是比较排排斥的 虽然很多人都说“你看文档嘛 文档上面什么都有”。。。。。。。。。。。。但我内内心还是拒绝的 PS: 不知道是不是路痴的原因。。。。。。。。。

这里记录一下 常见的方法 以便自己下次要用的时候 ,又很惶恐

1 、获取key之类的,高德的文档写的很详细, 也就不多加累赘了。
2、 配置权限 Privacy - Location Always Usage Description 始终允许访问位置信息
// Privacy - Location Usage Description 永不允许访问位置信息
// Privacy - Location When In Use Usage Description 使用应用期间允许访问位置信息

3、配置高德 Key 添加开启 HTTPS 功能
[[AMapServices sharedServices] setEnableHTTPS:YES];

4、 [AMapServices sharedServices].apiKey = @"你的key";
5、以下是常用方法

  • 关于蓝点
    self.mapView.showsUserLocation = YES;
    self.mapView.userTrackingMode = MAUserTrackingModeFollow;
    self.mapView.userLocation.title = @"您的位置在这里";
    //显示室内地图
     self.mapView.showsIndoorMap = YES;
    //地图类型
    self.mapView.mapType = MAMapTypeStandard;
    ///地图类型
    typedef NS_ENUM(NSInteger, MAMapType)
    {
        MAMapTypeStandard = 0,  ///< 普通地图
        MAMapTypeSatellite,     ///< 卫星地图
        MAMapTypeStandardNight, ///< 夜间视图
        MAMapTypeNavi,          ///< 导航视图
        MAMapTypeBus            ///< 公交视图
    };
    
    ///是否开启自定义样式, 默认NO. since 5.0.0
    self.mapView.customMapStyleEnabled = NO;
    
    //自定义蓝点
    MAUserLocationRepresentation *represent = [[MAUserLocationRepresentation alloc] init];
    ///精度圈是否显示,默认YES
    represent.showsAccuracyRing = YES;
    ///是否显示方向指示(MAUserTrackingModeFollowWithHeading模式开启)。默认为YES
    represent.showsHeadingIndicator = YES;
    ///精度圈 填充颜色, 默认 kAccuracyCircleDefaultColor
    represent.fillColor = [UIColor colorWithRed:1 green:0 blue:0 alpha:.3];
    ///精度圈 边线颜色, 默认 kAccuracyCircleDefaultColor
    represent.strokeColor = [UIColor redColor];
    
    represent.lineWidth = 22.f;
    ///定位图标, 与蓝色原点互斥
    represent.image = [UIImage imageNamed:@"1.jpg"];
        ///内部蓝色圆点是否使用律动效果, 默认YES
    represent.enablePulseAnnimation = YES;
    /**
     * @brief 设定UserLocationView样式。如果用户自定义了userlocation的annotationView,或者该annotationView还未添加到地图上,此方法将不起作用
     * @param representation 样式信息对象
     */
    [self.mapView updateUserLocationRepresentation:represent];
  • 关于交互
      //跳转logo位置 地图Logo不能移除
    _mapView.logoCenter = CGPointMake(CGRectGetWidth(self.view.bounds)-55, 450);
    //指南针
   
    _mapView.showsCompass= YES; // 设置成NO表示关闭指南针;YES表示显示指南针
    _mapView.compassOrigin= CGPointMake(_mapView.compassOrigin.x, 22);
    
    //比例尺
    _mapView.showsScale= YES;  //设置成NO表示不显示比例尺;YES表示显示比例尺
    _mapView.scaleOrigin= CGPointMake(_mapView.scaleOrigin.x, 22);  //设置比例尺位置
    
    
    //缩放
    [self.mapView setZoomLevel:2 animated:YES];
    
    //使用手势不能改变camera的角度,但通过接口还是可以改变的 (倾斜)
    [_mapView setCameraDegree:30.f animated:YES duration:0.5];
    self.mapView.rotateCameraEnabled = NO;
    
    
    ///是否支持平移, 默认YES
    self.mapView.scrollEnabled = YES;
    ///是否支持缩放
    self.mapView.zoomEnabled = YES;
    //旋转
    self.mapView.rotateEnabled = YES;
    
       //指定中心点
    MAMapStatus * status = [self.mapView getMapStatus];
    //screenAnchor 视图锚点  当前地图的视图中心
    status.screenAnchor = CGPointMake(0.5, 0.5);
    ///设置地图旋转角度(逆时针为正向), 单位度, [0,360)
    status.rotationDegree = 135.f;
    ///设置地图相机角度(范围为[0.f, 45.f])
    status.cameraDegree = 60.f;
    [self.mapView setMapStatus:status animated:YES];
  • 截图
   CGRect inRect = [self.view convertRect:CGPathGetPathBoundingBox(self.shapeLayer.path)
                                   toView:self.mapView];
   [self.mapView takeSnapshotInRect:inRect withCompletionBlock:^(UIImage *resultImage, NSInteger state) {
      // state表示地图此时是否完整,0-不完整,1-完整
   }];
//此外官方demo中的方法
- (void)panGesture:(UIPanGestureRecognizer *)panGesture
   {
       static CGPoint startPoint;
       //识别器已经接收识别为此手势(状态)的触摸(Began)
       if (panGesture.state == UIGestureRecognizerStateBegan)
       {
           self.shapeLayer.path = NULL;
           
           startPoint = [panGesture locationInView:self.view];
       }
       //识别器已经接收到触摸,并且识别为手势改变(Changed)
       else if (panGesture.state == UIGestureRecognizerStateChanged)
       {
           CGPoint currentPoint = [panGesture locationInView:self.view];
           CGPathRef path = CGPathCreateWithRect(CGRectMake(startPoint.x, startPoint.y, currentPoint.x - startPoint.x, currentPoint.y - startPoint.y), NULL);
           self.shapeLayer.path = path;
           CGPathRelease(path);
       }
   }
  • POI
 // 是否支持单击地图获取POI信息(默认为YES)
   self.mapView.touchPOIEnabled = YES;
   
   MAPointAnnotation *annotation = [[MAPointAnnotation alloc] init];
   
   annotation.coordinate = touchPoi.coordinate;
   annotation.title      = touchPoi.name;

   //是否固定在屏幕一点,
   annotation.lockedToScreen = YES;
   ///固定屏幕点的坐标
   annotation.lockedScreenPoint = CGPointMake(100, 100);
   
   annotation.subtitle = @"副标题";
   /* Remove prior annotation. */
   //移除原来 的 (不移除话 就可以插入多个大头针)
   [self.mapView removeAnnotation:self.poiAnnotation];
   //
   [self.mapView addAnnotation:annotation];
   //选中对应的那个
   [self.mapView selectAnnotation:annotation animated:YES];
   //关于MAPinAnnotationView
    static NSString *touchPoiReuseIndetifier = @"touchPoiReuseIndetifier";
   MAPinAnnotationView *annotationView = (MAPinAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:touchPoiReuseIndetifier];
   annotationView.backgroundColor = [UIColor orangeColor];
   if (annotationView == nil)
   {
       annotationView = [[MAPinAnnotationView alloc] initWithAnnotation:annotation
                                                        reuseIdentifier:touchPoiReuseIndetifier];
   }
   ///是否允许弹出callout
   annotationView.canShowCallout = YES;
   ///添加到地图时是否使用下落动画效果
   annotationView.animatesDrop   = YES;
   annotationView.draggable      = YES;
   //枚举
   annotationView.pinColor = MAPinAnnotationColorPurple;
   annotationView.image = [UIImage imageNamed:@"restaurant"];
   
   //可自定义view  详见官方demo
  • 常用方法

//蓝点箭头旋转
- (void)mapView:(MAMapView *)mapView didUpdateUserLocation:(MAUserLocation *)userLocation updatingLocation:(BOOL)updatingLocation
{
    if (!updatingLocation && self.userLocationAnnotationView != nil)
    {
        [UIView animateWithDuration:0.1 animations:^{
            ///rotationDegree 设置地图旋转角度(逆时针为正向)
            double degree = userLocation.heading.trueHeading - self.mapView.rotationDegree;
            self.userLocationAnnotationView.transform = CGAffineTransformMakeRotation(degree * M_PI / 180.f );
            
        }];
    }
}
/**
 * @brief 根据经纬度坐标数据生成多段线
 * @param coords 经纬度坐标数据,coords对应的内存会拷贝,调用者负责该内存的释放
 * @param count  经纬度坐标个数
 * @return 生成的多段线
 */
+ (instancetype)polylineWithCoordinates:(CLLocationCoordinate2D *)coords count:(NSUInteger)count;

/**
 @brief 添加移动动画, 第一个添加的动画以当前coordinate为起始点,沿传入的coordinates点移动,否则以上一个动画终点为起始点. since 4.5.0
 @param coordinates c数组,由调用者负责coordinates指向内存的管理
 @param count coordinates数组大小
 @param duration 动画时长,0或<0为无动画
 @param name 名字,如不指定可传nil
 @param completeCallback 动画完成回调,isFinished: 动画是否执行完成
 */
- (MAAnnotationMoveAnimation *)addMoveAnimationWithKeyCoordinates:(CLLocationCoordinate2D *)coordinates
                                                            count:(NSUInteger)count
                                                     withDuration:(CGFloat)duration
                                                         withName:(NSString *)name
                                                 completeCallback:(void(^)(BOOL isFinished))completeCallback;


/**
 * @brief 分段绘制,根据经纬度坐标数据生成多段线
 *
 * 分段纹理绘制:其对应的MAMultiTexturePolylineRenderer必须使用 - (BOOL)loadStrokeTextureImages:(NSArray *)textureImages; 加载纹理图片, 否则使用默认的灰色纹理绘制
 *
 * 分段颜色绘制:其对应的MAMultiColoredPolylineRenderer必须设置strokeColors属性
 *
 * @param coords           指定的经纬度坐标点数组,注意:如果有连续重复点,需要去重处理,只保留一个,否则会导致绘制有问题。
 * @param count            坐标点的个数
 * @param drawStyleIndexes 纹理索引数组(颜色索引数组), 成员为NSNumber, 且为非负数。例子:[1,3,6] 表示 0-1使用第一种颜色\纹理,1-3使用第二种,3-6使用第三种,6-最后使用第四种
 * @return 生成的折线对象
 */
+ (instancetype)polylineWithCoordinates:(CLLocationCoordinate2D *)coords count:(NSUInteger)count drawStyleIndexes:(NSArray*) drawStyleIndexes;
/**
     * @brief 根据经纬度生成大地曲线
     * @param coords 经纬度
     * @param count  点的个数
     * @return 生成的大地曲线
     */
    self.geodesicPolyline = [MAGeodesicPolyline polylineWithCoordinates:geodesicCoords
                                                                  count:(sizeof(geodesicCoords)/sizeof(CLLocationCoordinate2D))];
    
/**
 * @brief 长按地图,返回经纬度
 * @param mapView 地图View
 * @param coordinate 经纬度
 */
- (void)mapView:(MAMapView *)mapView didLongPressedAtCoordinate:(CLLocationCoordinate2D)coordinate;

  • 常见类
1. overlay 轨迹回放  MATraceReplayOverlayRenderer ///轨迹回放overlay渲染器

2.MACircleRenderer 类是MACircle的显示圆Renderer

3.MAPolyline 此类用于定义一个由多个点相连的多段线,点与点之间尾部相连但第一点与最后一个点不相连, 通常MAPolyline是MAPolylineView的model  
MAPolyline * polyline = [MAPolyline polylineWithPoints:points count:5];
//    [self.overlays addObject:polyline];
//        [self.mapView addOverlays:self.overlays];

4. MAPolylineRenderer  此类用于绘制MAPolyline

5.MAOverlayPathRenderer  该类设置overlay绘制的属性,可以使用该类的子类MACircleRenderer, MAPolylineRenderer, MAPolygonRenderer或者继承该类

6.MACircle 该类用于定义一个圆 
   MACircle *circle1 = [MACircle circleWithCenterCoordinate:CLLocationCoordinate2DMake(39.996441, 116.411146) radius:15000];
MACircleRenderer 该类是MACircle的显示圆Renderer

7. MAPolygon 此类用于定义一个由多个点组成的闭合多边形
//      MAPolygon *polygon = [MAPolygon polygonWithCoordinates:coordinates count:4];
   MAPolygonRenderer 此类用于绘制MAPolygon

8.  MAMultiPolyline//此类用于定义一个由多个点相连的多段线,绘制时支持分段采用不同颜色(纹理)绘制,点与点之间尾部相连但第一点与最后一个点不相连, 通常MAMultiPolyline是MAMultiColoredPolylineRenderer(分段颜色绘制)或MAMultiTexturePolylineRenderer(分段纹理绘制)的model
 MAMultiPolyline *coloredPolyline = [MAMultiPolyline polylineWithCoordinates:coloredPolylineCoords count:5 drawStyleIndexes:@[@1, @3]];
     ///此类用于绘制MAMultiPolyline对应的多段线,支持分段颜色绘制
    MAMultiColoredPolylineRenderer * polylineRenderer;  
    ///颜色是否渐变
    polylineRenderer.gradient = YES;
     ///此类用于绘制MAMultiPolyline对应的多段线,支持分段纹理绘制
    MAMultiTexturePolylineRenderer * polylineRenderer ;
    UIImage * bad = [UIImage imageNamed:@"custtexture_bad"];
    ///分段纹理图片数组
    polylineRenderer.strokeTextureImages = @[bad];

其实真的就是那句话:看文档 看文档 (对自己说)。。。。。。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,254评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,875评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,682评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,896评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,015评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,152评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,208评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,962评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,388评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,700评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,867评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,551评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,186评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,901评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,689评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,757评论 2 351