feat(weather): global rain radar from RainViewer

Add a Global (RainViewer) option to Rain radar beside the US MRMS
radar. The proxy pins RainViewer's tile host, validates frames and
Web Mercator tile coordinates, and limits upstream tile requests to
80 a minute. Globe basemaps draw the tiles; on 3D Tiles the shell
composes them into one equirectangular image per frame and detail
window.

Co-authored-by: Sandiv Dathunarachchi <[email protected]>
This commit is contained in:
Bilawal SidhuandSandiv Dathunarachchi committed 2026-09-28 20:46:58 -05:00
1 parent e7707d9a0f
commit d496dd9f33
21 files changed
+1207 -81

No files matched your search

+11 -3
View File
@@ -93,6 +93,14 @@ catalog construction owns each instance.
Wind animates one forecast without advancing forecast time. Separate Weather
observation layers provide radar and satellite history; none claims measured cloud volume.
Rain radar defaults to **US (NOAA)** MRMS; **Global (RainViewer)** selects a keyless
composite where national radars exist, with the past 2 hours at 10-minute steps
on the shared observed timeline, and the region choice persists in share links.
RainViewer uses pinned, validated 256 px Web Mercator tiles through zoom 7,
5-minute metadata caching and a server-wide 80-tile-request rolling-minute limit;
gaps do not mean no rain. Globe hosts draw those tiles directly; on 3D Tiles,
the 6.2 km shell composes at most 24 tiles per full frame or detail window and
reprojects them to an equirectangular image.
Weather imagery drapes onto the globe basemap. On photorealistic 3D Tiles each
observed product is instead a raised, translucent shell: one rectangle over the
product bounds at a fixed height (global infrared 5.5 km, regional infrared
@@ -105,10 +113,10 @@ other map content draws over the shells, and shells are not pickable. A
map-source change tears down one renderer and restages the shown observation on
the other. A map without an imagery host pauses history while metadata refresh
continues, then resumes when a host returns.
Globe tiled products use 256 px tiles to maximum level 6. The tile proxy accepts
NOAA globe tiled products use 256 px tiles to maximum level 6. The tile proxy accepts
size=256 (default), 512 or 1024 and keys cached bytes by size, retaining the
24-hour immutable response and eight upstream slots. The image proxy serves every
product as one whole-extent PNG at its advertised bounds, up to 4096×2048 for
NOAA product as one whole-extent PNG at its advertised bounds, up to 4096×2048 for
radar, regional infrared and lightning and 2048×1024 for global infrared
(`size=W×H`, default the maximum), capped at 16 MiB and cached by product, time
and size. NOAA returned each of these sizes from a single request in a live
@@ -127,7 +135,7 @@ full-extent image covers it. A new frame swaps the full-extent image first and
keeps the previous detail image until the new one decodes, over at most one
newer frame; a moved window hides until its image arrives. Global
infrared contrast depends on the requested extent, so it keeps one image. The
image proxy accepts `bbox=west,south,east,north` for every product: inside the
image proxy accepts `bbox=west,south,east,north` for every NOAA product: inside the
product bounds, 2:1 within 1 %, rounded to 0.25°, up to 4096×2048 (the
default), cached by product, time, size and bbox. Diagnostics report
`shell.detail` (`bbox`, `size`, `ready`, `enabled`).