swift 导航方案2 使用苹果服务器的数据导航

2020-05-20  本文已影响0人  越天高
// 操作覆盖层, 实际上操作的是覆盖层:"数据模型"
     // 添加覆盖层, 添加一个覆盖层:"数据模型"
     // // 删除覆盖层, 删除一个覆盖层:"数据模型"
    @IBOutlet weak var mapView: MKMapView!
    
    lazy var geoCode : CLGeocoder = {
        return CLGeocoder()
    }()
    
    override func viewDidLoad()
    {
        super.viewDidLoad()
    }
    
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
    {
        geoCode.geocodeAddressString("南京")
        { (placeMarks, error) in
            if error == nil
            {
                //添加一个圆形的覆盖层
                let njMark = placeMarks?.first
                let njLayer = MKCircle(center: (njMark?.location?.coordinate)!, radius: 1000)
                self.mapView.addOverlay(njLayer)
                
                self.geoCode.geocodeAddressString("济南")
                { (placeMarks, error) in
                    if error == nil
                    {
                        //添加一个圆形的覆盖层
                        let jnMark = placeMarks?.first
                        let jnLayer = MKCircle(center: (jnMark?.location?.coordinate)!, radius: 1000)
                        self.mapView.addOverlay(jnLayer)
                        self.calulate(startMark: njMark!, endMark: jnMark!)
                        
                    }
                }
                
            }
            
        }
        
    }
    
    
    
    func calulate( startMark : CLPlacemark , endMark : CLPlacemark )
    {
        //开始的地点
        let startMP = MKPlacemark(placemark: startMark)
        let startItem = MKMapItem(placemark: startMP)
        
        //结束的地点
        let endMP = MKPlacemark(placemark: endMark)
        let endItem = MKMapItem(placemark: endMP)
        
        //创建导航路线请求对象
        let request = MKDirections.Request()
        //设置参数
        request.source = startItem
        request.destination = endItem
        
        //创建导航对象
        let directions = MKDirections(request: request)
        
        //开始计算请求
        directions.calculate
        { (response, error) in
            if (error == nil)
            {
                print(response!)
                for route in (response?.routes)!
                {
                   
                    // MKRoute
                    // name: 路线名称
                    // advisoryNotices: [String] : 提示信息
                    // distance: CLLocationDistance 长度
                    // expectedTravelTime: NSTimeInterval: 预计到达时间段
                    // transportType : 行走方式(步行, 驾驶, 公交)
                    // polyline: MKPolyline: 导航路线对应的数据模型
                    // steps: [MKRouteStep]: 每一步该怎么走
                    // MKRouteStep
                    // instructions: String : 行走提示: 前方路口左转
                    // notice: 警告信息
                    // distance : 每一节路线的长度距离
                    // transportType: 每一路的交通方式
                    print(route.name)
                    print(route.advisoryNotices)
                    print(route.distance)
                    // 添加覆盖层数据模型
                    // 当我们添加一个覆盖层数据模型时, 系统绘自动查找对应的代理方法, 找到对应的覆盖层"视图"
                    self.mapView.addOverlay(route.polyline)
                    
                    for step in route.steps
                    {
                        print(step.instructions)
                    }
                }
            }
        }
    }
}

mapView的代理方法

extension ViewController : MKMapViewDelegate
{
    /**
       当添加一个覆盖层数据模型到地图上时, 地图会调用这个方法, 查找对应的覆盖层"视图"(渲染图层)
       
       - parameter mapView: ditu
       - parameter overlay: 覆盖层"数据模型"
       
       - returns: 覆盖层视图
       */
    func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer
    {
          // 不同的覆盖层数据模型, 对应不同的覆盖层视图来显示
        var reusltRender = MKOverlayRenderer()
        
        if overlay.isKind(of: MKPolyline.self)
        {
            let render = MKPolylineRenderer(overlay: overlay)
            //设置线宽
            render.lineWidth = 5
            //设置线的颜色
            render.strokeColor = UIColor.blue
            
            reusltRender = render;
        }
       
        if overlay.isKind(of: MKCircle.self)
        {
            let render = MKCircleRenderer(overlay: overlay)
            //设置线宽
            render.lineWidth = 5
            //设置线的颜色
            render.strokeColor = UIColor.red
            
            reusltRender = render;
            
        }
        
        return reusltRender
    }
    
上一篇下一篇

猜你喜欢

热点阅读