地图高级- 大头针基本使用

地图高级- 大头针基本使用

1. 大头针

  1. 现实生活中的大头针(左图)


    大头针1.png
  • 地图上的大头针(右图)
    • 钉在某个具体位置,用来标识这个位置上有特定的事物(这里是导航起点和终点)


      大头针2.png
  • 在地图上操作大头针,实际上是控制大头针数据模型

    1. 添加大头针就是添加大头针数据模型
    2. 删除大头针就是删除大头针数据模型
  • 大头针的基本操作

    添加一个大头针模型
    - (void)addAnnotation:(id )annotation;
    
    添加多个大头针模型
    - (void)addAnnotations:(NSArray *)annotations;
    
    移除一个大头针模型
    - (void)removeAnnotation:(id )annotation;
    
    移除多个大头针模型
    - (void)removeAnnotations:(NSArray *)annotations;
    


### 2. MKAnnotation协议(大头针协议)
* 在IOS中,大头针数据模型必须遵守该协议

* 协议内容:
    ```objc
    /** 经纬度 */
    @property (nonatomic, assign) CLLocationCoordinate2D coordinate;

    @optional
    /** 标题 */
    @property (nonatomic, copy) NSString *title;
    /** 子标题 */
    @property (nonatomic, copy) NSString *subtitle;

    // 设置经纬度
    - (void)setCoordinate:(CLLocationCoordinate2D)newCoordinate NS_AVAILABLE(10_9, 4_0);
    ```

### 3. MKUserLocation 大头针数据模型

* 系统大头针模型;
         1. 本质就是一个数据模型,不过此模型遵循了大头针要遵循的协议(MKAnnotation)
         2. 无法通过addAnnotation直接添加到地图上,而是通过设置地图showsUserLocation属性显示大头针
         3. 如果想手动处理大头针模型,只能自定义大头针模型

* 重要属性:
    ```objc
    location :  用户当前所在位置信息/大头针的位置(CLLocation对象),只读

    title   :  大头针标注要显示的标题(NSString对象)

    subtitle :  大头针标注要显示的子标题(NSString对象)
    ```


### 4. 在地图上添加大头针视图

1. 自定义大头针数据模型

        1) 创建继承自NSObject的数据模型XXXAnnotation, 遵循大头针数据模型必须遵循的协议(MKAnnotation)
        2) 注意将协议coordinate的readonly关键字去掉;

2. 创建大头针数据模型, 并初始化参数

    ```objc
    XXXAnnotation *annotation = [[XXXAnnotation alloc] init];
    annotation.coordinate = coordinate;
    annotation.title = @"嘻嘻";
    annotation.subtitle = @"嘻嘻哈哈";
    ```

3. 调用地图的添加大头针数据模型方法

    ```objc
    [self.mapView addAnnotation:annotation];
    ```

### 3. 移除大头针(所有大头针)
```objc
NSArray *annotations = self.mapView.annotations;
[self.mapView removeAnnotations:annotations];

4. 场景模拟

  1. 场景描述:

     鼠标点击在地图哪个位置, 就在对应的位置添加一个大头针, 并在标注弹框中显示对应的城市和街道;
    
  2. 实现步骤

        1. 获取触摸点在地图上对应的坐标
            UITouch *touch = [touches anyObject];
            CGPoint touchPoint = [touch locationInView:self.mapView];

        2. 将坐标转换成为经纬度
            CLLocationCoordinate2D center = [self.mapView convertPoint:touchPoint toCoordinateFromView:self.mapView];

        3. 根据经纬度创建大头针数据模型, 并添加在地图上
            XXXAnnotation *annotation = [[XXXAnnotation alloc] init];
            annotation.coordinate = coordinate;
            annotation.title = @"嘻嘻";
            annotation.subtitle = @"嘻嘻哈哈";
            [self.mapView addAnnotation:annotation];

        4. 利用反地理编码, 获取该点对应的城市和街道名称, 然后修改大头针数据模型
            注意: 设置弹框数据时, 对应的大头针数据模型应有对应的占位数据(这样对应的UI才会生成,后面才能重新修改数据)

            // 以下是swift示例代码
            let location = CLLocation(latitude: center.latitude, longitude: center.longitude)
            geoc.reverseGeocodeLocation(location) { (clpls : [CLPlacemark]?, error : NSError?) -> Void in

            if error != nil {return}

            // 1.取出地标对象
            guard let clpl = clpls?.first else {return}

            // 2.设置大头针的标题和子标题
            annotation.title = clpl.locality
            annotation.subtitle = clpl.name

5. 测试环境

    1. 加载地图数据需要联网
    2. XCode版本不限
    3. iOS系统版本不限

6. 常见问题总结

    1. 反地理编码无法获取对应的数据
        第一: 检查是否有联网
        第二: 检查代码是否有误
        第三: 有时存在某些位置没有反地理编码结果, 换个点尝试, 如果都没有, 排除此原因

    2. 大头针协议的@property关键字?
        @property , 其实就是生成了get 和 set 方法;
        所以, 遵循这个协议, 等同于实现该属性的get, set方法

你可能感兴趣的:(地图高级- 大头针基本使用)