# Read the map

URL: /investigate/map

See where the vehicle was at every event, where the ground stopped hearing it and whether terrain stood between it and range control. The map is drawn from elevation data inside your deployment and fetches nothing.



The map answers where. It shows where the vehicle was at each event, where the ground receive log went quiet and whether terrain blocked the radio path. Foxborne draws it from the site's elevation and survey data and never calls a tile service. An air-gapped enclave shows the same map as a connected one.

## Before you start [#before-you-start]

* The run has a GPS track. The map draws it from `vehicle_global_position` in the flight log, so a run with no GPS fix, such as an indoor hover, has no map.
* The run's site has elevation and survey data in your deployment. See [Why the map works offline](#why-the-map-works-offline).
* The examples use INC-0142, INC-0141 and INC-0137 from the example dataset.

## Read the map [#read-the-map]

<Steps>
  <Step title="Pick the view you need">
    | View     | Where it is                                                                                                                      | What it shows                                                                                                                                                            |
    | -------- | -------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
    | Site     | Top of the **Incidents** list                                                                                                    | A pin for each listed incident with a GPS track, at the vehicle's position at the first finding. Open pins are filled, **In review** pins outlined and closed pins faded |
    | Incident | **Where** on the **Reconstruction** tab, subtitled with the site name and &#x2A;*Track from vehicle\_global\_position.**         | The track, the incident window, receive gaps, numbered report events and the vehicle at the cursor                                                                       |
    | Run      | **Where** on the run page, subtitled with the site name and &#x2A;*Whole run from vehicle\_global\_position,** then the duration | The whole track, with a hollow circle at the start and a filled square at the end. A run with an incident shows it as the incident view does                             |

    A pin's tooltip gives the incident ID and title, then the place and its MGRS reference. Hover a row of the incidents table to highlight its pin and track, and hover a pin to highlight its row.
  </Step>

  <Step title="Move around">
    | Control                      | What it does                                                                                                                                 |
    | ---------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
    | **Zoom in** and **Zoom out** | Zoom by 1.6 times about the center                                                                                                           |
    | **Fit**                      | Frames the incident, with the tooltip **Fit the incident**. On the site view it frames the listed incidents, with the tooltip **Whole site** |
    | Drag                         | Pans the map. A move of more than 3 px counts as a drag, not a click                                                                         |
    | ⌘, Ctrl or Alt and scroll    | Zooms about the pointer. A plain scroll moves the page                                                                                       |
    | Hover                        | Shows the tooltip of a pin or an event marker                                                                                                |
    | Click                        | Selects an event, or opens an incident from its pin                                                                                          |
  </Step>

  <Step title="Follow the evidence">
    The map follows the timeline. The thick stretch of track is the timeline window, and it moves as you zoom and pan the timeline. The vehicle chevron sits at the selected event, or at the first finding when nothing is selected. While you hover the timeline, a hollow chevron with a time label follows the pointer.

    Report events carry their report numbers: a marker labeled 3 is E3 in the report and badge 3 on the vehicle diagram.
  </Step>

  <Step title="Read a position">
    The footer reads the vehicle's position at the cursor. When INC-0142 opens, it shows **Vehicle at** 14:32:01.204, `13R FP 7640 8765`, 1,148 m and **1.21 km to range control**. Hover the map to read **Pointer**, the MGRS reference and the ground height under the pointer instead.
  </Step>

  <Step title="Check the line to range control">
    A dashed line joins **Range control** to the vehicle, labeled with its horizontal length, such as **1.21 km to range control*&#x2A;. Inside a receive gap it turns amber and adds **, nothing received**.

    When terrain rises above the line, an amber × marks the worst point with **Terrain** *N.N* **m above the line*&#x2A;. The link label then adds **, terrain above the line**. Foxborne checks the line for the vehicle at the cursor, so move the cursor to check another moment.
  </Step>
</Steps>

## Base layers [#base-layers]

| Layer           | How it is drawn                                                                                                                                                                                                                                             |
| --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Contours        | From the elevation data. The interval follows the visible span: 5 m beyond 2,500 m across, 2 m beyond 900 m, 1 m beyond 300 m and 0.5 m closer in. Every fifth contour is heavier, and contours carry no labels                                             |
| Spot heights    | An × and the height, such as 1,390 m, on hills 15 m or more high                                                                                                                                                                                            |
| MGRS grid       | Lines 50, 100, 200, 500, 1,000 or 2,000 m apart: the first spacing that leaves at least 90 px between lines. Eastings run along the top and northings down the left, with 2 digits at 1 km spacing and wider, 3 digits at 100 to 500 m and 4 digits at 50 m |
| Survey boundary | A dashed line, with the land outside it dimmed. When the edge is in view it is labeled with the site name and **boundary**                                                                                                                                  |
| Site features   | Routes, tracks, the wash, the berm, the fence, the obstacle belt, lanes, pads and area labels, each in its own line style. A label without room is left out                                                                                                 |
| Range control   | A square with a mast glyph, labeled **Range control**                                                                                                                                                                                                       |
| Scale bar       | Bottom left: the first of 5, 10, 20, 50, 100, 200 and 500 m, 1 km and 2 km that is at least 60 px long                                                                                                                                                      |
| North arrow     | Bottom right, labeled N                                                                                                                                                                                                                                     |

## Evidence layers [#evidence-layers]

| Layer                  | How it is drawn                                                                                                                                                                                                                               |
| ---------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Track                  | The whole run from `vehicle_global_position`, as a thin dotted line                                                                                                                                                                           |
| Window                 | A thick line over the stretch of track inside the timeline window                                                                                                                                                                             |
| Receive gaps           | Thick amber dashes with hollow end circles, over the stretch where the ground receive log has a gap                                                                                                                                           |
| GPS error corridor     | An amber band from `sensor_gps.eph`. See below                                                                                                                                                                                                |
| Numbered events        | Report events in report order, at their track position. Markers within 16 px merge into one label, a range for consecutive numbers or a list such as 1, 3, 5. The tooltip gives E1 and the title, then the time in UTC and the MGRS reference |
| Vehicle                | A chevron along the heading at the cursor, ringed by a dashed accuracy circle of radius `eph`, never smaller than 7 px so it stays visible                                                                                                    |
| Link to range control  | A dashed line with its label, amber inside a receive gap. When range control is off the map, an arrow at the edge points to it                                                                                                                |
| Line-of-sight blockage | An amber × at the worst point, with the height of terrain above the line                                                                                                                                                                      |

Events on an unaligned companion clock have no position, so the map does not draw them.

### The GPS error corridor [#the-gps-error-corridor]

The corridor appears when the incident has a **Horizontal accuracy** lane, read from `sensor_gps.eph`, as INC-0141 does. Foxborne takes every track sample from 30 s before the timeline window to 30 s after it. It offsets each sample to both sides, square to the direction of travel, by the accuracy at that moment. The offset is never less than 0.5 m. Accuracy between samples is interpolated in a straight line.

The band's total width is 2 × max(eph, 0.5) m. In INC-0141, eph starts at 0.9 m, a band 1.8 m wide. It reaches 4.8 m while the receiver reports jamming, a band 9.6 m wide.

PX4 defines `eph` as "GPS horizontal position accuracy (metres)" and names no confidence level. The band shows the receiver's own estimate of its error, not a probability region.

## Coordinates [#coordinates]

The map gives every position in MGRS at 10 m, such as `13R FP 7640 8765`. That is the grid zone, the 100 km square, then four digits each of easting and northing. MGRS digits are truncated, not rounded, so the reference names the 10 m square that holds the point. The map shows no latitude or longitude.

The evidence inspector gives both. Its **Position** block shows the MGRS reference and **Latitude, longitude** to five decimals, in degrees north and west. **Settings**, under **Time and position**, states the rule: **Positions are shown as** MGRS at 10 m.

## Line of sight [#line-of-sight]

Foxborne draws a straight line from the top of the range control mast to the vehicle's antenna and samples it at 119 evenly spaced points. At each point it compares the terrain height with the height of the line. It keeps the largest amount by which terrain rises above the line and marks where that happens.

* **Mast top.** The ground height at range control plus the mast height, 12 m in the example dataset.
* **Antenna.** The ground height under the vehicle plus 1.6 m for a ground vehicle. For an aircraft, the height above launch from the incident's **Altitude** lane at that moment, never less than 1 m.
* **Not modeled.** Earth curvature, atmospheric refraction and Fresnel zone clearance.

A blocked line means terrain in the elevation model stands above the straight path. A clear line means only that the geometric path was open, not that the link had margin. In INC-0137, the ground receive log goes quiet while UGV-05 patrols the north side of the berm. For the whole gap, the elevation model puts the berm above the line from the mast to the UGV's antenna. The report still files the masking as a hypothesis.

## Why the map works offline [#why-the-map-works-offline]

The map is drawn in your browser from three things: the site's elevation data, its survey features and the run's track. Contours are computed from the elevation data as you zoom. No request goes to a tile service or any other map server.

| Data                   | Where it lives      | Handling                                                                                                               |
| ---------------------- | ------------------- | ---------------------------------------------------------------------------------------------------------------------- |
| Basemaps and elevation | Your object storage | Maps are drawn from elevation data you load. Nothing calls a tile service, so an air-gapped network shows the same map |

## Check the result [#check-the-result]

* When INC-0142 opens, the footer reads **Vehicle at** 14:32:01.204 with an MGRS reference, the ground height and the distance to range control.
* Selecting the kernel kill moves the chevron to its position, and the footer reads **Vehicle at** 14:32:04.118.
* Selecting the heartbeat gap turns the link line amber, and its label adds **, nothing received**.

## Troubleshoot [#troubleshoot]

**The run page shows No position.** The console adds "Indoor run with no GPS fix, so there is no track to draw." Bench, quarantined and rejected runs have no **Where** panel at all.

**A report event has no marker.** The footer reads "One event is on an unaligned clock, so it has no position", or the plural form. [Align the clock by hand](/investigate/align-a-clock) to place it.

**There is no GPS corridor.** The incident has no **Horizontal accuracy** lane from `sensor_gps.eph`.

**Range control is off the map.** Follow the arrow at the map edge, or select **Fit**.

**Scrolling moves the page.** Hold ⌘, Ctrl or Alt while you scroll to zoom the map.

## Next [#next]

<Cards>
  <Card title="Read the timeline" href="/investigate/timeline" icon="timeline">
    The window, the cursor and the events the map follows.
  </Card>

  <Card title="Inspect an event" href="/investigate/event" icon="eye">
    The Position block, with MGRS, latitude and longitude.
  </Card>

  <Card title="Air-gapped installation and updates" href="/deploy/air-gapped" icon="lock">
    Run Foxborne with no network path out.
  </Card>

  <Card title="Telemetry gap" href="/rules/telemetry-gap" icon="antenna">
    The rule behind the receive gaps on the map.
  </Card>
</Cards>
