Notes

MapKit

Location and Maps Programming Guide 文档阅读过程中的 demo, 只对可能常用的一些属性和方法进行了尝试

获取用户当前位置

有两种服务可以获取到用户的当前位置



举例如何选择获取位置信息服务?

判断位置信息服务是否可用

位置信息服务不可用的情况

获知地理位置信息是否可用

[CLLocationManager locationServicesEnabled];

开启 standard location service

配置项


使用


开启 significant-change-location

使用 significant-change-location, 需要获取 kCLAuthorizationStatusAuthorizedAlways 权限

使用


注意点

获取方向信息

Core Location 支持两种方式来获取方向信息

heading 指的是设备真正的指向,即 真•北 或者 磁场的北 course 指的是设备的运动方向,并不考虑设备的地理指向

获取 heading 事件

heading 值可以是 地磁场的北 或者 地图意义上的北(真•北)

设备附近的磁场可能会受到能散发的其他设备影响,如音响,但 Core Location 能够过滤掉干扰

使用

  1. 创建 CLLocationManager 实例
  2. 判断设备是否支持 heading 事件,headingAvailable 类方法
  3. CLLocationManager 实例分配委托对象
  4. 若要获取 真•北,则开启位置服务
  5. 调用 startUpdatingHeading 方法,开始传递 heading 事件

course 事件包含的是设备的 运动方向运动速度,从 CLLocation 实例中可以获取

几个蜜汁属性

配置文件

若 App 在没有位置信息服务也能正常使用,就千万不要添加 UIRequiredDeviceCapabilities 对应的值了


使用地理位置信息涉及隐私,涉及的描述字段有

使用设备方向指向信息,涉及的描述字段有

地图显示

MapKit 中的地图显示方式

在 MapKit 上的地图,可以通过代码

MapKit 自身提供放大与拖动的触摸事件

地图坐标系统

对地图的使用方式不同,用于描述的数据点也不同

map coordinate

map point

point

大多数情况下,使用的 point 类型都会由 MapKit 的接口决定,一般都是 map coordinate 当我们存储数据时,map coordinate 会更准确,可以移植性更强

坐标系统间的坐标转换

from to rouines
Map coordinates Points convertCoordinate:toPointToView: (MKMapView)
convertRegion:toRectToView: (MKMapView)
Map coordinates Map points MKMapPointForCoordinate
Map points Map coordinates MKCoordinateForMapPoint
MKCoordinateRegionForMapRect
Map points Points pointForMapPoint: (MKOverlayRenderer)
rectForMapRect: (MKOverlayRenderer)
Points Map coordinates convertPoint:toCoordinateFromView: (MKMapView)
convertRect:toRegionFromView: (MKMapView)
Points Map points mapPointForPoint: (MKOverlayRenderer)
mapRectForRect: (MKOverlayRenderer)

添加 Map view 到 UI 界面

Never subclass MKMapView, 需要持保留态度,UIAlertController 在文档中也曾经说过不要 subclass, 但实践发现,subclass AlertController 可以创建出一个更加灵活的选择菜单




配置地图

设定地图的可视部分

region: MKCoordinateRegion


MKCoordinateRegion 分析

typedef struct {
   CLLocationCoordinate2D center; // 区域中心点
   MKCoordinateSpan span;
} MKCoordinateRegion;

着重分析 span


显示 3D 地图

3D 地图是一个鸟瞰形式的 2D 地图

MKMapCamera 对象使用以下属性来定义 3D 地图的样貌

具体的操作看对应的代码

同时,MKMapCamera 的信息支持持久化存储

MKMapCamera *camera = [map camera]; // Get the map's current camera.
[NSKeyedArchiver archiveRootObject:camera toFile:stateFile]; // Archive the camera.

MKMapCamera *camera = [NSKeyedUnarchiver unarchiveObjectWithFile:stateFile]; // Unarchive the camera.
[map setCamera:camera]; // Restore the map.

放大和移动地图

改变 region 值的时候,会触发 MKMapView 重新计算缩放倍数并设定显示的内容,所以,如果只想移动地图,则只改变 coordinate 的值

显示设备当前位置

创建地图的截图

对于地图的截图,推荐使用 MKMapSnapshotter 的对象来完成

创建地图截图步骤

  1. 保证网络畅通,App 在前台运行
  2. 创建并配置一个 MKMapSnapshotOptions 对象,它会配置地图的样貌及输出的大小,iOS 的 App 同时可以配置缩放的倍数
  3. 创建一个 MKMapSnapshotter 对象,并使用上面的 option 对象进行初始化
  4. 调用 startWithCompletionHandler: 来开始异步的截图任务
  5. 当截图任务完成后,从回调中获取截图,并添加上需要的 overlay 或 annotation

打印地图

直接看文档了

使用委托来响应用户交互

MKMapViewMKMapViewDelegate 提供的响应事件

References