利用系统App导航
1. 导航的三种实现方案
1. 可以将需要导航的位置丢给系统的地图APP进行导航
2. 发送网络请求到公司服务器获取导航数据, 然后自己手动绘制导航
3. 利用三方SDK实现导航(百度)
2. 直接将起点和终点, 传递给系统地图, 利用系统APP, 进行导航
- 利用"反推法", 记住关键代码即可
- 代码如下:
// 根据两个地标对象进行调用系统导航
- (void)beginNavWithBeginPlacemark:(CLPlacemark *)beginPlacemark andEndPlacemark:(CLPlacemark *)endPlacemark
{
// 创建起点:根据 CLPlacemark 地标对象创建 MKPlacemark 地标对象
MKPlacemark *itemP1 = [[MKPlacemark alloc] initWithPlacemark:beginPlacemark];
MKMapItem *item1 = [[MKMapItem alloc] initWithPlacemark:itemP1];
// 创建终点:根据 CLPlacemark 地标对象创建 MKPlacemark 地标对象
MKPlacemark *itemP2 = [[MKPlacemark alloc] initWithPlacemark:endPlacemark];
MKMapItem *item2 = [[MKMapItem alloc] initWithPlacemark:itemP2];
NSDictionary *launchDic = @{
// 设置导航模式参数
MKLaunchOptionsDirectionsModeKey : MKLaunchOptionsDirectionsModeDriving,
// 设置地图类型
MKLaunchOptionsMapTypeKey : @(MKMapTypeHybridFlyover),
// 设置是否显示交通
MKLaunchOptionsShowsTrafficKey : @(YES),
};
// 根据 MKMapItem 数组 和 启动参数字典 来调用系统地图进行导航
[MKMapItem openMapsWithItems:@[item1, item2] launchOptions:launchDic];
}
3. 注意: CLPlacemark地标对象没法直接手动创建, 只能通过(反)地理编码获取
```
### 3. 补充
1. 3D视图
```objc
补充1:类似于地图街景,增强用户体验
CLLocationCoordinate2D center = CLLocationCoordinate2DMake(23.132931, 113.375924);
MKMapCamera *camera = [MKMapCamera cameraLookingAtCenterCoordinate:center fromEyeCoordinate:CLLocationCoordinate2DMake(center.latitude, center.longitude + 0.001) eyeAltitude:1];
self.mapView.camera = camera;
```
2. 地图截图
```objc
// 截图附加选项
MKMapSnapshotOptions *options = [[MKMapSnapshotOptions alloc] init];
// 设置截图区域(在地图上的区域,作用在地图)
options.region = self.mapView.region;
// options.mapRect = self.mapView.visibleMapRect;
// 设置截图后的图片大小(作用在输出图像)
options.size = self.mapView.frame.size;
// 设置截图后的图片比例(默认是屏幕比例, 作用在输出图像)
options.scale = [[UIScreen mainScreen] scale];
MKMapSnapshotter *snapshotter = [[MKMapSnapshotter alloc] initWithOptions:options];
[snapshotter startWithCompletionHandler:^(MKMapSnapshot * _Nullable snapshot, NSError * _Nullable error) {
if (error) {
NSLog(@"截图错误:%@",error.localizedDescription);
}else
{
// 设置屏幕上图片显示
self.snapshootImageView.image = snapshot.image;
// 将图片保存到指定路径(此处是桌面路径,需要根据个人电脑不同进行修改)
NSData *data = UIImagePNGRepresentation(snapshot.image);
[data writeToFile:@"/Users/wangshunzi/Desktop/snap.png" atomically:YES];
}
}];
4. 测试环境
1. 加载地图数据需要联网
2. XCode版本不限
3. iOS系统版本不限
5. 常见问题总结
1. 需要注意地标对象不能手动创建, 因为里面的属性是readonly; 只能通过(反)地理编码获取
网友评论