Я перевожу свое приложение в Mapbox, и одна из вещей, на которых я застрял, - это создание многоцветной ломаной линии, в которой цвет сегмента динамически устанавливается по скорости. Самое близкое, что я смог сделать, - это создать массив разноцветных линий и добавить их на карту как можно больше отдельных линий, но при этом время обработки и ухудшение частоты кадров слишком сильно, не говоря уже о том, что вы можете видеть различные сегменты. Этого легко достичь с помощью MapKit или Google Maps, но, насколько я могу судить, ломаная может иметь только один цвет в Mapbox.
Очень похожий вопрос был задан Здесь , но это было 3лет назад, и ответ, кажется, связан с использованием API направлений.
Основная функция выглядит следующим образом, и я создал собственный класс MGLMulticolorPolyline, чтобы я мог установить цвет
func locationPolyLine(locations : [Location], averageSpeed: Double, topSpeed: Double) -> [MGLMulticolorPolyline] {
var coordinates: [(CLLocation, CLLocation)] = []
var speeds: [Double] = []
let smallerLocationArray = locations.enumerated().filter({ index, _ in
index % 2 != 0
}).map { $0.1 }
for (first, second) in zip(smallerLocationArray, smallerLocationArray.dropFirst()) {
//create an array of coordinates
let start = CLLocation(latitude: first.locLatitude, longitude: first.locLongitude)
let end = CLLocation(latitude: second.locLatitude, longitude: second.locLongitude)
coordinates.append((start, end))
let distance = end.distance(from: start)
guard let firstTimestamp = first.locTimestamp,
let secondTimestamp = second.locTimestamp else {continue}
let time = secondTimestamp.timeIntervalSince(firstTimestamp as Date)
let speed = time > 0 ? distance / time : 0
speeds.append(speed)
}
var segments: [MGLMulticolorPolyline] = []
var index = 0
for ((start, end), speed) in zip(coordinates, speeds) {
let coords = [start.coordinate, end.coordinate]
let segment = MGLMulticolorPolyline(coordinates: coords, count: 2)
if smallerLocationArray[index].lift == true{
segment.color = UIColor.blue
} else{
segment.color = segmentColor(speed: speed,
midSpeed: averageSpeed,
slowestSpeed: 0.0,
fastestSpeed: topSpeed)
}
segments.append(segment)
index += 1
}
return segments
}
}
ион добавляется на карту, как это
let multiColoredPolyline = MapboxHelper().locationPolyLine(locations: locationsArray, averageSpeed: avgSpeed, topSpeed: maxSpeed)
mapView.addAnnotations(multiColoredPolyline)