Second beta of the 3.6 line. Reworks the wind overlay's data path: replaces the per-cell WMS GetFeatureInfo burst with a single bulk WCS GetCoverage call, makes the overlay available regardless of data_source, and tunes the streamlines to look right across the full zoom range.
No new user-facing config; existing wind YAML keeps working unchanged.
What's new in beta2
Bulk WCS fetch instead of N parallel WMS calls
Each refresh used to fire 60–290 parallel HTTP requests (one GetFeatureInfo per visual icon position, capped at 400). When two wind overlays were active that doubled. The browser's per-origin connection cap meant the burst serialised behind radar tile fetches.
Now: one WCS GetCoverage request per refresh, returns the whole bbox as a parsed text/plain U/V grid that both overlays sample locally. A 60-second TTL coalescing cache means concurrent fetches from icon + flow overlays share one upstream call.
For continental and world-scale viewports (z ≤ 4) the fetcher uses the WCS Scaling extension to downsample server-side — response stays ~2 MB max regardless of viewport size. Smaller bboxes still get native 0.25° data.
Wind overlay no longer requires data_source: DWD
ICON-D2 is a global model, so the overlay now stacks usefully on RainViewer / NOAA / DWD radars alike. Editor's Wind Overlay subpage shows for all sources. (dwd_time_override and forecast_minutes anchoring stays DWD-only — those concepts don't exist for the other sources.)
Zoom-aware streamlines
Three independent visual axes, all calibrated per refresh:
- Speed — pixel velocity scales with the map's pixels-per-meter at the current centre/zoom (clamped 0.01–0.3 px/(m/s)/frame). Earlier versions had constant pixel speed: a 10 m/s wind raced across the continent at low zoom and crawled at city zoom. Now motion is roughly proportional to ground speed.
- Streak length — particle lifetime + trail fade auto-recalibrate so the visible ribbon stays ~40 px regardless of zoom. Slow particles live longer and fade more gently.
- Detail multiplier (~0.09 at z3 → ~1.37 at z12) drives BOTH particle count AND lifetime. Continental views get fewer, shorter-lived streaks; city views get more, longer-lived ones.
Hour-aligned refresh
Wind now self-schedules a refresh at HH:00:30 of each clock hour — exactly when the underlying ICON model bucket changes (or when DWD publishes a fresher run for the same hour). One fetch per hour per overlay; no fixed-interval polling that returns identical data.
Editor cadence note
A new italic line under the Wind Overlay subpage description identifies the source (DWD ICON-D2 forecast, global 0.25°) and the refresh cadence. Translated into all 11 supported languages.
Known issues (will fix before 3.6.0 stable)
- Wind streaks render visually above markers and popups. Marker/popup clicks still work (the canvas has
pointer-events: none); this is purely visual layering. The fix needs anL.Layersubclass to participate in Leaflet's renderer-bounds + setPosition lifecycle — earlier attempts to put the canvas insidemapPaneproduced a position offset bug that needs deeper investigation. - No dateline wrap on the wind layer. When a low-zoom view's bbox crosses the antimeridian (e.g., a Pacific-centred view at extreme longitudes), the wrapped strip on one edge renders without wind data. Affects the small fraction of users centred at high or low longitudes.
Tests
370 → 399 (net +22 after dropping 7 standalone bilinearUV tests covered by sampleWindGridBilinear). New cases pin: WCS text parser, sampling helpers (nearest + bilinear), fetchWindGrid URL building including adaptive scaling and bbox clamping, WindGridFetcher coalescing.
Cumulative since 3.5.0
Builds on the 3.6 alpha line and beta1:
- DWD as a fully-supported data source — 3.6.0-alpha1
- Static-frame mode — 3.6.0-alpha2
- NWS lex paint sort + XSS hardening — 3.6.0-alpha3
- DWD coverage-mask cross-fade fix — 3.6.0-alpha4
- DWD wind overlay (PR #133, @genericJE) — 3.6.0-beta1
- Wind overlay bulk-fetch architecture + visual tuning + global availability — 3.6.0-beta2 (this release)
Upgrade notes
No breaking changes; no config migration. Existing wind YAML continues to work as-is. Users with non-DWD radar sources who didn't have wind before can now enable it with the same dwd_wind / dwd_wind_flow config keys.
Full Changelog: v3.6.0-beta1...v3.6.0-beta2