swift地图定位(十八)发送网络请求给苹果服务器获取导航路线并解析和绘制到MKMapView

import UIKit
import MapKit

class ViewController: UIViewController {

    @IBOutlet weak var mapView: MKMapView!
    
    lazy var geoCoder: CLGeocoder = {
        return CLGeocoder()
    }()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        mapView.delegate = self
    }
    
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        geoCoder.geocodeAddressString("上海") { (pls: [CLPlacemark]?, error:Error?) -> Void in
            let shPL = pls?.first
            let shCircle = MKCircle(center: (shPL?.location?.coordinate)!, radius: 50000)
            self.mapView.add(shCircle)
            
            self.geoCoder.geocodeAddressString("北京") { (pls: [CLPlacemark]?, error:Error?) -> Void in
                let bjPL = pls?.first
                let bjCircle = MKCircle(center: (bjPL?.location?.coordinate)!, radius: 50000)
                self.mapView.add(bjCircle)
                
                self.getRouteMessage(shPL!, endCLPL: bjPL!)
            }
        }
    }
    
    func getRouteMessage(_ startCLPL: CLPlacemark, endCLPL: CLPlacemark) {
        let request: MKDirectionsRequest = MKDirectionsRequest()
        
        let sourceMKPL: MKPlacemark = MKPlacemark(placemark: startCLPL)
        request.source = MKMapItem(placemark: sourceMKPL)
        
        let destinationMKPL: MKPlacemark = MKPlacemark(placemark: endCLPL)
        request.destination = MKMapItem(placemark: destinationMKPL)
        
        let directions: MKDirections = MKDirections(request: request)
        directions.calculate { (response: MKDirectionsResponse?, error: Error?) in
            if error == nil {
                print(response)
                // MKDirectionsResponse
                // routes: [MKRoute]
                
                // MKRoute
                // name: 路线名称
                // advisoryNotices: [String] : 提示信息
                // distance: CLLocationDistance 长度
                // expectedTravelTime: NSTimeInterval: 预计到达时间段
                // transportType : 行走方式(步行, 驾驶, 公交)
                // polyline: MKPolyline: 导航路线对应的数据模型
                // steps: [MKRouteStep]: 每一步该怎么走
                
                // MKRouteStep
                // instructions: String : 行走提示: 前方路口左转
                // notice: 警告信息
                // distance : 每一节路线的长度距离
                // transportType: 每一路的交通方式
                for route in (response?.routes)! {// MKRoute
                    print(route.advisoryNotices)//["需要步行至目的地。", "需要过收费站。"]
                    print(route.name, route.distance, route.expectedTravelTime)//G2京沪高速 1304493.0 56547.0
                    // 当我们添加一个覆盖层数据模型时, 系统绘自动查找对应的代理方法, 找到对应的覆盖层"视图"
                    self.mapView.add(route.polyline)
                    for step in route.steps {// MKRouteStep
                        print(">\(step.instructions)")
                    }
                }
            }
        }
    }
}

extension ViewController: MKMapViewDelegate {
    /**
     当添加一个覆盖层数据模型到地图上时, 地图会调用这个方法, 查找对应的覆盖层"视图"(渲染图层)
     - parameter mapView: 地图
     - parameter overlay: 覆盖层"数据模型"
     - returns: 覆盖层视图
     */
    func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
        // 不同的覆盖层数据模型, 对应不同的覆盖层视图来显示
        var resultRender = MKOverlayRenderer()
    
        if overlay.isKind(of: MKPolyline.self) {
            let render: MKPolylineRenderer = MKPolylineRenderer(overlay: overlay)
            render.lineWidth = 3
            render.strokeColor = UIColor.red
            resultRender = render
            
        } else if overlay.isKind(of: MKCircle.self) {
            let circleRender: MKCircleRenderer = MKCircleRenderer(overlay: overlay)
            circleRender.fillColor = UIColor.cyan
            circleRender.alpha = 0.1
            resultRender = circleRender
        }
        return resultRender
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值