Introduction - what is map matching

The Map Matching component is responsible for determining where on the map to place the chevron.

Visually, it offers a cleaner user experience than displaying a raw location from the platform (e.g. GNSS, GNSS-INS, etc.): it can snap the chevron to the center-line of the road being driven, correct for inaccuracies in weak or unreliable signal, and smooth over discrepancies between the real world and the map used for navigation.

Functionally, it performs the vital role of translating raw location information into a format that is usable in the wider navigation context and the known road network—for example, determining what the speed limit is, whether the user should expect traffic, whether they have deviated from the planned route, or what their resulting ETA is.

This document details what inputs TomTom Map Matching requires to perform well—specifically, what enables it to accurately reflect the user’s actual location. It offers a breakdown of common use cases where relying only on GNSS is insufficient, and outlines what additional data is required, in what format, to achieve a correct result.

Use Cases - description of scope

This section defines the supported map matching use cases. Each use case is labeled with a descriptive title and a unique ID code, which is also used in the input requirements table below.

Basic functionality (UC0)

UC0 covers basic navigational functionality for GNSS-only systems. It defines the minimum set of fields that must be supported for map matching to function—these fields are strictly mandatory.

Map Matching is highly reliable in the following ideal conditions:

  • The vehicle drives on well-mapped highways and B-roads, with road classes matching the vehicle profile.
  • The environment is non-urban with an unobstructed sky view.
  • Where the road network is not complex, and no specifically parallel roads are present.
  • When the user does not deviate from the planned route—if one exists—and is not expected to perform unusual or complex maneuvers.
  • When the vehicle is traveling at relatively high speeds.

However, when multiple of these conditions are not met, map matching performance may begin to degrade. In such cases, the algorithm attempts to compensate for inaccuracies in the received data. For example, when the GNSS signal is lost inside a tunnel, map matching activates Software Dead Reckoning—advancing the chevron along its previously known path to provide a seamless driving experience.

Automotive-quality map matching (UC1)

This is the use case for basic automotive quality map matching. It requires the same minimum inputs to be supported as UC0, but receives them from a sensor-fused GNSS-INS solution (INS stands for Inertial Navigation System, also referred to as Automotive Dead Reckoning).

By using an Inertial Navigation System, the vehicle is always able to provide some positioning information—even in the absence of a GNSS signal. When satellites are available, the system can further fine-tune its positioning data. As such, the quality of these inputs is generally higher than what a GNSS-only system can provide, and also more consistently available. This means the map matching component relies less on its internal algorithms to correct what might otherwise be considered bad data.

For example, Software Dead Reckoning—mentioned in UC0—will never activate for a system that already provides Automotive Dead Reckoning, because we can rely on this system to always provide input. As a result, the navigation experience is more accurate and stable compared to UC0, with less guesswork involved.

The fields required for UC0 and UC1 are also required for all subsequent use cases.

Note:

  • UC0 and UC1 represent the minimum requirements for all subsequent use cases. The fields they define are considered part of the core functionality of the map matching component.

  • UC0 and UC1 do not differ in scope, but in quality: GNSS-INS can be trusted to a greater degree than pure GNSS. Fewer corrections are applied to data received via GNSS-INS by the TomTom map matching algorithms.

  • To support UC1—and to distinguish it from UC0—integrators must provide at least one additional field. Supplying any data required by the other use cases listed in this document (i.e., UC1.1 through UC1.5) is sufficient. This signals to the map matching component that the input data can be treated with a higher degree of confidence.

Correct positioning in tunnels & urban canyons (UC1.1)

Required fields: All fields from UC1 + satellites.visible + satellites.used + distanceTraveled.value Optional fields: distanceTraveled.error

UC1.1 covers cases of no or limited GNSS availability, such as in tunnels or some urban canyons.

The fields specified by UC1.1 are required for correcting the drift in input position that occurs naturally in the absence of (reliable) GNSS.

GNSS-INS systems, which integrate automotive sensor data but temporarily cannot calibrate it with GNSS, will provide position data that gradually drifts away from the vehicle’s actual position. In these cases, the increasing horizontalError will help the map matching component determine how much position (drift) correction needs to be applied. distanceTraveled helps determine the progress through the tunnel. The information about satellites helps determine when to apply this correction.

Correct vehicle heading displayed when reversing (UC1.2)

Required fields: All fields from UC1 + distanceTraveled.value + drivingDirection

Optional fields: distanceTraveled.error

UC1.2 covers the case of navigation while reversing. The expectation is for the chevron to move backwards, while still pointing in the same direction as the front (nose) of the vehicle.

When the fields required for UC1.2 are not provided, drivers may experience issues such as the perceived heading of the chevron flipping, the chevron getting stuck, or—worst case—the route being replanned, as the system may assume the car is somewhere else that matches its reported direction of travel.

Faster route deviation detection on highways (UC1.3)

Required fields: All fields from UC1 + lanesInView + drivenLaneIndex

Optional fields: turnLightIndicator

UC1.3 covers cases where the driven road contains multiple lanes that can be used to indicate where the driver will go—such as exits from highways.

When driving in areas where lane information is available in the map, integrating the required fields for UC1.3 enables faster or even instantaneous route deviation detection, route switching, or replanning. When these fields are not provided, or if there is insufficient map data, the map matching component is forced to rely on other indicators and may only detect and display deviations with a delay.

Lane Level Guidance (UC1.4)

Required fields: All fields from UC1 + lanesInView + drivenLaneIndex

Optional fields: -

UC1.4 covers cases of Lane Level Guidance—being able to show the driver, at lane level, where they are and where they need to be to continue along their planned route. This provides significant value for complex maneuvers involving multiple lanes.

It requires a perception system capable of relaying information about the vehicle’s current lane, as well as lane-level data availability in the map.

Correct vehicle position on stacked roads (UC1.5)

Required fields: All fields from UC1 + pitch.value

Optional fields: lanesInView + drivenLaneIndex + pitch.error

UC1.5 covers cases of stacked roads (also known as “3D roads”)—where multiple roads overlap and share similar latitude and longitude, but differ in altitude.

Since altitude is difficult for satellites to estimate accurately, the key input for supporting UC1.5 is the vehicle’s pitch data. Matching the pitch to the slope gradient of nearby connected roads is often the most effective way to help the navigation system distinguish between on-ramps, off-ramps, and parallel roads in complex multi-level road environments.

Required inputs – breakdown per use case

The table below details the fields required to support each use case. Fields from UC0 and UC1 form the baseline and must be supported for all subsequent use cases.

When a field may be reported as null, its value is considered optional—however, providing accurate values will improve overall performance.

In the table:

🟢 Green circle indicates a mandatory field (required to support the use case).

🟡 Yellow circle indicates an optional field (not strictly required but may improve performance).

NavSDK FieldDescriptionUC0UC1UC1.1UC1.2UC1.3UC1.4UC1.5Input expectationsImpact of bad data
location.position.point.latitudeLatitude value in degrees [-90.0, 90.0]🟢🟢🟢🟢🟢🟢🟢
  • Inputs arrive in sequence and follow a clear trajectory

  • Position is within ~15 m of actual location on open-air roads

  • Chevron matched incorrectly, jumps, unexpected replans
location.position.point.longitudeLongitude value in degrees [-180.0, 180.0]🟢🟢🟢🟢🟢🟢🟢
  • Within ~30 m in urban canyons, ~50 m in deep urban canyons
  • GNSS one-sigma errors accurately reflect real fix precision
location.position.horizontalError1-sigma horizontal error in meters, or null🟢🟢🟢🟢🟢🟢🟢
  • UC0: No position updates expected in tunnels

  • UC1: Tunnel drift should stay below 500 m

location.velocity.speed.valueVehicle speed over ground (GNSS) in m/s; 0 at standstill🟢🟢🟢🟢🟢🟢🟢
  • Value <400 km/h — not a hard limit, but a guideline for expected car speed. Higher values may cause unexpected map matching behavior
  • Matched to parallel roads more compatible with the incorrectly reported speed
  • Chevron does not follow any road
location.velocity.speed.error1-sigma speed error in m/s, or null🟡🟡🟡🟡🟡🟡🟡
  • Speed should not differ by more than 50% from estimates based on time and distance deltas
  • Speed must always be positive — reverse driving is indicated by the driving direction field
location.time.utcMillisecondsUTC fix time incl. leap seconds (ms)🟡🟡🟡🟡🟡🟡🟡
  • UTC timestamp should closely match when the location was received
  • No impact on real-time matching, but complicates log analysis and issue investigation
location.time.monotonicNanosecondsMonotonic timestamp of fix (nanoseconds); must use a single clock🟢🟢🟢🟢🟢🟢🟢
  • Monotonic clock must increase steadily—no backward jumps. Values must be positive and in nanoseconds
  • Chevron off-road, unexpected replanning, chevron stuck or jumping
location.attitude.course.valueHeading over ground (0–360°, relative to North); GNSS/INS value must freeze at standstill🟢🟢🟢🟢🟢🟢🟢
  • The value should not differ >25° from the car’s actual direction, or by more than 40° from estimates based on two consecutive raw location inputs
  • Chevron follows wrong road at forks, crossroads, or highway exits, causing unexpected route replanning
location.attitude.course.errorCourse error (1-sigma), or null🟡🟡🟡🟡🟡🟡🟡
location.providerEnum: Gnss, GnssIns, or Network; GnssIns extends Android provider set🟢🟢🟢🟢🟢🟢🟢
  • Value should match the source of the location update
  • Network provider will always result in off-road position
location.position.altitude.valueAltitude above ellipsoid (WGS-84/GCJ-02), meters [–20000, 20000], or null; unused for UC1.5
  • Altitude should be in the range [-400, 5000] m — values outside may indicate incorrect data
  • This data is not used in map matching, so it has no direct impact. Any negative effects depend on downstream usage
location.position.altitude.errorAltitude error (1-sigma), in meters; or null
location.satellites.visibleNumber of visible satellites [0–999], or null🟢
  • Should be null if unknown, 0 if no satellites are visible, or a positive number reflecting the actual count
  • Chevron follows a wrong or distant road near/through tunnels, or no road at all while in tunnel
location.satellites.used# of satellites used to fix [0–999]; class should be null if unknown🟢
  • Should be null if unknown, 0 if no satellites were used, or a positive number reflecting satellites used in the fix
location.distanceTraveled.valueDistance since last update in meters (if enabled)🟢🟢
  • Value should differ no more than 30% from actual distance driven since the last update
  • Chevron follows wrong road after crossroads; may jump forward or backward to adjust
location.distanceTraveled.error1-sigma distance error since last update, in meters; or null🟡🟡
location.drivingDirectionDriving direction: 0 = FORWARD, 1 = REVERSE (nullable)🟢
  • If provided, the value must accurately reflect the labeled driving direction
  • Chevron misaligned with driving direction, gets stuck, or doesn't follow any road
location.turnLightIndicatorTurn signal: 0 = OFF, 1 = LEFT, 2 = RIGHT, 3 = HAZARD; or null🟡
  • The provided indicator value should reflect the actual indicator status. Drivers must signal before deviating to benefit from this feature
  • Horizon data may be delayed, as deviations can't be predicted in advance
location.perception.lanesInView

number of drivable lanes detected in direction of travel; >0 if enabled, else Perception = null

🟢🟢🟡
  • Value must be ≥ drivenLaneIndex + 1 and only include lanes in the driving direction. It should remain accurate even when lanes are partially obscured or extend beyond the camera’s field of view. TomTom’s map data helps mitigate inaccuracies but cannot guarantee full correctness
  • Chevron continues on the original route after deviation or appears in the wrong lane
location.perception.drivenLaneIndex

Index of current lane (0 = leftmost, direction of travel); ≥ 0 if enabled, else Perception = null

🟢🟢🟡
  • The lane index should match the current lane. It should update when ~60% or more of the vehicle is in a new lane
location.attitude.pitch.value

Pitch angle (–45° to 45°), rotation around y′-axis of intermediate Navigation frame; or Attitude.pitch = null [*]

🟢
  • Pitch must be within [–45°, 45°] and reflect the vehicle’s actual angle. Errors must be in [0°, 360°]
  • Chevron matches the wrong road at forks or intersections with differing slopes
location.attitude.pitch.error

Pitch error (1-sigma), in degrees; or null [*]

🟡
location.attitude.yaw.value

Yaw angle (0°–360°), rotation around z-axis of Navigation frame; or Attitude.yaw = null [*]

  • Values must be within [0°, 360°]
  • The following data is not consumed, and so does not have a negative impact on map-matching performance. Impact depends on downstream use
location.attitude.yaw.error

Yaw error (1-sigma), in degrees; or null [*]

location.attitude.roll.value

Roll angle [–180°, 180°], rotation around x″-axis of intermediate Navigation frame; or Attitude.roll = null [*]

  • Values: [–180°, 180°]. Errors: [0°, 360°]
location.attitude.roll.error

Roll error (1-sigma), in degrees; or null [*]

[*] Attitude class and rotation order

The Attitude class defines yaw, pitch, and roll rotation angles from the local Navigation (North East Down – NED) frame to the vehicle/body coordinate system, following the z–y′–x″ rotation order. The body frame is defined as follows (see also SAE J670e / SAE J2945/1):

  • The x-axis points toward the front of the vehicle.
  • The y-axis points toward the right side of the vehicle.
  • The z-axis points downward.

The rotation order is defined as follows:

  1. Yaw: Rotate the navigation frame axes xn and yn around the zn axis by the yaw angle.
    → This results in an intermediate reference frame with axes x′, y′, z′, where z = zn.

  2. Pitch: Rotate the x′ and z′ axes around the y′ axis by the pitch angle.
    → This results in another intermediate frame with axes x″, y″, z″, where y = y′.

  3. Roll: Rotate the y′ and z″ axes around the x″ axis by the roll angle.
    → The resulting frame after all three rotations is the body frame.

SAE diagram
SAE J2945/1