地图高级- 大头针基本使用
1. 大头针
-
现实生活中的大头针(左图)
大头针1.png
- 地图上的大头针(右图)
-
钉在某个具体位置,用来标识这个位置上有特定的事物(这里是导航起点和终点)
大头针2.png
-
-
在地图上操作大头针,实际上是控制大头针数据模型
- 添加大头针就是添加大头针数据模型
- 删除大头针就是删除大头针数据模型
-
大头针的基本操作
添加一个大头针模型 - (void)addAnnotation:(id <MKAnnotation>)annotation; 添加多个大头针模型 - (void)addAnnotations:(NSArray *)annotations; 移除一个大头针模型 - (void)removeAnnotation:(id <MKAnnotation>)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. 获取触摸点在地图上对应的坐标
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方法
网友评论