zoukankan      html  css  js  c++  java
  • 导航

    导航: 

    • 可以将需要导航位置丢给系统自带的App进行导航
    • 发送网络请求到公司服务器, 获取导航数据, 自己手动绘制导航
    • 利用三方SDK进行导航(百度)

    #import "ViewController.h"

    #import <MapKit/MapKit.h>

    #import "MBProgressHUD+MJ.h"

    @interface ViewController ()

    @property (weak, nonatomic) IBOutlet UITextField *startField;

    @property (weak, nonatomic) IBOutlet UITextField *endField;

    /**

     *  编码对象

     */

    @property (nonatomic, strong) CLGeocoder *geocoder;

    @property (nonatomic, strong) CLLocationManager *mgr;

    @end

    @implementation ViewController

    // 懒加载

    - (CLGeocoder *)geocoder{

        if (!_geocoder) {

            _geocoder = [[CLGeocoder alloc] init];

        }

        return _geocoder;

    }

    - (CLLocationManager *)mgr{

        if (!_mgr) {

            _mgr = [[CLLocationManager alloc] init];

        }

        return _mgr;

    }

    /**

     *  开始导航

     */

    - (IBAction)startNavBtn:(id)sender {

        // 1. 当开始导航时, 获取用户输入的起点和终点

        NSString *startStr = self.startField.text;

        NSString *endStr = self.endField.text;

        

        if (startStr.length == 0 || startStr == nil || endStr == nil || endStr.length == 0) {

            [MBProgressHUD showError:@"请输入起点和终点" toView:self.view];

            return;

        }

        

        // 2. 利用GEO对象进行地理编码,获取到地标对象(CLPlacemark)

        [self.geocoder geocodeAddressString:startStr completionHandler:^(NSArray *placemarks, NSError *error) {

            if (placemarks.count == 0) return;

            // 开始位置地标

            CLPlacemark *startPlacemark = [placemarks firstObject];

            

            [self.geocoder geocodeAddressString:endStr completionHandler:^(NSArray *placemarks, NSError *error) {

                if (placemarks.count == 0) return;

                

                // 结束位置地标

                CLPlacemark *endPlacemark = [placemarks firstObject];

                

                // 3. 再利用获取到的地标对象(CLPlacemark)创建(MKpalcemark) - 起点的item

                [self startNavigationWithStartClPlacemark:startPlacemark endCLPlacemark:endPlacemark];

            }];

        }];

        

    }

    /**

     *  开始导航

     *

     *  @param startCLPlacemark 起点地标

     *  @param endClPlacemark   终点地标

     */

    - (void)startNavigationWithStartClPlacemark:(CLPlacemark *)startCLPlacemark endCLPlacemark:(CLPlacemark *)endCLPlacemark

    {

        // 0. 创建起点和终点

        // 0.1 创建起点地标

        MKPlacemark *startMark = [[MKPlacemark alloc] initWithPlacemark:startCLPlacemark];

        MKMapItem *startItem = [[MKMapItem alloc] initWithPlacemark:startMark];

        

        // 0.2 创建终点地标

        MKPlacemark *endMark = [[MKPlacemark alloc] initWithPlacemark:endCLPlacemark];

        MKMapItem *endItem = [[MKMapItem alloc] initWithPlacemark:endMark];

        

        NSArray *items = @[startItem, endItem];

        

        /**

         *  只要调用 MKMapItem 的open 方法, 就可以打开系统自带的地图App进行导航

         *

         *  @param NSArray 告诉系统地图App 导航路线

         *

         *  @launchOptions 启动系统自带App的附加参数(导航模式, 是否需要显示公交情况, 地图模式...)

         */

        NSMutableDictionary *mutDic = [NSMutableDictionary dictionary];

        // 设置导航的模式 - 驾车 走路

        mutDic[MKLaunchOptionsDirectionsModeKey] = MKLaunchOptionsDirectionsModeDriving;

        // 设置地图显示模式

        mutDic[MKLaunchOptionsMapTypeKey] = @(MKMapTypeHybrid);

        

        [MKMapItem openMapsWithItems:items launchOptions:mutDic];

    }

    - (void)viewDidLoad {

        [super viewDidLoad];

        //

        if(IOS8){

            [self.mgr requestAlwaysAuthorization];

        }

    }

  • 相关阅读:
    gobject对象不宜作为动态加载的插件
    用内存管理器的钩子函数跟踪内存泄漏
    DBUS与多线程
    broncho小组放假半天为中国奥运加油
    多进程DirectFB用X11显示的死锁问题
    佛诞节快乐
    R语言中substr函数,字符串截取函数
    R语言中while循环
    R语言中求分位数
    R语言中利用sapply函数提取列表中元素
  • 原文地址:https://www.cnblogs.com/guangleijia/p/4828918.html
Copyright © 2011-2022 走看看