利用系统App导航

利用系统App导航


1. 导航的三种实现方案

1. 可以将需要导航的位置丢给系统的地图APP进行导航
2. 发送网络请求到公司服务器获取导航数据, 然后自己手动绘制导航
3. 利用三方SDK实现导航(百度)

2. 直接将起点和终点, 传递给系统地图, 利用系统APP, 进行导航

  1. 利用"反推法", 记住关键代码即可
  2. 代码如下:
    // 根据两个地标对象进行调用系统导航
    - (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; 只能通过(反)地理编码获取

你可能感兴趣的:(利用系统App导航)