导航

导航: 

  • 可以将需要导航位置丢给系统自带的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];

    }

}

原文地址:https://www.cnblogs.com/guangleijia/p/4828918.html