美文网首页iOS常用
iOS之原生地图的简单路线规划

iOS之原生地图的简单路线规划

作者: 苏沫离 | 来源:发表于2020-11-21 15:38 被阅读0次

    使用 MapKit 库进行路线规划,主要涉及两个类:

    • MKDirectionsRequest:提供的起点、终点,规划交通路线的请求!
    • MKDirections : 根据提供的起点、终点等信息,向苹果服务器请求交通路线!
    1、请求信息 MKDirectionsRequest
    @interface MKDirectionsRequest : NSObject
    ///起点
    @property (nonatomic, strong, nullable) MKMapItem *source;
    - (void)setSource:(nullable MKMapItem *)source NS_AVAILABLE(10_9, 7_0);
    ///终点
    @property (nonatomic, strong, nullable) MKMapItem *destination;
    - (void)setDestination:(nullable MKMapItem *)destination NS_AVAILABLE(10_9, 7_0);
    
    /** 指定交通方式:驾车|步行|公交|任何方式
     * 默认 MKDirectionsTransportTypeAny
     */
    @property (nonatomic) MKDirectionsTransportType transportType; 
    
    ///是否需要多条可用的路线 ,默认为 NO
    @property (nonatomic) BOOL requestsAlternateRoutes; 
    
    ///设置出发(到达)时间,用于优化路线规划。例如,上下班时间的高峰期,服务器可能会考虑躲避拥堵!
    @property (nonatomic, copy, nullable) NSDate *departureDate;
    @property (nonatomic, copy, nullable) NSDate *arrivalDate;
    
    @end
    
    2、发送请求MKDirections
    @interface MKDirections : NSObject
    /** 根据指定的请求实例化一个类
     * @param request 封装了起点、终点、交通方式等信息;该参数被复制,所以在实例化之后,不能再修改这些信息
    */
    - (instancetype)initWithRequest:(MKDirectionsRequest *)request;
    
    /** 异步规划交通路线
     * @note 如果 .calculating = YES ,则该方法会发生错误
     * @param completionHandler 操作完成的回调,返回路线信息或者错误
     */
    - (void)calculateDirectionsWithCompletionHandler:(MKDirectionsHandler)completionHandler;
    
    /** 异步计算从起点到终点的时间
     * @note 如果 .calculating = YES ,则该方法会发生错误
     * 由于预估时间比规划交通路线所花费的时间要少的多,所以在只需要估计时间的情况下使用这种方法;
     * @param completionHandler 操作完成的回调,返回预估时间或者错误
     */
    - (void)calculateETAWithCompletionHandler:(MKETAHandler)completionHandler;
    
    /* 取消一个请求
     * 取消一个请求之后,可以再次调用上述方法发送请求
     */
    - (void)cancel;
    
    ///是否正在请求
    @property (nonatomic, readonly, getter=isCalculating) BOOL calculating;
    
    @end
    
    3、Demo:简单的路线规划
    + (void)routePlanWithStart:(CLLocationCoordinate2D)start end:(CLLocationCoordinate2D)end handler:(MKDirectionsHandler)completionHandler{
        //1.创建方向请求
        MKDirectionsRequest *request = [[MKDirectionsRequest alloc] init];
        request.requestsAlternateRoutes = YES;//是否需要多条可用的路线
        request.transportType = MKDirectionsTransportTypeAutomobile;
        //2.设置起点
        MKPlacemark *startPlace = [[MKPlacemark alloc] initWithCoordinate:start];
        request.source = [[MKMapItem alloc] initWithPlacemark:startPlace];
        
        //3.设置终点
        MKPlacemark *endPlace = [[MKPlacemark alloc] initWithCoordinate:end];
        request.destination = [[MKMapItem alloc] initWithPlacemark:endPlace];
        
        //4.创建方向对象
        MKDirections *directions = [[MKDirections alloc] initWithRequest:request];
        //5.计算所有路线
        [directions calculateDirectionsWithCompletionHandler:completionHandler];
    }
    
    路线规划.png

    Demo

    相关文章

      网友评论

        本文标题:iOS之原生地图的简单路线规划

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