# 导航

方案一:使用的是系统APP的导航(高德地图)

  1. 根据用户输入的两个地点进行导航(或者是一个目的地,再获取用户的位置)
  • 所用到的技术点
    • 地理编码/反地理编码
    • 系统的MKMapItem类
  • 反向逆推发进行设计实现(缺什么补什么)
// MARK:- 懒加载
    private lazy var geoc : CLGeocoder = {
       return CLGeocoder()
    }()

    // 在touchesBegan中进行测试
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {

        // 根据用户的输入的地点进行地理编码
        geoc.geocodeAddressString("广州") { (clpls : [CLPlacemark]?, error :  NSError?) -> Void in
            if error == nil {
                // 判断地标对象数组是否有值
                guard let clpls = clpls else {return}
                // 取出相关度最好的地标对象
                guard let gzCLPL = clpls.first else {return}

                self.geoc.geocodeAddressString("上海") { (clpls : [CLPlacemark]?, error :  NSError?) -> Void in
                    if error == nil {
                        guard let clpls = clpls else {return}
                        guard let shCLPL = clpls.first else {return}

                        self.beginNavigation(gzCLPL, endCLPL: shCLPL)
                    }
                }
            }
        }
    }

    // 参数两个地标对象
    func beginNavigation(startCLPL : CLPlacemark, endCLPL : CLPlacemark) {
        // 设置起点
        // 转换为MKPlacemark的类型的地表对象
        let startMKPL = MKPlacemark(placemark: startCLPL)
        // 转化MKMapItem
        let startItem = MKMapItem(placemark: startMKPL)

        // 设置终点
        let endMKPL = MKPlacemark(placemark: endCLPL)
        let endItem = MKMapItem(placemark: endMKPL)

        // 设置起点和终点(mapItems: [MKMapItem])
        let mapItems : [MKMapItem]  = [startItem, endItem]

        // 设置启动项(launchOptions: )
        let dict : [String : AnyObject] = [
            // (键 : 值)的形式
            // 方向模式 : 开车
            MKLaunchOptionsDirectionsModeKey : MKLaunchOptionsDirectionsModeDriving,
            // 地图类型 :普通(Standard)
            MKLaunchOptionsMapTypeKey : MKMapType.Standard.rawValue,
            // 交通 :true表示显示
            MKLaunchOptionsShowsTrafficKey : true
        ]

        // 通过设置的内容,打开系统的导航app进行导航
        MKMapItem.openMapsWithItems(mapItems, launchOptions: dict)
        MKMapItem.openMapsWithItems(<#T##mapItems: [MKMapItem]##[MKMapItem]#>, launchOptions: <#T##[String : AnyObject]?#>)

    }

方案二:发送网络请求给苹果服务器获取导航路线(MKDirections)

其中也是要根据出发地和目的地来发送xing请求路线的,并根据出发地和目的地进行地理编码/反地理编码来得到最好的相关度的地标对象(CLPlacemark),然后将对应的地标对象转化为MKPlacemark类型的地标对象

// CLPlacemark类型的出发地和目的地的地标对象
    func getRouteMessage(sourceCLPL : CLPlacemark, destinationCLPL : CLPlacemark ) {
        // 创建路线请求对象
        let request  = MKDirectionsRequest()

        // 设置起点
        let sourceMKPL = MKPlacemark(placemark: sourceCLPL)
        request.source = MKMapItem(placemark: sourceMKPL)

        // 设置终点
        let destinationMKPL = MKPlacemark(placemark: destinationCLPL)
        request.destination = MKMapItem(placemark: destinationMKPL)


        // 创建路线对象
        let directions = MKDirections(request: request)

        // 请求路线信息
        directions.calculateDirectionsWithCompletionHandler { (response : MKDirectionsResponse?, error : NSError?) -> Void in
            if error == nil {

                // MKDirectionsResponse 响应对象
                // routes: [MKRoute] 所有的路线

                // MKRoute
                // name 路线名称
                // advisoryNotices 警告信息
                // distance 整条路线的总距离
                // expectedTravelTime 预期到达时间
                // transportType 交通方式
                // polyline : 折线数据模型,展示在地图上几何图形(覆盖层)
                // steps: [MKRouteStep] :每个步骤应该怎么走

                // [MKRouteStep]
                // instructions : 每一步的描述  "前方500 左转"
                // notice : 每个路线的警告
                // polyline : 单个折线的数据模型
                // distance : 每一步骤的距离
                // transportType : 每一步骤的交通方式

                guard let response = response else {return}

                let routes : [MKRoute] = response.routes

                for route in routes {

                    print(route.name,route.distance)

                    let steps = route.steps

                    for step in steps {
                        print(step.instructions)
                    }

                }

            }
        }

  • 渲染层描绘行走路线
/**
     当向地图上添加覆盖层的时候就会调用这个代理方法,找到对应的渲染图层并返回
     // 每一个覆盖层的渲染图层都是不一样的
     - parameter mapView: 地图
     - parameter overlay: 覆盖层

     - returns: 渲染图层
     */
    func mapView(mapView: MKMapView, rendererForOverlay overlay: MKOverlay) -> MKOverlayRenderer {

        // 1.创建折线的渲染图层
        let polylineRender = MKPolylineRenderer(overlay: overlay)

        // 2.设置线宽以及颜色
        polylineRender.lineWidth = 6
        polylineRender.strokeColor = UIColor.redColor()

        // 3.返回对应的渲染图层
        return polylineRender

    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容