美文网首页
swift 导航方案2 使用苹果服务器的数据导航

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

作者: 越天高 | 来源:发表于2020-05-20 17:03 被阅读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
        }
        
    

    相关文章

      网友评论

          本文标题:swift 导航方案2 使用苹果服务器的数据导航

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