MKDirections绘制导航路线

本文介绍了一个iOS应用中实现从上海到北京导航功能的具体步骤。利用MapKit框架进行地图展示,并通过CLGeocoder获取地理位置信息,进而计算两地间的导航路径。


//
//  ViewController.m
//  DrawNavLine
//
//  Created by hq on 16/5/18.
//  Copyright © 2016年 hanqing. All rights reserved.
//

#import "ViewController.h"
#import <MapKit/MapKit.h>

@interface ViewController () <MKMapViewDelegate>

@property(nonatomic,strong) CLGeocoder *geo;

@property (weak, nonatomic) IBOutlet MKMapView *mapView;

- (IBAction)startNav;

@end

@implementation ViewController


-(CLGeocoder *)geo{
    
    if (_geo==nil) {
        _geo=[[CLGeocoder alloc]init];
    }
    return _geo;
}


- (void)viewDidLoad {
    
    [super viewDidLoad];
    
    self.mapView.delegate=self;
}

//开始导航
- (IBAction)startNav {
    
    [self.geo geocodeAddressString:@"shanghai" completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {

        MKPlacemark *mkPlaceMark=[[MKPlacemark alloc]initWithPlacemark:placemarks.firstObject];
        
        //起点
        MKMapItem *beigin=[[MKMapItem alloc]initWithPlacemark:mkPlaceMark];
        
        [self.geo geocodeAddressString:@"北京" completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
            
            MKPlacemark *mkEndPlaceMark=[[MKPlacemark alloc]initWithPlacemark:placemarks.firstObject];
            
            //终点
            MKMapItem *end=[[MKMapItem alloc]initWithPlacemark:mkEndPlaceMark];
            
            //开始计算
            [self beginCalculate:beigin endItem:end];
            
        }];
    }];
}


-(void) beginCalculate:(MKMapItem *) beginItem endItem:(MKMapItem *) endItem{
    
    MKDirectionsRequest *request=[[MKDirectionsRequest alloc]init];
    
    [request setSource:beginItem];
 
    [request setDestination:endItem];
    
    MKDirections *directions=[[MKDirections alloc]initWithRequest:request];
    
    //开始计算位置距离
    [directions calculateDirectionsWithCompletionHandler:^(MKDirectionsResponse * _Nullable response, NSError * _Nullable error) {
        
        if (error) {
            NSLog(@"出错了");
            return;
        }
        
        [response.routes enumerateObjectsUsingBlock:^(MKRoute * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
            
            NSLog(@"%@",obj.name);
            
            /**
             *  MKDirectionsResponse
             routes : 路线数组MKRoute
             
             */
            /**
             *  MKRoute
             name : 路线名称
             distance : 距离
             expectedTravelTime : 预期时间
             polyline : 折线(数据模型)
             steps
             */
            /**
             *  steps <MKRouteStep *>
             instructions : 行走提示
             */

            
            MKPolyline *polyline=obj.polyline;
            
            [self.mapView addOverlay:polyline];
            
            
        }];
    }];
}

/**
 *  获取对应的图层渲染
 *
 *  @param mapView 地图
 *  @param overlay 覆盖层数据模型
 *
 *  @return 图层渲染
 */

-(MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay{
    
    NSLog(@"hah");
    
    //创建一个渲染对象
    MKPolylineRenderer *render=[[MKPolylineRenderer alloc]initWithOverlay:overlay];
    
    render.lineWidth=6;
    
    //注意,必须要设置该颜色,不然会看不到线------------------------------------
    render.strokeColor=[UIColor orangeColor];
    
    return render;
}



- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    
}

@end


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值