Routing

Snap raw GPS breadcrumbs to the road network

Map matching snaps raw GPS breadcrumbs to the road network — turn a noisy trace into the road-accurate route that was actually driven, with distance, time, road names, and a match confidence. matched: true only means a route was returned: gate on match_status (full | partial | none), and use coverage.unmatched_ranges to find the input points that did not match. road_names come from maneuver points — use /v1/trace-attributes for per-segment names. Sparsely-reported traces (consecutive fixes farther apart than the default breakage distance) can split into multiple sections — see breakage_distance_m. Total matched distance is limited to 200 km per call; split longer sparse traces by distance, not only by the 100-point cap. Costs 1 quota unit per call.

post/v1/map-match

Request

  • Base URL: https://geo.thinair.co
  • URL: https://geo.thinair.co/v1/map-match
  • Auth: HTTP bearer

Request body

costing'auto' | 'truck' | 'bicycle' | 'pedestrian'

Transport mode the trace was driven with. Default: auto.

vehicle_profilestring

Truck preset (DRY_VAN_53, FLATBED_48, BOX_TRUCK_26, …) — same 10-profile table as /v1/directions. Implies costing=truck.

search_radiusnumber

Snap radius in meters around each point (1–100). Increase for noisy GPS.

breakage_distance_minteger

Maximum gap, in meters, between consecutive fixes before the trace is split into separate sections (100–20000). Increase for sparsely-reported GPS, such as fleet units reporting every several minutes on a highway. Optional — omitted uses the default.

Example request

{
  "shape": [
    {
      "lat": 47.6205,
      "lon": -122.3493
    }
  ],
  "costing": "auto"
}

Response

Matched route. See geojson / geometry for the snapped line.

matchedboolean required

True when a route was returned for the trace. It does NOT mean the whole trace matched — use match_status.

distance_kmnumber required
duration_secondsnumber required
confidencenumber required

0–1: fraction of input GPS points within the snap tolerance of the matched route. A distance heuristic: it ignores point order and which parallel roadway was matched. For the matcher's own per-point result use match_status / coverage.

road_namesstring[] required
legsobject[] required
costingstring required
geojsonobject
geometryobject
match_status'full' | 'partial' | 'none' nullable required

Whole-trace match status from the matcher's own per-point results. full: every input point was matched or interpolated onto the road network AND the match is one continuous section. none: no input point was matched or interpolated. partial: anything else — some points unmatched, or the match broke into more than one section. null when the per-point check could not be completed; coverage.unavailable_reason says why. Gate on this field, not on matched.

Changes

No recorded changes to this operation across all 1 revision of this API.