Skip to Content
This documentation is provided with the HEAT environment and describes this HEAT instance.
DevelopersRunnerscore-utilsentity-state-to-mapdisplay

entity-state-to-mapdisplay

entity-state-to-mapdisplay turns time-ordered entity-state records into one mapdisplay channel of movement tracks. The MapDisplay widget plays those tracks back on a map.

Entity-state records are the JSON records array that hydrate-protobuf-v2 emits with extractionTarget: EntityState. entity-state-to-records emits the same shape from DIS traffic. The node groups records by simulation time, evaluates JMESPath (a query language for JSON) expressions to read each entity’s position, and builds one movement per entity.

The output is one Channel inside a data service payload. It is not a flight path. Use entity-state-to-flightpath for the 3D FlightPath widget.

When to use

Use this node when a Next dashboard needs a playable map of where entities were. It covers ground, surface and air tracks equally.

Pipeline position

hydrate-protobuf-v2 (EntityState) -> entity-state-to-mapdisplay -> json-merge -> dashboard-v2

The node reads the latest output of one parent.

Configuration

Configuration is required. latField and lonField must be set.

KeyTypeRequiredDefaultDescription
entriesPathstringNorecords[*]JMESPath to the array of time-ordered records.
timeFieldstringNosimulation_time_secondsDotted path from each record to its simulation time.
entitiesPathstringNoentity_state.entityJMESPath from each record to its entity object or array of objects.
entityNameFieldstringNonameDotted path from each entity to its name.
entityNamesarray of stringNononeNames of entities to plot. When absent or empty, every entity with latitude and longitude values is plotted.
latFieldstringYesnoneJMESPath from each entity to its latitude.
lonFieldstringYesnoneJMESPath from each entity to its longitude.
headingFieldstringNo""Optional JMESPath to heading. Omitted from points when empty.
speedFieldstringNo""Optional JMESPath to speed. Omitted from points when empty.
altFieldstringNo""Optional JMESPath to altitude. Omitted from points when empty.
baseCapturedAtstringNo""ISO 8601 base time stamp. When set, simulation time is a relative offset from this base. When empty, simulation time is absolute Unix epoch seconds.
realmNamestringNooverviewRealm name. The channel id becomes mapdisplay-<realmName>.
movementNamestringNoTracksDisplay name of the movement channel.
deploymentEntityPatternstringNo""Name prefix for entities whose visibility depends on a status field.
deploymentStatusFieldstringNo""JMESPath to the status value checked for entities matching deploymentEntityPattern. Those entities are plotted only while the value is 6, as integer, float, string, or the matching protobuf enum name.
falseDetectionConfigobjectNononeClassifies detection tracks as true or false by whether they are still present at session end. See below.

falseDetectionConfig keys:

KeyTypeRequiredDefaultDescription
entityPatternstringYesnoneName prefix identifying detection tracks. Matching entities are plotted even when absent from entityNames.
endToleranceSecondsnumberNo1A track is true when its last-seen time is within this many seconds of the session’s last recorded time.
trueSymbolobjectNononeSymbol config (allegiance, domain, unitType) for true tracks. Unused today, because true tracks are dropped from the output.
falseSymbolobjectNononeSymbol config (allegiance, domain, unitType) applied to false tracks.

Output

A data service payload with one mapdisplay channel. Coordinate fields are strings, as the mapdisplay shape requires.

{ "$heat-dataservice": { "version": "1.0", "groups": [{ "id": "mapdisplay", "name": "Map" }], "realms": [ { "name": "overview", "channels": [ { "id": "mapdisplay-overview", "name": "Tracks", "groupId": "mapdisplay", "shape": "mapdisplay", "data": { "movements": [ { "name": "ENTITY-A", "movement": [ { "latitude": "51.5", "longitude": "-1.5", "heading": "180.0", "speed": "5.0", "altitude": "0.0", "capturedDate": "2026-06-10T00:00:10Z" } ] } ], "mapStats": [] } } ] } ] }, "dashboard_users": [] }
  • Records are grouped by simulation time and sorted ascending. Input order within a time bucket does not matter.
  • capturedDate is an ISO 8601 UTC string derived from baseCapturedAt plus the offset, or from epoch seconds when baseCapturedAt is empty.
  • An entity with a missing or non-numeric position at one time stamp is skipped for that time stamp only.
  • When falseDetectionConfig is set, tracks classified false carry "hideAfterEnd": true so the MapDisplay widget hides the marker after its last point. Tracks classified true are not emitted, because the real entity already has its own track.

Limitations

  • One parent, latest output only.
  • The node fails when no entity has a valid position anywhere in the input.
  • hideAfterEnd is read by the MapDisplay widget only. The TacticalMap widget consumes the same shape but keeps the marker at its last point.
Opens your browser's print dialog. Choose "Save as PDF" as the destination.