# MeshPocket worldwide outline
`PocketWorldMapData.generated.h` contains an outline of the world's land,
including all 1,422 rings from Natural Earth's **1:50m land, version 4.1.0**.
It has no roads, rivers, borders, labels or ocean raster. Small source islands
are retained; this is not a navigational chart. Around 100–200 km of vertical
map extent the coarse outline is useful. Closer zooms show node positions
against the same coarse background, not more geographic detail.
Source:
Archive:
SHA-256: `0b8e670cf80dce9cbebe2a193bc44ba5602758c22e1fa603980553646d7ff162`
Natural Earth data is public domain:
.
No OpenStreetMap map assets or region-specific assets are used.
Generate with Python and the pinned `requirements-build.txt` dependencies:
```
python tools/meshpocket_map/pack_world_map.py --source-zip ne_50m_land.zip
python tools/meshpocket_map/pack_world_map.py --source-zip ne_50m_land.zip --check
```
Without `--source-zip`, the generator downloads that archive and verifies its
digest before reading it. The checked-in generated header makes normal
firmware builds independent of network access and GIS tools.
The deterministic generator uses kilometre-scaled Ramer–Douglas–Peucker
simplification with a 4 km tolerance, then rounds coordinates to 0.001 degrees.
Its local metric is an approximation, especially on large polar polygons;
the 4 km setting is not a guaranteed geodesic error bound. Islands that would
collapse are kept as at least three distinct vertices. Adjacent fragments
share an endpoint, so splitting never removes a connecting edge. Spatially
sorted fragments use signed delta varints and independent raw DEFLATE chunks,
compressed on the host with Google Zopfli **0.4.3, 1,000 iterations**. There is
no compression work on the device. Each indexed chunk has geographic bounds,
so local views skip unrelated data.
The pack uses **79,890 compressed bytes + 768 bytes of index**. Rendering uses
one temporary **3,072-byte** decode buffer and the existing bounded `tinf`
decoder. No map heap allocation, persistent geometry cache, land fill edge
table, or framebuffer is allocated. Lines are clipped to the caller's
viewport using a local azimuthal equidistant projection, which wraps the
antimeridian and supports views centred on either pole. Coastlines and node
markers use the same projection. Its internal geometry uses the nRF52840's
single-precision FPU. The 20,000 km setting switches to a full-world
equirectangular overview, centred on the selected longitude and the equator.
Seam crossings are split at the map edges, not joined across the middle.