You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 04:32:26