利用MapKit实现导航

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

@interface ViewController ()<MKMapViewDelegate>
@property(nonatomic,strong) CLGeocoder * coder;

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

@property(nonatomic,strong) MKMapItem * fromItem;
@property(nonatomic,strong) MKMapItem * toItem;

@end

@implementation ViewController

-(CLGeocoder *)coder{

    if (_coder==nil) {
        _coder=[[CLGeocoder alloc] init];
    }

    return _coder;
}


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



//要求 为两地设置标注(大头针)
#warning 每次地理编码的时候只能同时进行一个
- (IBAction)addAnotation {
    
    //设置起始位置
    NSString *from=@"烟台";
    NSString *to=@"新疆";
    
    //设置开始大头针
    [self.coder geocodeAddressString:from completionHandler:^(NSArray *placemarks, NSError *error) {
        
        CLPlacemark * fromMark=[placemarks firstObject];
        //如果没定位到当前的位置就不添加大头针
        if (placemarks.count>0) {
         
            //自定义大头针模型
            JRAnnotation * fromLocation=[[JRAnnotation alloc]init];
            
            //设置开始的位置
             fromLocation.coordinate=fromMark.location.coordinate;
            
            //设置标题
            fromLocation.title=fromMark.name;
            fromLocation.subtitle=fromMark.locality;
            
            //添加大头针
            [self.mapView addAnnotation:fromLocation];
        }

        //设置结束大头针
        [self.coder geocodeAddressString:to completionHandler:^(NSArray *placemarks, NSError *error) {
            
            CLPlacemark * toMark=[placemarks firstObject];
            //如果没定位到当前的位置就不添加大头针
            if (placemarks.count>0) {
              
                //自定义大头针模型
                JRAnnotation * toLocation=[[JRAnnotation alloc]init];
                
                //设置开始的位置
                toLocation.coordinate=toMark.location.coordinate;
                
                //设置标题
                toLocation.title=toMark.name;
                toLocation.subtitle=toMark.locality;
                
                //添加大头针
                [self.mapView addAnnotation:toLocation];
                
            }
            
          //开始划线
            [self addLineFrom:fromMark andEnd:toMark];
        }];
     
    }];
   
    
    
    
}

- (void) addLineFrom:(CLPlacemark *) fromCLMark andEnd:(CLPlacemark *) toCLMark{
 
 //1 定义一个方向请求
    MKDirectionsRequest * request=[[MKDirectionsRequest alloc] init];
    
    //1>设置请求的起始坐标
    MKPlacemark * fromMark=[[MKPlacemark alloc] initWithPlacemark:fromCLMark];
    MKMapItem * fromItem=[[MKMapItem alloc] initWithPlacemark:fromMark];
    request.source=fromItem;
    self.fromItem=fromItem;
    
    //2>设置请求的起始坐标
    MKPlacemark * toMark=[[MKPlacemark alloc] initWithPlacemark:toCLMark];
    MKMapItem * toItem=[[MKMapItem alloc] initWithPlacemark:toMark];
    request.destination=toItem;
    self.toItem=toItem;
    
 //2 根据请求获取方向
    MKDirections * direct=[[MKDirections alloc] initWithRequest:request];
    
    [direct calculateDirectionsWithCompletionHandler:^(MKDirectionsResponse *response, NSError *error) {
        
      //遍历所有的路线并在地图的对应路线上面添加遮盖
        for (MKRoute * rote in response.routes) {
            [self.mapView addOverlay:rote.polyline];
        }
        
    }];
    
    
}


#pragma mark - mapView
#pragma mark 返回大头针渲染视图
-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation{
     static  NSString * identy=@"jranno";
    
    MKPinAnnotationView * mk=(MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:identy];
    
    if (mk==nil) {
        mk=[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identy];
        
        //重写代理方法必须调用该方法才显示文本
        mk.canShowCallout=YES;
    }
    
    mk.pinColor=MKPinAnnotationColorGreen;
    mk.animatesDrop=YES;
//    mk.image=[UIImage imageNamed:@"annotationImage.png"];
    
//    UIView *view=[[UIView alloc] initWithFrame:CGRectMake(0, 0, 50, 50)];
//    view.backgroundColor=[UIColor greenColor];
//    mk.leftCalloutAccessoryView=view;
//    mk.rightCalloutAccessoryView=view;
    
    return mk;
    
}


#pragma mark - 设置划线属性
- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id <MKOverlay>)overlay {
    MKPolylineRenderer * render=[[MKPolylineRenderer alloc] initWithOverlay:overlay];
    render.lineWidth=5;
    render.strokeColor=[UIColor blueColor];
    
    return render;
    

}

//开始导航
- (IBAction)guidAction {
    
    //设置开始和结束的导航位置
    NSArray * itemArray=@[self.fromItem,self.toItem];
    
   //设置步行还是开车以及是否显示交通信息
    NSDictionary *dic=@{MKLaunchOptionsDirectionsModeKey:MKLaunchOptionsDirectionsModeDriving,MKLaunchOptionsShowsTrafficKey:@(YES)};
    
    [MKMapItem openMapsWithItems:itemArray launchOptions:dic];
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值