你可以从代码中看到我有一个位置数组,我创建了一个从一个到另一个的路由。我希望能够沿着它绘制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
}