Mapbox разноцветная полилиния - PullRequest
0 голосов
/ 27 октября 2019

Я перевожу свое приложение в 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)
...