美文网首页
利用系统App导航

利用系统App导航

作者: 翻这个墙 | 来源:发表于2017-11-23 10:34 被阅读9次

    利用系统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导航

          本文链接:https://www.haomeiwen.com/subject/keaavxtx.html