Garmin JNX — BirdsEye Satellite Tiles for Oregon and GPSMAP: Format, Limits and OSM Rendering

2026-04-057 min read
GarminJNXBirdsEyeraster tilessatellitenavigationGPS

Garmin JNX is a binary container for raster tiles that Garmin invented for its paid BirdsEye Satellite Imagery service. Unlike the vector-based Garmin IMG format, JNX stores ready-made JPEG images in a zoom pyramid — effectively satellite snapshots or hybrid raster maps cut into tiles and packed into a single .jnx file. The format is supported on Oregon handhelds (300/450/550/600/650/700/750), GPSMAP (62/64/66/78), Montana, etrex 20/30/30x/32x, plus some Edge and Dakota models. Garmin never published a spec; everything known today is the result of reverse engineering by the community (mainly Mapc2Mapc by Mike Alder and GMapTool's ChangeJNX). On osm2cdr.ru, garmin-jnx is available as a post-process from raster rendering: we first generate a tile pyramid as MBTiles, then an external Mapc2Mapc pipeline converts it into .jnx.

Map generation of Yaroslavl city center

History: the BirdsEye subscription and the birth of JNX

JNX appeared in 2010 alongside the launch of Garmin BirdsEye Satellite Imagery — a paid subscription ($30/year at the time) that gave owners of compatible handhelds the ability to download DigitalGlobe / Maxar satellite imagery fragments onto their device. The idea was simple: instead of carrying a vector map with roads and buildings, a hunter, fisher, or hiking photographer could see real satellite imagery of their native forest or lake on the GPSMAP screen, with resolution down to 1 meter per pixel in popular regions.

Technically BirdsEye ran via the desktop BaseCamp app (successor to MapSource): the user picked a bbox on the map, BaseCamp downloaded the chopped-up tiles from Garmin servers and assembled them into a .jnx file, which was then copied to the microSD card in Garmin/BirdsEye/. Per-user quota — 5 GB of imagery per year; per-file limit — about 100 MB (historically — for compatibility with slow USB 2.0 and the weak storage on devices of that era).

The BirdsEye subscription still exists (in 2024–2025 Garmin renamed it «BirdsEye Direct», priced around $30/year for most handhelds, free for Edge 1040 Solar and flagship models). The .jnx format hasn't changed in 15 years — Garmin published no breaking changes, and community tools that learned to write JNX in 2011 still work today.

Inside a JNX file

Reverse-engineered JNX structure (per Mike Alder of Mapc2Mapc and GMapTool):

  • Header (~140 bytes): magic number 0x0000 + version (4 bytes, usually 3 or 4), product ID, expiration date (for on-device DRM check — BirdsEye subscriptions are time-limited), zorder (draw order relative to vector IMG), tile count per level.
  • Tile pyramid metadata: for each zoom level — bbox, tile count, file offset, average tile size. JNX supports up to 5 zoom levels in one file (typically z11–z16 for satellite imagery).
  • Tile index: for each tile — its lat/lon corners (as 32-bit signed integers in Garmin grid), offset, JPEG byte length.
  • JPEG payload: the JPEG tiles themselves, packed back-to-back. Non-standard tile size — 256×256 or 1024×1024 px, depending on zoom. JPEG quality is usually 75–85%, a good size/quality balance for satellite imagery.

The ~100 MB per-file soft limit comes from Garmin BaseCamp, which won't refuse a larger file but the device may fail to load it fully into memory. Community workaround: split a large region into several .jnx files (BirdsEye_001.jnx, BirdsEye_002.jnx) in one folder — the device sees them as multiple overlays.

DRM mechanism: BirdsEye-generated .jnx files contain the device-ID of the GPSMAP/Oregon they were made for, plus the expiration date. ChangeJNX from GMapTool can strip these fields, turning a subscription JNX into a device-agnostic file, or let you generate a fresh JNX from plain JPEG tiles with no DRM at all.

Use cases

Outdoor with satellite imagery. The headline scenario. A hunter or fisher wants to see on the Oregon 700 screen a real photo of their favorite lake — where the shoreline runs exactly, where the forest is dense, where the clearings are. A vector IMG shows generic "water" and "forest"; a JNX gives photographic truth. Especially valuable for regions where OSM data is sparse (Siberia, remote Alaska and Canada).

Urban rides with photorealistic context. A cyclist with an Edge 1040 wants to see the center of Paris or Moscow from above — what the squares look like, what the district really is. Not for navigation (there's the basemap for that), but for situational awareness.

Backup for legacy BirdsEye. A user has a subscription that expired in 2018 and old .jnx files stopped loading (expiration check). ChangeJNX strips the expiration — the map keeps working.

Custom raster maps from your own sources. Drone orthophotos of your own land, scanned topo maps, historical maps — anything can be tiled and packed into JNX via Mapc2Mapc.

Workflow in OSM2CDR

JNX on osm2cdr is a multi-step external pipeline, not a single-shot export. We don't ship pure-Python JNX generation (reverse-engineered binary with DRM fields is brittle enough that we don't want to own it end-to-end). Instead:

Step 1. Via tile_exporter.py we render the chosen bbox into raster PNG tiles for z11–z16 (extendable to z18 for urban detail). Style is user-selectable — our default OSM Carto derivative, BirdsEye-style (satellite-like vector imitation — not an actual satellite image), or a hybrid combined with labels.

Step 2. The tile pyramid is packed into an MBTiles SQLite container via mbtiles_container.py. This is a fully native pipeline, no Mapc2Mapc dependency.

Step 3. The user downloads the .mbtiles and converts it through Mapc2Mapc (Windows-only freeware by Mike Alder, ~3 MB exe) to .jnx: open mbtiles → Set Map → Write → Garmin JNX format. Mapc2Mapc unpacks the SQLite tiles, adds the JNX header with device-ID (taken from a connected device or set generic), repacks everything into a single .jnx.

Step 4. Copy the file to microSD: Garmin/BirdsEye/MyMap.jnx. After the device reboots — Setup → Map → Map Information should show the new layer; enable it under Configure Maps → Custom.

Honestly: we considered native end-to-end JNX generation (without Mapc2Mapc) but decided against. A reverse-engineered binary with DRM fields has non-trivial risk of breaking on Garmin firmware updates, and leaning on the external community tool (Mapc2Mapc updates regularly) is the cheaper bet. This is a P3 roadmap item.

Map generation of Rome city center

JNX vs MBTiles vs KMZ raster overlay

MBTiles is open, spec is published, and it's the native container for OSMAnd / Locus / Maps.me / TileServer-GL. But it doesn't read on Garmin handhelds: Garmin OS has no SQLite engine built in. MBTiles is for smartphones and servers; JNX is for Garmin handhelds.

PMTiles is a modern open format from Protomaps optimized for HTTP range requests and cloud hosting. Also not Garmin-readable — it's a web format.

Garmin Custom Maps KMZ is the open Garmin-blessed alternative to JNX, also introduced in 2010 alongside BirdsEye. KMZ = ZIP with KML + JPEG overlay images. Limit — 100 tiles of 1024×1024 per file, up to 500 per device (older models — fewer). KMZ is simpler to generate (any GIS exports KML+overlay) but less efficient for large regions: JNX scales better for 1000+ km² coverage thanks to its zoom pyramid. For bbox < 100 km² — pick KMZ (native Garmin support, open spec); for big regions — JNX.

Conclusion

Garmin JNX is a niche format for one specific use case: showing real satellite imagery or photorealistic raster tiles on top of the vector basemap on an Oregon/GPSMAP/etrex. Reverse-engineered Mapc2Mapc and GMapTool made it possible to generate JNX from your own tile sources — which removes the dependence on a paid BirdsEye subscription and opens the door to any OSM-derived style.

If your backpack has a Garmin handheld and you want a raster overlay for your region — try exporting the tile pyramid on the /formats/garmin-jnx/ page, then run it through Mapc2Mapc and get the .jnx in a couple of minutes.

Map generation of Ekaterinburg city center

Sources

← All articles