如何在MapKit中创建往返环形路线(Swift/Xcode)
实现MapKit环形路线(往返不同路径)
当然可以实现这类环形路线,核心逻辑是分两次发起路线请求:一次从起点到目标地点,另一次从目标地点返回起点,通过设置不同的路线偏好来确保往返路径不重复。
核心实现步骤
- 第一次请求:发起起点→目标地点的路线请求,使用默认或某类路线规则(比如最快路线)
- 第二次请求:发起目标地点→起点的路线请求,切换另一类路线规则(比如最短距离、避免高速、优先风景路线等)
- 合并两次路线的路径数据,在地图上展示完整的环形路线
修改后的相关代码
import MapKit //ROUTE START class RouteManager: NSObject, MKMapViewDelegate { var mapView: MKMapView! var originCoordinate: CLLocationCoordinate2D! var destinationCoordinate: CLLocationCoordinate2D! // 发起环形路线请求 func requestLoopRoute() { // 1. 请求去程路线(优先最快路线) let goRequest = MKDirections.Request() goRequest.source = MKMapItem(placemark: MKPlacemark(coordinate: originCoordinate)) goRequest.destination = MKMapItem(placemark: MKPlacemark(coordinate: destinationCoordinate)) goRequest.transportType = .automobile goRequest.requestsAlternateRoutes = false let goDirections = MKDirections(request: goRequest) goDirections.calculate { [weak self] response, error in guard let self = self, let goRoute = response?.routes.first else { return } // 2. 请求返程路线(优先最短距离+避开高速) let returnRequest = MKDirections.Request() returnRequest.source = MKMapItem(placemark: MKPlacemark(coordinate: self.destinationCoordinate)) returnRequest.destination = MKMapItem(placemark: MKPlacemark(coordinate: self.originCoordinate)) returnRequest.transportType = .automobile returnRequest.requestsAlternateRoutes = true // 设置返程路线偏好,确保和去程路径不同 returnRequest.routePreferAvoidsHighways = true returnRequest.routePreferShortestDistance = true let returnDirections = MKDirections(request: returnRequest) returnDirections.calculate { [weak self] response, error in guard let self = self, let returnRoute = response?.routes.first else { return } // 3. 合并并展示完整环形路线 self.mapView.addOverlay(goRoute.polyline) self.mapView.addOverlay(returnRoute.polyline) // 调整地图视野,完整容纳环形路线 let combinedBounds = goRoute.polyline.boundingRect.union(returnRoute.polyline.boundingRect) self.mapView.setVisibleMapRect(combinedBounds, edgePadding: UIEdgeInsets(top: 50, left: 50, bottom: 50, right: 50), animated: true) } } } // 绘制路线,区分去程和返程颜色 func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer { guard let polyline = overlay as? MKPolyline else { return MKOverlayRenderer(overlay: overlay) } let renderer = MKPolylineRenderer(polyline: polyline) renderer.lineWidth = 4 // 用不同颜色区分去程和返程 renderer.strokeColor = polyline == mapView.overlays.first ? .systemBlue : .systemGreen return renderer } } //ROUTE END
关键注意点
- 如果切换偏好后返程仍和去程路径重合,可以开启
requestsAlternateRoutes = true,从备选路线中筛选和去程路径差异较大的路线使用 - 除了示例中的路线偏好,还可以根据场景使用
routePreferAvoidsTolls(避开收费路段)、routePreferRuralRoutes(优先乡村路线)等属性调整路径规则
内容的提问来源于stack exchange,提问作者Dakota
相关产品推荐
相关产品推荐

