Skip to Content
This documentation is provided with the HEAT environment and is relevant for this HEAT instance only.
Dashboard ComponentsLegacyMapDisplay (Legacy)

MapDisplay (Legacy)

Animated tactical map: routes, animated vehicle markers, optional cones of vision, static markers, comms overlay, and timeline playback.

Dashboard generation

Value
Runner nodedashboard (v1)
Frontendui/legacy via heat-next (MapDisplay / MapContainer)
Legacy APIGET /v1/Map (facade serves stored dashboard output)

Layout mount identifier

MapDisplay , set on each column in layoutConfiguration:

{ "component": "MapDisplay", "colspan": 12, "marginBottom": 24 }

See Legacy mount registry.

Data payload key

Map , top-level property in the object published by the dashboard node (not MapDisplay).

{ "Map": { "title": "...", "movements": [], "mapConfig": {} }, "dashboardUsers": ["<guid>"] }

Do not confuse with MapTimeline

MapDisplayMapTimeline
Mount idMapDisplayMapTimeline
Implementationheat-next MapContainerLegacy MapWithControls
Cones of visionYes (yaw / yaws)No

Top-level Map object

FieldRequiredDescription
titleYesPanel title
movementsYesArray of routes / vehicles
mapConfigNoMerged over defaults (see below)
mapStatsNoStats cards below the map
isSymbolToggleNoEnable symbol toggle UI

movements[] entry

FieldRequiredDescription
nameYesRoute label (e.g. crew name)
movementYesTime-ordered points
markersNoStatic or time-gated icons
commsNoComms on/off windows

Movement point (movement[])

FieldRequiredDescription
latitude, longitudeYes*WGS84 strings (*or x/y with pixel config)
x, yNoPixel coords when pixelPositioning: true
headingYesVehicle body heading (degrees)
yawNoSingle cone heading (degrees)
yawsNoMultiple cone headings on one vehicle
capturedDateYesISO timestamp for playback
speedNoUsed for speed-coloured polylines

Multiple turrets on one vehicle: use yaws on each point, e.g. "yaws": ["120", "45", "270"].

Multiple vehicles: separate objects in movements[].

Static markers[]

FieldDescription
idLegacy icon id (Friendly, Hostile, Target, …). Omit when using entity.
entityNATO symbol with optional circle and arc overlays (see below). When set, entity wins over id.
latitude, longitude or x, yPosition
capturedDateOmit for permanent markers; include for playback-gated appearance

NATO entity markers (markers[].entity)

Additive APP-6A-inspired symbols with optional geographic overlays. Legacy id icons are unchanged.

FieldRequiredDescription
allegianceYesfriend, hostile, neutral, unknown, or none (glyph only, no frame; e.g. sonobuoys)
domainYesairAndSpace, ground, seaSurface, subsurface (air / space normalize to airAndSpace)
unitTypeYese.g. submarine, carrier, frigate, helicopter, uav, sonobuoy, unknown, ship codes (FF, DD, …)
circleNoFilled circle under the icon (radius in meters, or pixels when pixelPositioning: true)
arcNoSector arc between circle and icon
symbolStrokeNoGlyph stroke colour (default black; use #F2F2F2 on dark maps for sonobuoys)
symbolStrokeWidthNoGlyph stroke width (default 1.5)

entity.circle

FieldRequiredDescription
radiusYesCircle radius (meters or pixels)
fillColorYesCSS fill colour
strokeColorYesCSS outline colour
strokeWidthNoDefault 1.5

entity.arc

FieldRequiredDescription
widthDegreesYesAngular span of the sector (degrees)
directionDegreesYesBearing from north, clockwise (degrees)
lengthYesOuter radius (meters or pixels; same rule as circle.radius)
fillColorNoSector fill (default semi-transparent blue)
strokeColorNoSector outline
strokeWidthNoDefault 1

Z-order (bottom to top): circle → arc → icon.

Numeric overlay values are conventionally strings in v1 payloads (same as lat/lng).

comms[]

FieldDescription
onDate, offDateISO range when comms icon is shown

mapConfig

Merged with defaults in ui/dashboard (MapConfig.ts). Common fields:

FieldDefaultDescription
mapURLMapbox URLTile layer
zoom, minZoom, maxZoom18, 5, 18Zoom limits
showMarkerConestrueDraw cones when yaw / yaws present
markerConeColors[]Per-movement, per-cone fill overrides (rgba or hex)
markerConeAngles[]Per-movement, per-cone aperture in degrees (smaller = narrower; omit entry for default ~64° path)
unityHeadingfalseUnity-style heading rotation
markerType"car""car", "circle", or arrow
polyLineColors["#0B5370", …]Route / marker colours by movement index
startMarkerFillColor#81842CStart waypoint fill
endMarkerFillColor#C13D40End waypoint fill
startMarkerStrokeColor"white"Start ring; use "transparent" to hide
endMarkerStrokeColor"white"End ring; use "transparent" to hide
pixelPositioningfalseUse x/y + originX/originY
originX, originY0Pixel origin
enableSpeedColorsfalseColour polylines by speed blocks
markerAnimationThreshold13Min metres between animation steps
enableCircleLabelGroupfalseShow legend below the map
circleLabelGroupLegend rows (circleLabelsData[]): colour swatches and/or NATO entity swatches

Full list: ui/dashboard/src/types/molecules/map.types.ts (MapConfigProps).

circleLabelGroup (NATO legend)

Set enableCircleLabelGroup: true and add rows to circleLabelGroup.circleLabelsData. Each row uses either color (plain swatch) or entity (NATO symbol swatch with the same fields as markers[].entity, without circle/arc).

"mapConfig": { "enableCircleLabelGroup": true, "circleLabelGroup": { "circleLabelsData": [ { "label": "Patrol track", "color": "#0B5370" }, { "label": "Submarine", "entity": { "allegiance": "hostile", "domain": "subsurface", "unitType": "submarine" } } ] } }

markerConeColors

Outer array index = movement index in movements[]. Inner array index = cone index (matches yaws order). Empty inner array uses default cone fill.

"markerConeColors": [ ["rgba(141,34,96,0.5)", "rgba(0,150,200,0.5)", "rgba(255,200,0,0.5)"], [] ]

markerConeAngles

Same indexing as markerConeColors. Each value is the full cone aperture in degrees. Smaller numbers produce a narrower cone; larger numbers widen it. Omit a cone entry (or use an empty inner array) to keep the built-in default path (~64°).

"markerConeAngles": [ [60, 30], [] ]

Examples

Minimal (single route, single cone)

{ "Map": { "title": "Exercise map", "movements": [ { "name": "Blue 1", "movement": [ { "latitude": "51.21431", "longitude": "-1.83710", "heading": "45", "yaw": "25", "speed": "2", "capturedDate": "2025-05-08T11:56:40.029Z" }, { "latitude": "51.21450", "longitude": "-1.83700", "heading": "60", "yaw": "35", "speed": "2", "capturedDate": "2025-05-08T11:56:42.029Z" } ], "markers": [] } ], "mapConfig": { "showMarkerCones": true } }, "dashboardUsers": [] }

Layout:

{ "layoutConfiguration": [ { "cols": [{ "component": "MapDisplay", "colspan": 12, "marginBottom": 24 }] } ] }

NATO entity markers with circle and arc (ASW-style)

{ "Map": { "title": "ASW tactical picture", "movements": [ { "name": "ASW Theatre", "movement": [], "markers": [ { "latitude": "50.8500", "longitude": "-1.4200", "entity": { "allegiance": "unknown", "domain": "seaSurface", "unitType": "unknown", "circle": { "radius": "8000", "fillColor": "rgba(255, 255, 128, 0.2)", "strokeColor": "rgba(255, 200, 0, 0.8)" } } }, { "latitude": "50.8200", "longitude": "-1.3800", "entity": { "allegiance": "hostile", "domain": "subsurface", "unitType": "submarine", "arc": { "widthDegrees": "60", "directionDegrees": "135", "length": "12000", "fillColor": "rgba(255, 80, 80, 0.2)", "strokeColor": "rgba(200, 0, 0, 0.7)" } } }, { "latitude": "50.8400", "longitude": "-1.4400", "capturedDate": "2025-06-15T12:02:30.000Z", "entity": { "allegiance": "none", "domain": "seaSurface", "unitType": "sonobuoy", "symbolStroke": "#F2F2F2", "circle": { "radius": "3500", "fillColor": "rgba(200, 230, 255, 0.12)", "strokeColor": "rgba(242, 242, 242, 0.5)" }, "arc": { "widthDegrees": "50", "directionDegrees": "90", "length": "3500" } } } ] } ], "mapConfig": { "zoom": 10, "enableCircleLabelGroup": true, "circleLabelGroup": { "circleLabelsData": [ { "label": "Unknown", "entity": { "allegiance": "unknown", "domain": "seaSurface", "unitType": "unknown" } }, { "label": "Sonobuoy", "entity": { "allegiance": "none", "domain": "seaSurface", "unitType": "sonobuoy", "symbolStroke": "#F2F2F2" } } ] } } }, "dashboardUsers": [] }

Full unit-type table and v2 channel equivalent: see Arbex reference MapEntityMarkers.md. Legacy reference JSON: tools/arbex/reference/legacy/MapEntityMarkers.json.

Multi-cone + custom colours + hidden start/end stroke

{ "Map": { "title": "EWAR overview", "movements": [ { "name": "Vehicle 1", "movement": [ { "latitude": "51.21431", "longitude": "-1.83710", "heading": "45", "yaws": ["25", "90", "180"], "speed": "2", "capturedDate": "2025-05-08T11:56:40.029Z" } ], "markers": [] } ], "mapConfig": { "showMarkerCones": true, "markerConeColors": [ ["rgba(141,34,96,0.5)", "rgba(0,150,200,0.5)", "rgba(255,200,0,0.5)"] ], "startMarkerStrokeColor": "transparent", "endMarkerStrokeColor": "transparent" } } }

Behaviour notes

  • yaw only: one cone per vehicle (unchanged from earlier releases).
  • yaws: multiple cones at the animated marker position; each value is a heading in degrees.
  • Playback: driven by capturedDate on movement points and the map playback control. The same field on markers[] gates when NATO markers (and their circle/arc overlays) appear.
  • NATO overlays: entity.circle draws a filled geographic circle; entity.arc draws a sector. Both use meters on lat/lng maps and pixels when mapConfig.pixelPositioning is true.
  • heat-next: after changing ui/dashboard map code, rebuild the dashboard library and run legacy prepare:heat-next so ui/legacy picks up changes.