Main page Russian | English

Want to support
the development?

Support the development!

JNX Raster Maps

Page contents:

  1. BirdsEye service JNX files
  2. JNX files internals
  3. Non-trivial format usage

BirdsEye service JNX files

Brief intro

JNX files are used in Garmin devices to show the raster maps available via BirdsEye service subscription. In the devices, these files reside in Garmin\BirdsEye folder on the internal disk or the memory card.
JNX is so called tile format, i.e. a large raster map is divided into smaller rectangular pieces (tiles) to speedup the map rendering.
This format is supported by the following Garmin devices: Alpha 100, Astro 320, Colorado 300/400, Dakota 10/20, Edge 800, Etrex 20/30, GPSMAP 62/78, Montana 600/650, Oregon 200/300/400/450/550, Rino 610/650/655.
In the same devices, you can also use raster maps in Google Earth format (KMZ) - "Custom Maps".
Custom Maps is a tile format just like JNX, but there are several important differences between these two:

number of levels of detailup to 5only one
number of tilesup to 50000 per levelmax. 100 per device (!),
up to 500 in Montana
map file sizeup to 4Gbmax. 32Mb for all KMZ maps in device
subjective rendering speedhighlow
locking to a deviceyesno
source of imagesBirdsEye service onlyany raster map
number of maps per deviceup to 200 (in the firmwares released before March, 2011),
up to 250 (in the new frimwares)

As you may see, the most significant drawbacks of JNX format are locking to a device, and impossibility to make a JNX file from some existing raster map you have.

Besides from JNX and KMZ, the raster maps in Garmin GPS can also be in IMG format. See more here (only in Russian at this moment).

Results of the research

The JNX format is almost completely reseached (except for the parts of map loader info block, which can be ignored to make own JNX maps).
Several utilities are developed making possible to convert the raster maps from different formats into JNX and back.

JNX format files are locked to the device they are created for. Still there are two known ways to use your own JNX maps in Garmin GPS devices.

First technique.
We could make a firmware patcher to remove the limitation on number of displayed demo-maps, and their max. area. The patcher can be downloaded here (latest version is 3.80, released on 2019/05/03; list of changes; list of supported firmwares).

Another option is to use BaseCamp to activate the hand-made maps. You can make a JNX map with one of the JNX converters, upload it to the device, then start BaseCamp and copy the map into My Collection. As soon as the map in the Collection, it can be sent back to the device, and BaseCamp will activate it and bind it to your device. This will only work if you have active BirdsEye subscription.

JNX Tools.
The latest versions of MAPC2MAPC supports saving into JNX format. MAPC2MAPC developer also has made mobat2jnx tool to convert saved tiles from OSMTracker Tile Storage (can be made with Mobile Atlas Creator) to JNX file.

Also, there is a command-line tool map2jnx, which is based on GDAL and can be used to convert GeoTIFF and other files into JNX. The latest version is installed with QLandkarte GT 1.6.0 and higher. This version can only make JNX version 4 (see below), which supports draw order, but requires the devices with firmwares released in March 2011 or later.
Older available versions of map2jnx: 0.2.5 (requires FWTools), and 0.2.3 (the latest one which creates the JNX version 3 files).

JNX file saving is also available in OkMap since version 9.7.0.
Export to multi-level JNX is also implemented in SAS.Planet version 120808 and newer.
Also the saving to JNX was added to the version 14 of Global Mapper.

Please note that for the JNX maps to be compatible with the firmwares released in March 2011 (i.e. version 2.93 for GPSMAP 62/78, version 4.16 for Oregon, 4.45 for Oregon x50, and 4.01 for Dakota) or later, you should use MAPC2MAPC version 445 or later, mobat2jnx version 1008 or later, and map2jnx version 0.2.0 or later. The maps created in previous versions are incompatible with the new firmwares and most likely cause the device hang on boot. To make the old JNX maps compatible with latest firmware versions, JNXFixer tool can be used.

JNX files can be viewed in QLandkarte GT version 1.0.0 and above.

There are other tools to manipulate JNX maps, most of them are listed here.

A library to read and write JNX maps in Delphi/FreePascal is available here.
JNXLib was compiled to a DLL, which can be used in MS Visual C++ projects. Archive with 32- и 64-bit versions of DLL, as well as the files to include into a MSVC project, can be downloaded here.

User community.
The main thread on the JNX research is here (forum registration is required to post). It contains the links to the most of the JNX tools.

JNX files internals

File structure

The format description is a result of the experiments with the JNX files sent by the volunteers.

A file in JNX format can be divided in 7 main parts as follows:
  1. file header;
  2. level description table;
  3. map-loader info block;
  4. tile description table;
  5. signature;
  6. tile set;
  7. end of file marker.
Let's discuss each of these parts in more detail.
Notice 1: all the two- and four-byte fields below are in Intel byte order (i.e. less byte comes first).
Notice 2: in all tables below, the offsets are relative to the beginning of the file, unless otherwise specified. The offsets to the signature, the tile description tables, and the tile images are unsigned 32-bit integers, and their values can exceed the 2GB limit, in very large JNX files.
Notice 3: CString in the tables below stands for a variable-length, null-terminated character sequence.

1. File header
Offset from the start
of the header
Field typeDescription
0x00int32JNX format version. Currently, JNX format has two different versions - 3 and 4.
0x04int32Device ID. It is zero, in demo maps.
0x084 int32Map coordinates. Coordinate system is described below.
0x18int32Number of levels of detail. Current firmware version only loads first 5 levels.
0x1Cint32The subscription expiration date and time (this seems to be a number of seconds elapsed since December 30, 1989, 12:00 PM).
0 in demo maps. BirdsEye Select Deutschland maps also have 0 in this field.
0x20int32Subscription product ID:
    0 - BirdsEye
    2 - BirdsEye Select EIRE
    3 - BirdsEye Select Deutschland
    4 - BirdsEye Select Great Britain
    5 - BirdsEye Select France
    6 - BirdsEye Select Kompass - Switzerland
    7 - BirdsEye Select Kompass - Austria + East Alps
    8 - USGS Quads (BirdsEye TOPO, U.S. and Canada)
    9 - NRC TopoRama (BirdsEye TOPO, U.S. and Canada)
The complete set of valid values is not yet identified.
0x24int32CRC32 of tile coordinates (see below). 0 in demo maps.
0x28int32Signature version. All non-demo JNX I've seen, have value 0x00040001 in this field. 0 in demo maps.
0x2Cuint32Signature offset (see 5. Signature below). 0 in demo maps.
JNX version 4 has an additional field
0x30int32Z-Order (or drawing order). Valid values are from 0 to 100. The JNX maps of version 3 are treated as they have 30 in this field.
Starting from the firmware versions released in March 2011, the devices group the JNX maps by the value in Subscription product ID field. So it's highly recommended for the JNX converters' developers to let the users to choose what value to store in it.

The same March 2011 firmwares add the support of the JNX version 4, which allows assigning the maps drawing order with the same meaning as DrawOrder field in Garmin Custom Maps. Support of JNX version 4 is available in BaseCamp version 3.2 or higher.

JNX file coordinates.
Coordinates are stores as 4 signed 4-byte integer numbers. Two pairs of numbers describe two corners of the map.
The first pair corresponds to the top-right (i.e. northern eastern) corner, and the second one to the bottom-left (southern western) corner.
The first number is a pair is the latitude, and the second one is the longitude.
To convert those numbers to a coordinate, it should be divided by 0x7fffffff and then multiplied by 180.
For example, if a map has coordinates 0x1FCD7932, 0x1ADEBDDA, after calculations, we'll get N 44°43'20.81", E 37°47'9.80".

Author of MAPC2MAPC program believes that the Latitude/Longitude projection is used in the JNX files.

According to the experiments, a demo map can cover up to 1 sq. km., otherwise it won't be loaded.

CRC32 field calculation.
To calculate the value of CRC32 field in the header, you need to loop through all the tiles' descriptions in all levels consecutively, take the first two coordinates from each tile (i.e. first 8 bytes of the tile description), form a buffer from these values, and then make CRC32 of the buffer.

2. Level description table
This table always comes after the file header.

Number of items in this tables directly corresponds to the number of detail levels in the file header.
Item structure:
Offset from the start
of the table
Field typeDescription
0x00int32Number of tiles in this level. This number should not exceed 50000.
0x04int32Offset to the tile description table.
0x08uint32Level scale value. According to Dmitry Sklyarov, this is the length of part of the Equator (in millimeters) corresponding to a single raster pixel at a given level. More details here.
JNX version 4 has additional fields
0x10CStringMap level copyright in UTF8 encoding. Printed in the About page.

In JNX files loaded from BirdsEye subscription, the scale values are 0x12A95 (76437), 0x12A9 (4777), 0x4AA (1194) and 0x255 (597).
For BirdsEye Select Deutschland the scales are 0x17D0 (6096), 0x12F1 (4849), 0x9C6 (2502).
For BirdsEye Select Great Britain the scales are 0x387c (14460), 0x05e5 (1509).

The table below shows the scale values, starting from which the JNX levels become visible at different zoom levels in the devices.
For instance, pair 80m - 209 means that if the zoom level is set to 80m, the tiles from the levels with scale value 209 or larger will be shown.
Zoom level
(m, km)
Lower visible
JNX scale value
Zoom level
(yd, mi)
Lower visible
JNX scale value
5yd 12
10yd 24
15yd 36
25yd 60
40yd 96
60yd 143
2mi 8383
3mi 12574
5mi 20956
8mi 33529
12mi 50293
20mi 83821
30mi 125731
50mi 209551
80mi 335281
Zoom level
(ft, nm)
Lower visible
JNX scale value
20ft 16
30ft 24
50ft 40
80ft 64
2nm 9646
3nm 14469
5nm 24115
8nm 38584
12nm 57875
20nm 96458
30nm 144687
50nm 241145
80nm 385832

When several JNX maps with different scale values are uploaded to the device, and the tiles from differently scaled levels are shown at the same time, the tiles from the levels with bigger scales are disabled.
To avoid this mutual disabling, it's recommended for the developers of JNX converters to use the following set of scale values for the corresponding zooms 75, 149, 298, 597, 1194, 2388, 4777, 9554, 19109, 38218, 76437, 152877, 305758, 611526, 1223072, 2446184 (which is an extension of standard BirdsEye maps' scale values). Intermediate values are to be approximated with the closest value from this set.

3. Map-loader info block
This part of JNX is not used for the map rendering itself. It's a variable-length block, and it contains the list of URLs, which were used to download the tiles, as well as map GUID, and copyrights.

This block usually comes after the level description table, and is always followed by the tile description table. In rare cases, the signature resides between the level description table and the map-loader info block.

Starting from firmwares released in March 2011, some parts of this block are necessary to correctly load the maps, and some of the strings in this block are shown in the Map Setup menu.

Below is an incomplete description of the block structure. Only the parts necessary to load the JNX maps are listed/identified.
The Map-loader info block can be divided into three sub-blocks. Note to the JNX tools developers: Since the users would like to move the maps between the different map groups from time to time, it's recommended to reserve some additional space (for instance, 1024 bytes) for the map-info block, when your tools write the JNX file. In this case, in-place modification of the strings in the map-loader info block would be possible, which of course is faster than copying the file contents into a temp file, and then copying the results back to the device.

4. Tile description table
Offset from the start
of the table
Field typeDescription
0x004 int32Tile coordinates.
0x10int16Image width.
0x12int16Image height.
0x14int32Images size in bytes.
0x18uint32Offset to the image.

5. Signature
An optional block of length 0x314 (788) bytes. Only present when the Signature offset field in the file header in non-zero. The signature usually resides between the last item in the tile description table and before the first tile image.

The signature locks the JNX file to the device.
Consists of a small header, and an encrypted body.
The signatures are crypted with asymmetric encryption. Most likely it is the same algorithm which is used in GMA (Garmin Map Activation) certificates, introduced in the recent devices.
The signature is generated by the server based on the map coordinates, device ID, and the number of levels of detail.

6. Tile set
Tiles are stores in JPG format. The only difference from the standalone jpegs, is in JNX, the SOI markers (i.e. the first two bytes 0xFF, 0xD8) are removed.
Most of the images in BirdsEye maps are 256 x 256 pixels. Larger tiles are also supported: devices can show the tiles as large as 1 megapixel; bigger tiles are downsized with a loss of quality.

It seems that any particular image can be used to render more than one tile (in case when the tile images are the same) to make the file smaller. In this case, the number of images will be smaller than the number of tiles. This feature was not yet tested.

7. End of file marker
Every JNX file ends with "BirdsEye" string (0x42, 0x69, 0x72, 0x64, 0x73, 0x45, 0x79, 0x65 - in hex).

Non-trivial format usage

"Multi-volume" JNX maps

JNX format only allows having up to 50000 tiles per map level, but there is a way to cross this limit, so called "multi-volume" JNX files.
In this approach, the levels with bigger number of tiles are saved in separate files with the less than 50000 tiles in each level. The coordinates in the headers of these separate JNX files correspond to the coordinates of tiles they contain.

An example. We need to make a 3-level JNX map with 10000 tiles in the first level, 40000 in the second, and 160000 in the third. In this case, we make 4 files: 3-level JNX with 10000 tiles in the 1st level, 40000 - in the 2nd, and 50000 in the 3rd, and three single-level JNX files - two files with 50000 tile in their only level, and one file with 10000 tiles.

At the time of writing, the only program with the multi-volume JNX maps support is SAS.Planet.

Lower visibility limitations

In the JNX maps, there is only an upper limitation for the zoom levels at which a particular level should become visible. For instance, if a JNX level header has scale value 76437, the tiles of this level will be shown in zooms from 20km to 5m. Unfortunately, there is no explicit way to specify that a level should be hidden below, say, zoom level 1.2km (i.e. to specify the lower visibility limit).
An approach was proposed by aabbcc at gpsunderground to implicitly specify such a limit.

To hide a JNX map below some zoom level, a new map level should be added with the necessary scale value (for 1.2km zoom, the scale value would be 4777), and with a single tile in it. The coordinates of the tile should be outside the boudnaries of the map itself.
Obviously, a map where this pseudo-level is added, can have no more that 4 normal levels.

As the tile image, a single-pixel picture can be used. Or offset to the first tile in the JNX can be specified in the tile description block.

To make sure the tile coordinates lay outside the maps' ones, they can be made equal to 90N, 180E - this is a preferable way, but the existing converters will require some changes to support it. Another option would be to use the coorinates of one of the corners of the map as the tile's coordinates - this can be made even with the currently available JNX tools.

At the time of writing, the only program with the lower visibility limitation support is SAS.Planet.

Both above-described techniques are experimental.
Interaction of the multi-volume maps, the maps with lower visibility limitations and the nearby normal maps has not yet been explored.

That's it for now.
If you have any comments or additional info on the JNX format, please don't hesitate to mail me.

Last modification: 16 Mar 2017