TomTom OV2 — Proprietary POI Overlay for GO/Start: Binary Structure and Speed Cameras
TomTom OV2 is the proprietary binary POI-overlay format used by TomTom personal navigators (GO, Start, Via, Rider, Trucker), letting users layer their own points of interest on top of the base TomTom Map. The .ov2 file carries POIs only — no road geometry, no routing graph, no area labels: it's a pure point overlay with category, coordinates, and a label per record. The base map comes from proprietary TomTom Map (closed format, sold as a content SKU), and the OV2 file sits next to it and is loaded by the device separately — usually in ~/Maps/<region>/ on the microSD or internal storage. The format appeared in the mid-2000s alongside the TomTom GO era and has barely changed in twenty years — which is exactly why it's still the standard carrier for the most popular use case: loading speed-camera databases (ScDb.tk, POIPlaza) onto devices that don't carry a paid TomTom Safety Cameras subscription. On osm2cdr.ru, tomtom_ov2_exporter.py pulls POIs from local OSM via PostGIS, filters by user-selected category, and packages the result as .ov2 plus a companion BMP icon (24×24) ready to copy onto a device.

History: POI overlay in the GO/Start era
TomTom is a Dutch company founded in 1991 as Palmtop Software, shipping PDA apps for Psion and Palm Pilot. The breakthrough came in 2002 with TomTom Navigator — the first mass-market PDA navigator for the Compaq iPaq. In 2004 came the TomTom GO — a stand-alone, all-in-one device with screen, GPS receiver, and pre-loaded maps. By 2006 the GO line led the European personal-nav market and stayed there until the late 2010s, when smartphones running Google Maps and Waze took over the mass-market slot.
OV2 emerged during that GO/Start era around 2005–2006. The original goal was to let the user add custom POIs: a friend's house, a favorite restaurant, a corporate office, a fishing spot. TomTom never published a formal spec, but the binary layout is so plain that community reverse-engineering nailed it down quickly. By 2007 free tools existed: POIEdit (Windows, by Steffen Boecker), TTMaker, TomTomMax POIs — all could create, edit, and convert OV2 from CSV/GPX. In parallel, aggregator sites blossomed: POIPlaza.com, ScDb.tk (speed cameras), POI-Factory — users downloaded .ov2 and dropped it into the device's map folder.
The long-running OV2 use case is speed cameras. Before Waze and on-phone alerts became universal, drivers bought camera databases in exactly this format: ScDb.tk shipped weekly updates for all of Europe at ~5–10 euros a year. When TomTom launched their own Safety Cameras subscription at ~$30/year, the community alternative kept living as a "forever-free" option — and still does: even in 2026, TomTom forums actively swap fresh OV2 updates for Europe.
Inside OV2: type 1/2/3 records
A .ov2 file is a stream of variable-length records, with no header, no index, no footer. Each record starts with a one-byte type code identifying what it is:
- Type 1 (deleted/skipped) — a tombstone for a removed record. Used by editors like POIEdit: instead of physically repacking the file, the editor flags the record as deleted (type 1) and readers skip it. The bytes still occupy disk space but never surface in UI.
- Type 2 (single POI) — the main point record. Layout: 1 byte type (=2) + 4 bytes length (little-endian uint32, total record size including type/length) + 4 bytes longitude (signed int32, in micro-degrees — WGS84 longitude multiplied by 100000) + 4 bytes latitude (signed int32, same micro-degrees) + N bytes label (ASCII or Latin-1 string, null-terminated). Minimum record size is 14 bytes (no label) —
02 0E000000 lonLE latLE 00. - Type 3 (bounding box rectangle) — a service record describing the rectangle that encloses the next N points. Layout: 1 byte type (=3) + 4 bytes length + 4 bytes west_lon + 4 bytes south_lat + 4 bytes east_lon + 4 bytes north_lat. The bbox is used by the device as a preview filter: "if this bbox doesn't intersect the current map view, skip loading the next N points into memory." It's a performance optimization for files with 100K+ POIs.
Coordinates are critical. Micro-degrees means a latitude of 55.7558° (central Moscow) is encoded as 5575580 in int32. That gives ≈11 cm resolution at the equator — far more than enough for POIs. Signed int32 is standard two's complement, so negative coordinates (Western Hemisphere, Southern Hemisphere) just flip the high bit.
Label encoding is typically ASCII or Latin-1 (Windows-1252). UTF-8 isn't guaranteed: different TomTom firmware versions respond to UTF-8 in OV2 differently. The safe path is to convert to Latin-1, transliterating non-Latin scripts (Cyrillic, CJK) — or to use Windows-1251 at your own risk. On osm2cdr.ru we transliterate Cyrillic POI names to Latin by default (e.g., "Кофейня на Тверской" → "Kofejnja na Tverskoj") for maximum compatibility.
The companion BMP icon is usually 24×24 pixels, 16 or 256 colors, standard Windows Bitmap. The icon sits next to the .ov2 in the same folder with the same basename: speed_cameras.ov2 + speed_cameras.bmp. The device applies the icon to the entire category — meaning one OV2 file = one category = one icon. If you need to differentiate sub-types visually, you have to ship multiple .ov2 files.
Use cases
Speed cameras (the canonical use case). Speed-trap databases, red-light cameras, average-speed sections. Users download a fresh weekly .ov2 from ScDb.tk or POIPlaza, drop it onto the device, and get an alert 200 meters before the camera with the typical beep. Before Waze, this was the European standard. On osm2cdr.ru we offer direct export of highway=speed_camera from OSM — community data is often fresher than paid feeds, especially for smaller countries.
Custom corporate POI fleet. Logistics companies, taxi fleets, mobile-service teams running TomTom Trucker / Rider in their vehicles: load an .ov2 with their own offices, warehouses, customer sea ports, unloading points. The driver sees "their own" points on the map without searching by address. Workflow: ops exports CSV from the ERP monthly → converts to OV2 → pushes to fleet via MyDrive Connect. On osm2cdr.ru we support that flow through arbitrary custom POI lists (upload CSV, we hand back .ov2).
Other mass-market scenarios: McDonald's / Burger King / KFC locations (for long-distance drivers), Tesla Superchargers, free campsites (campercontact / park4night exports), pet-friendly hotels, city parking meters. All were once distributed as .ov2 through POIPlaza and similar aggregators.
Workflow in OSM2CDR
In osm2cdr, tomtom_ov2_exporter.py is wired as a Beta exporter — the format is old and stable, but the toolchain makes it a bit heavier than pure-Python pipelines. Steps:
Step 1: PostGIS query. Through local_osm_loader.py we pull POIs from the planet_osm_point table for the chosen bbox and category. Category maps to OSM tag combinations: speed_camera → highway=speed_camera, cafe → amenity=cafe, fuel → amenity=fuel, and so on. We support ~30 categories in the standard UI selector; via /api/render with categories=... you can request any key=value combination.
Step 2: Coordinate transform + label cleanup. Each POI is converted from WGS84 lat/lon (float64) to micro-degrees (signed int32 = round(value × 100000)). The label comes from name:en (priority 1), then transliterated name from Cyrillic (priority 2), and finally falls back to category (Speed camera, Cafe). Labels are truncated to 250 chars — older TomTom GO firmware doesn't display longer.
Step 3: OV2 binary writer. We use a tiny in-house writer (~120 lines of Python) with no external dependencies. For each POI we emit a type-2 record: struct.pack('<BIii', 2, length, lon_micro, lat_micro) + label bytes + null terminator. Optionally, with bbox_optimization=true (default for files >5000 POIs), we sprinkle type-3 bbox records every 500 points — it speeds up loading on older devices. The file closes without a footer.
Step 4: Companion BMP icon. Pulled from /data/tomtom_icons/{category}.bmp (24×24, 256 colors, Windows BMP v3). Icons are drawn in osm2cdr's own style (palette consistent with landing pages). For arbitrary custom categories we fall back to a generic pin icon.
Step 5: Packaging. The user receives a ZIP containing osm2cdr-{category}.ov2 + osm2cdr-{category}.bmp + a short README on copying into the device's Maps/<region>/ folder via MyDrive Connect.
Limitations. The pipeline is fast (a typical 10×10 km export runs in 1–3 seconds), but with caveats: (1) very large bboxes with dense POIs (central Paris, Bangkok) can produce a 50K+ record .ov2 of 1–2 MB — older TomTom One devices may stutter when loading; we recommend splitting by category. (2) Cyrillic labels are transliterated by default — you can disable it with cyrillic_mode=raw, but readability then depends on firmware. (3) Icon customization is CLI-only via icon_url=... for now (UI selector is on the roadmap).
For users who want full manual control (custom icons, specific category mappings, merging several sources into one .ov2) — after our export you can always open the result in POIEdit (free Windows tool) and edit further.

OV2 vs Garmin GPI vs GPX waypoints
Garmin GPI is OV2's direct counterpart in the Garmin world. Same tasks (speed cameras, custom POI overlays), same distribution model (community sites with pre-built databases), same logic ("POI + companion icon + alert sound"). Differences: GPI supports built-in alerts (beep when approaching POI within N meters) as a first-class feature; OV2 alerts are firmware-side and activated globally per category. GPI is more compact thanks to LZ77 compression; OV2 is uncompressed binary. They are not cross-compatible: GPI on TomTom doesn't work, OV2 on Garmin doesn't work — classic platform lock-in.
GPX waypoints are the open XML alternative, readable by every device and app (Garmin BaseCamp, OsmAnd, Locus Map, Strava, GA aviation). It's not specialized for the navigator-overlay use case: no category-bound icons, no proximity alerts, no device-specific UI integration. But GPX is an interchange format: for long-term POI storage, you should keep GPX as the source of truth and generate OV2/GPI on demand. On osm2cdr.ru we ship both formats: GPX for universal exchange, OV2 for direct TomTom load.
Bottom line: for a modern TomTom GO/Start/Via, OV2 is the right pick (native, proven, firmware-supported). For cross-platform sharing (handing a POI bundle to a Garmin-using colleague) — go GPX. For full routing/map customization — OV2 doesn't apply at all; you'd need the proprietary TomTom Map, which is closed and unavailable to the community.

Conclusion
OV2 is the "small, simple, working" format that outlasted the rise and fall of the entire standalone-navigator era and still occupies a living niche among long-haul truckers, fleet operators, and speed-camera enthusiasts. It was never open by letter of spec, but the binary layout is so plain that community reverse engineering made it effectively open. If you've got a TomTom GO/Start/Via/Rider/Trucker in your vehicle and need to load custom POIs from OSM data, this is the right format — and from osm2cdr.ru the pipeline boils down to picking a bbox, a category, and downloading the ZIP.
Try the export now on /formats/tomtom-ov2/: pick a region, pick a category (speed cameras, cafes, fuel stations, or anything else), and in a few seconds you'll have an .ov2 + icon bundle ready for MyDrive Connect.
Related
- TomTom ITN — TomTom's route format for GO and Navigator
- Garmin GPI — POI overlay for Garmin GPS
- GPX — GPS tracks and waypoints exchange
- Garmin vs OsmAnd: navigation guide
Sources
- POIEdit, free OV2 editor for Windows — poiedit.com
- POIPlaza, community POI database — poiplaza.com
- ScDb.tk, speed camera database (OV2 weekly updates) — scdb.info
- TomTom MyDrive Connect — tomtom.com/mydrive-connect
- OpenStreetMap wiki on TomTom formats — wiki.openstreetmap.org/wiki/TomTom