Swift 3 - Mapkkt,给定一条路线,沿着它增加一个X公里的引脚

时间:2017-07-13 12:11:13

标签: swift mapkit

你可以从代码中看到我有一个位置数组,我创建了一个从一个到另一个的路由。我希望能够沿着它绘制X km。我不知道该怎么做。我知道我需要获得坐标,但不知道如何沿着固定路线做起点+ X km。

// Create Map
        mapView.delegate = self

        // Create locations array
        let locations = [
            ["title": "St. John's, NL",    "latitude": 47.561510, "longitude": -52.712577],
            ["title": "Gander, NL", "latitude": 48.954408, "longitude": -54.610349],
            ["title": "Port-Aux-Basques, NL",     "latitude": 47.572115, "longitude": -59.136429],
            ["title": "Sheet Harbour, NS",     "latitude": 44.927851, "longitude": -62.544239],
            ["title": "Darmouth, NS",     "latitude": 44.665206, "longitude": -63.567743],
            ["title": "Charlottetown, PE",     "latitude": 46.238240, "longitude": -63.13107],
            ["title": "Saint John, NB",     "latitude": 45.273315, "longitude": -66.063308],
            ["title": "Bristol, New Brunswick",     "latitude": 46.471094, "longitude": -67.580683],
            ["title": "HWY 185, QC",     "latitude": 47.665387, "longitude": -69.169922],
            ["title": "Quebec City, QC",     "latitude": 46.769968, "longitude": -71.279297],
            ["title": "Montréal, QC",     "latitude": 45.490946, "longitude": -73.586426],
            ["title": "Ottawa, ON",     "latitude": 45.420624, "longitude": -75.691681],
            ["title": "Hawksbury, ON",     "latitude": 45.607793, "longitude": -74.614162],
            ["title": "Pickering, ON",     "latitude": 43.837994, "longitude": -79.082336],
            ["title": "Toronto, ON",     "latitude": 43.649988, "longitude": -79.385834],
            ["title": "Hamilton, ON",     "latitude": 43.260206, "longitude": -79.888458],
            ["title": "London, ON",     "latitude": 42.98707, "longitude": -81.245956],
            ["title": "Gravenhurst, ON",     "latitude": 44.920692, "longitude": -79.373646],
            ["title": "Sudbury, ON",     "latitude": 46.488938, "longitude": -80.989838],
            ["title": "Saut Ste Marie, ON",     "latitude": 46.519658, "longitude": -84.348221],
            ["title": "Wawa, ON",     "latitude": 47.960502, "longitude": -84.858398],
            ["title": "Terrace Bay, ON",     "latitude": 48.806863, "longitude": -87.231445],
            ["title": "Thunder Bay, ON",     "latitude": 48.381338, "longitude": -89.301682]
        ]


        func calculateSegmentDirections(index: Int) {
            // 1
            let request: MKDirectionsRequest = MKDirectionsRequest()

            let start = CLLocationCoordinate2D(latitude: locations[index]["latitude"] as! CLLocationDegrees, longitude: locations[index]["longitude"] as! CLLocationDegrees)
            let end = CLLocationCoordinate2D(latitude: locations[index+1]["latitude"] as! CLLocationDegrees, longitude: locations[index+1]["longitude"] as! CLLocationDegrees)

            let startPlacemark = MKPlacemark(coordinate: start, addressDictionary: nil)
            let endPlacemark = MKPlacemark(coordinate: end, addressDictionary: nil)

            let startMapItem = MKMapItem(placemark: startPlacemark)
            let endMapItem = MKMapItem(placemark: endPlacemark)

            request.source = startMapItem
            request.destination = endMapItem
            // 2
            request.requestsAlternateRoutes = true
            // 3
            request.transportType = .automobile
            // 4
            let directions = MKDirections(request: request)
            directions.calculate {(response, error) -> Void in
                guard let response = response else {
                    if let error = error {
                        print("Error: \(error)")
                    }
                    return
                }

                let route = response.routes[0]
                self.mapView.add((route.polyline), level: MKOverlayLevel.aboveRoads)

                let rect = route.polyline.boundingMapRect
                self.mapView.setRegion(MKCoordinateRegionForMapRect(rect), animated: true)

            }

        }

        for (index,location) in locations.enumerated() {
            let annotation = MKPointAnnotation()
            annotation.title = location["title"] as? String
            annotation.coordinate = CLLocationCoordinate2D(latitude: location["latitude"] as! Double, longitude: location["longitude"] as! Double)
            mapView.addAnnotation(annotation)
            if index+2 < locations.count {
                calculateSegmentDirections(index: index)
            }

        }
func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
        let renderer = MKPolylineRenderer(overlay: overlay)
        renderer.strokeColor = UIColor.darkGray.withAlphaComponent(0.4)
        renderer.lineWidth = 4.0

        return renderer
    }

0 个答案:

没有答案