Here is a code snippet that lets you tap 2 points on the map to calculate a route and verify that MapPolyline is still rendered below the traffic layer in certain cities, despite using .mapOverlayLevel(level: .aboveRoads). Try highways
import SwiftUI
import MapKit
struct ContentView: View {
@State private var position: MapCameraPosition = .region(MKCoordinateRegion(
center: CLLocationCoordinate2D(latitude: 51.5, longitude: -0.1),
latitudinalMeters: 2000,
longitudinalMeters: 2000
))
@State private var tappedCoordinates: [CLLocationCoordinate2D] = []
@State private var routePolyline: MKPolyline? = nil
@State private var isCalculating = false
var body: some View {
ZStack(alignment: .bottom) {
MapReader { proxy in
Map(position: $position) {
if let polyline = routePolyline {
MapPolyline(polyline)
.stroke(.blue, lineWidth: 10)
.mapOverlayLevel(level: .aboveRoads)
}
ForEach(tappedCoordinates.indices, id: \.self) { i in
Marker("\(i + 1)", coordinate: tappedCoordinates[i])
.tint(i == 0 ? .green : .red)
}
}
.mapStyle(.standard(showsTraffic: true))
.onTapGesture { screen in
guard let coord = proxy.convert(screen, from: .local) else { return }
if tappedCoordinates.count < 2 {
tappedCoordinates.append(coord)
}
}
}
VStack(spacing: 12) {
if tappedCoordinates.count == 2 {
Button(isCalculating ? "Calculating..." : "Calculate Route") {
Task { await calculateRoute() }
}
.buttonStyle(.borderedProminent)
.disabled(isCalculating)
}
Button("Clear") {
tappedCoordinates = []
routePolyline = nil
}
.buttonStyle(.bordered)
}
.padding()
}
}
private func calculateRoute() async {
guard tappedCoordinates.count == 2 else { return }
isCalculating = true
let request = MKDirections.Request()
request.source = MKMapItem(placemark: MKPlacemark(coordinate: tappedCoordinates[0]))
request.destination = MKMapItem(placemark: MKPlacemark(coordinate: tappedCoordinates[1]))
request.transportType = .automobile
do {
let directions = try await MKDirections(request: request).calculate()
routePolyline = directions.routes.first?.polyline
} catch {
print("Route error: \(error)")
}
isCalculating = false
}
}