v1.7.0
Aug 19, 2026
✨ Features
- Support animated vector weather layers on the timeline. Point, line, and polygon layers (e.g. lightning strikes, storm cells, alerts, tropical cyclone tracks) now play and scrub alongside raster and encoded layers.
- Extend the custom Metal rendering pipeline to every vector layer type. Circle, symbol, fill, line, and heatmap layers now render through MapsGL rather than the underlying Mapbox or MapLibre style layers.
- Update built-in layer configurations to bring them in line with the latest JavaScript MapsGL SDK.
🐞 Bug Fixes
- Fix the tropical cyclone layers, which were incomplete in several ways: track and forecast lines rendered nothing, every hurricane-strength storm drew the low-pressure "L" glyph, a storm's position marker and icon disappeared whenever the timeline playhead sat at the present, archive position markers and storm name labels never rendered at all, and tapping a storm produced an empty callout. Storm callouts now show name, advisory number, timestamp, category, and wind speeds, and position icons rotate as they do in the JavaScript MapsGL SDK.
- Fix the air quality category layers (AQHI and the AQI category variants) rendering a compressed color scale. Any value at or above the last stop clamped to a mid-scale color, so the top colors were never produced — an AQHI of 12 rendered green-yellow instead of red.
- Fix
lightning-threats-polygonsandhail-threats-polygonsstacking in the wrong order, which drew the longest-range threat zone on top of the imminent one instead of underneath it. Also addsFillPaint.sortDirection(defaulting to.ascending) so a fill layer can declare descending sort. Their bar legends also no longer label bar values as times.
🛠 Improvements
-
Broadly optimize performance and memory across layer types to better handle the new Metal-based vector layers and expanded animation support.
-
Rename
IconPaint.fixedSizetosize, and move the old sprite-size multiplier to a newscaleproperty, so each name matches what it holds and aligns with the JavaScript MapsGL SDK.IconPaint.sizeis now an absolute size in points and accepts a constant or a data-/zoom-driven expression, whileIconPaint.scalecarries the formersizemultiplier semantics. All affected call sites fail to compile, so no behavior changes silently. TheCGSizeconvenience initializer that existed only to disambiguate the two fields has been removed.// Before icon.fixedSize = .constant(CGSize(width: 24, height: 24)) icon.size = .constant(1.5) // After icon.size = .constant(CGSize(width: 24, height: 24)) icon.scale = .constant(1.5)