
Speed Camera GPIs for Garmin Devices
More available soon or on request - refresh page to see latest links.
download Austria speed cameras download Belgium speed cameras download France North speed cameras download France South speed cameras download Germany North speed cameras download Germany South speed cameras download Greece speed cameras |
download Holland speed cameras download Italy speed cameras download Luxembourg speed cameras download Sweden speed cameras download Spain speed cameras |
Garmin GPI file structure
![]() |
We converted gpx files to gpi with image 48x48.! NOT 24x24 Extra gpi files have been added before uploading map. New POIS:
Make sure the your gpx files do not contain polygons or tracks gpx should only contain: Latitude,Longitude and name |
A screen shot showing customised POIS on a built in Garmin car sat nav |
Introduction
The GPI file structure has not been documented but the following information should be sufficient to extract labels and coordinates from a gpi file and convert them to GPX,CSV etc The gpi file ,similar to a tdb file, consists of a short header and a series of blocks each beginning with a type number. The numbers generally reflect order of importance or categories,ie street name, name of town, telephone number etc Most blocks contain a label, which is always found at the end of the block. |
![]() speed cameras UK (GPI Reader) |
Current editors of GPI files do not reveal all the data ( ie labels) contained in a gpi file
They are also subject to crashing out when they encounter an 'error'
Many editors add their own BMP icon!
Not all data can be read if a file has been encrypted.
Header
Header Lengths are variable - see below.
GPI Header | |
00 | Block 0x0 ( if 0x03 is set an extra 4 byte pointer is added pointing to the main block from GRMREC ) |
The following offets only apply if 0x03 is not set. | |
04 | 4 bytes pointer to first Category block |
08 | GRMREC followed by version number |
10 | Time in seconds + 1990 |
16 | 0x6 type block , just text, ie 6 bytes - see below |
1E | 0x1 type Block |
22 | pointer? 0x0c |
26 | POI |
2c | ? 48 |
2d | ? 48 |
2e | codepage |
30 | ? 00 00 |
32 | 0x9 block pointing to last 0x5 block and bmp if 0x34 is set - offsets are from the next block |
34 | bit 5 set when file includes bmp if so and extra 4 bytes are added at 3a |
36 | Length of data 4 bytes |
(3a) | Pointer to the last type |
~3a/3e | Pointer to next block |
~3e/42 | Beginning of text block |
~40/44 | Length of text |
Blocks
Two bytes make up the type number, always at the start of a block, followed by 2 more bytes. If third byte has bit 5 set an extra four bytes are added , often functioning as a pointer.
TYPE | Flag | Extra Bytes | |||||
00 | 00 | 00 |
00 | ||||
00 | 00 | 08 |
00 | 00 | 00 | 00 | 00 |
Most blocks have a 2 letter language abbreviation ,ie 0x45,0x4E (EN), at the start of a text sub block; some do not when the start of a label is fixed . Such labels often represent less important categories, like telephone numbers,post codes etc.
Codes seen : EN , DE, RU
Text does not have to be terminated by a zero as we can ascertain its length by a two byte number.
Type | data | pointer to next block | text flags | length of text | Text |
2 | number of bytes depends on type | 4 | 2 | 2 | variable length |
Latitude & Longitude (0x02)
These are located in the data section ,each requiring 4 bytes; they are converted to degrees using Garmin's standard map unit.Off set from text block appears to be fixed.
Coordinates are only stored in certain blocks, ie 0x2 ,0x3,0x4 (given certain flags),0x8 , 0xC
They are not specific to certain blocks , so block 3 contains coordinates only when certain flags have been set.
Min Max latitudes and longitudes (0x08)
Boundaries are often found in block type 0x8 with offsets to the last block and the next block
BMP Block (0x05)
Found at the end, if present, contains bmp file - width and height at offset &hA - both 2 bytes, allowing for large bmp sizes, not just 24x24 .
We can point to a bitmap using a 4 byte numbers contained in the first main block at the beginning of a gpi file.
This block also contains the size of the gpi file from a given offset, the colour used for transparency ,bits per pixel and the size of this block mostly &2C
Speed & Proximity (0x03,0x09)
4 bytes are used to calculate the speed limit or proximity data.
Speed is converted to metres - hence the conversion of feet to metres is never accurate, ie 30 becomes 9 (30/3.281)
Alert Distances are also stored in 4 bytes at various offsets depending on type .
Proximity distances are calculated to metres per second, making them large numbers.
Divide 4 byte number by a given multiple , ie 1835408 to obtain kilometers.
The following applies to type=4:
if Offset 0xA has 4th bit set, the block contains no speed data.
If 0x0A has value 3 the block contains speed data.
Most blocks contain a byte which ,.when set , indicates existence of speed data.
Type numbers
It seems that if file contains a bitmap then even numbers are used.
No Bitmap
0x2 is used if file contains no bitmap;it contains coordinates and can include labels.
0x3 contains speed / proximity.
FIT to GPX/TCX/CSV converter
![]() |
- FIT Converter is a new FREE GUI for Windows.
- It converts the latest FIT files including Strava Segments
- Garmin prefers FIT files to GPX as they can contain additional information like hear rate, temperature,cadence etc
- FIT files are more complex and cannot be read as a txt file.
- More then likely , your Garmin device contains a FIT file.
- Check out FIT Converter >