Nudged markers over terrain

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

nudge on

nudge off. What is lost