Everything that fits is drawn normally first, the left canvas and the right
canvas agree exactly on those. Then each marker that did not fit is
ring-searched at a small radius around where it really is, taking the angle
furthest from the markers already there. If no angle keeps the numbers
readable it is stacked below instead. Placement is
WG.marker.layout(). This page exists because
a canvas drawn asynchronously does not survive a headless screenshot,
so the widget's own markers cannot be checked that way. Here the same
WG.marker calls run synchronously on load, over bands standing in
for snow, rock, forest, a river and an airspace edge.
What to judge: a label is never overlapped by anything. Not by another
label, not by an arrow. Where "label" means the speed line and the altitude
line together. Arrows may overlap, but only partially:
ARROW_TOL keeps two centres far enough apart that neither
swallows the other. Nothing fades. The leader line is the annotation,
and it says where a marker came from without needing to be interpreted.
The selection ring marks the station the popup is describing. Without
it the overlay answers a tap with a panel naming a station and no way to tell
which of a dozen arrows it came from. Blue because the rating palette is white,
green, yellow, orange, red and black, so it cannot be read as a wind strength.
Nothing is ever drawn further than one stack row from where it belongs.
The ring radii are generated up to that same bound, so the fallback can no
longer be worse than the search. It was, by three times, and that is what
"the stations at the bottom are so far apart" turned out to be. A marker that
cannot fit inside the bound is dropped rather than filed under the wrong
ridge: at 225 m per pixel, 104 px is 23 km from the real station and no leader
line rescues that. Positions are the real Zermatt cluster at
scale=3000. ← Tools