Как оживить MGLRasterTileSource - PullRequest
       48

Как оживить MGLRasterTileSource

0 голосов
/ 27 февраля 2019

Я использую сторонний 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)
}

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

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

...