Distinct heading-aware marker symbols for live feeds (aircraft/trains/vessels) #3

Merged
sirius merged 1 commit from feat/distinct-live-markers into master 2026-08-27 20:50:05 -04:00
Owner

Replaces the shared colored-dot rendering for the ADS-B aircraft, Amtraker trains, and AISStream vessel feeds with distinct heading-aware SVG glyph markers.

  • Aircraft: plane silhouette, rotated to heading, color-coded by altitude (existing altColor)
  • Trains: railcar glyph, respects per-train iconColor, rotated when heading present
  • Vessels: sailboat glyph, rotated to heading, color by speed (teal/gray)

Implementation notes:

  • Icons cached per (feed, color, heading) so thousands of markers reuse a bounded set of L.divIcon instances (per requirement)
  • Rotation applied to the inner glyph span only, never the marker container — clustering, spiderfy, and iconAnchor stay intact
  • Missing/NaN/empty heading falls back to an upright glyph
  • Null lat/lon guard preserved; popups unchanged (pointPopup)
  • Color values sanitized against inline-style breakout (train iconColor is API-sourced)

Verified with a mocked-Leaflet harness (30 assertions: distinct glyphs, caching, heading rotation, upright fallback, clustering threshold, null-lat skip, popup binding) + rsvg render of all three glyphs.

Replaces the shared colored-dot rendering for the ADS-B aircraft, Amtraker trains, and AISStream vessel feeds with distinct heading-aware SVG glyph markers. - **Aircraft**: plane silhouette, rotated to heading, color-coded by altitude (existing altColor) - **Trains**: railcar glyph, respects per-train iconColor, rotated when heading present - **Vessels**: sailboat glyph, rotated to heading, color by speed (teal/gray) Implementation notes: - Icons cached per (feed, color, heading) so thousands of markers reuse a bounded set of L.divIcon instances (per requirement) - Rotation applied to the inner glyph span only, never the marker container — clustering, spiderfy, and iconAnchor stay intact - Missing/NaN/empty heading falls back to an upright glyph - Null lat/lon guard preserved; popups unchanged (pointPopup) - Color values sanitized against inline-style breakout (train iconColor is API-sourced) Verified with a mocked-Leaflet harness (30 assertions: distinct glyphs, caching, heading rotation, upright fallback, clustering threshold, null-lat skip, popup binding) + rsvg render of all three glyphs.
sirius added 1 commit 2026-08-27 20:48:45 -04:00
Replace the shared colored-dot renderPoints for live feeds with per-feed SVG
glyphs on heading-aware divIcons:
- Aircraft: plane silhouette rotated by heading, color-coded by alt
- Trains: railcar glyph (respecting per-train iconColor), rotated when heading present
- Vessels: sailboat glyph rotated by heading, color by speed (teal/gray)

Icons are cached per (feed, color, heading) so thousands of markers reuse a
bounded set of L.divIcon instances. Rotation is applied to the inner glyph
span only (never the marker container), keeping clustering, spiderfy, and
iconAnchor intact. Missing/NaN heading falls back to an upright glyph.
Color values are sanitized against style-attribute breakout.
sirius merged commit dd7a09aadd into master 2026-08-27 20:50:05 -04:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: sirius/osint-dashboard#3
No description provided.