Как оживить 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 начинает загружать их все сразу.
Вопрос в том, есть ли лучший способ добиться этого.