Как оживить MGLRasterTileSource

Я использую сторонний API для отображения плиток с метеорологическим радаром. Имеет формат http://example.com/2019-02-22T06:20:00/{z}/{x}/{y}.png

let source = MGLRasterTileSource(identifier: "weather", tileURLTemplates: ["http://example.com/2019-02-22T06:20:00/{z}/{x}/{y}.png"], options: [ .tileSize: 256 ])
let rasterLayer = MGLRasterStyleLayer(identifier: "weather", source: source)
style.addSource(source)
style.addLayer(rasterLayer)

Теперь у меня есть ряд дат, которые я хотел бы анимировать, меняя слой каждые x секунд.

let times = [
    "2019-02-27T16:35:00",
    "2019-02-27T16:40:00",
    "2019-02-27T16:45:00",
    "2019-02-27T16:50:00",
    "2019-02-27T16:55:00"
]

Мое текущее решение состоит в том, чтобы добавить один источник со слоями, соответствующими каждому time и показывать только слой текущего кадра

func mapView(_ mapView: MGLMapView, didFinishLoading style: MGLStyle) {
    // Add a new raster source and layer.

    for time in times {
        let identifier = "frame_\(time)"
        source = MGLRasterTileSource(identifier: identifier, tileURLTemplates: ["http://example.com/\(time)/{z}/{x}/{y}.png"], options: [ .tileSize: 256 ])
        let rasterLayer = MGLRasterStyleLayer(identifier: identifier, source: source)
        style.addSource(source)
        style.addLayer(rasterLayer)

        // rasterLayer.isVisible = false
        // workaround
        rasterLayer.rasterOpacity = NSExpression(forConstantValue: 0.01)
    }
    timer = Timer.scheduledTimer(withTimeInterval: 0.5, repeats: true) { timer in
        self.loop()
    }
}

func loop() {
    // Get the currently display layer to be hidden
    let previousRasterLayer: MGLRasterStyleLayer = ...
    // Get the next layer to be shown
    let nextRasterLayer: MGLRasterStyleLayer = ...

    previousRasterLayer.isVisible = false
    nextRasterLayer.isVisible = true

    // workaround
    previousRasterLayer.rasterOpacity = NSExpression(forConstantValue: 0.01)
    nextRasterLayer.rasterOpacity = NSExpression(forConstantValue: 1)
}

Хотя этот тип работает, он не кажется оптимальным, поскольку SDK Mapbox начинает загружать png слоя только тогда, когда он установлен видимым. Это заставляет слои быть размытыми во время загрузки. Небольшим обходным решением может быть установка непрозрачности растрового слоя равной 0,01; в этом случае Mapbox начинает загружать их все сразу.

Вопрос в том, есть ли лучший способ добиться этого.

0 ответов

Другие вопросы по тегам