Files
MeshCore/tools/meshpocket_map/README.md
T

50 lines
2.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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: <https://www.naturalearthdata.com/downloads/50m-physical-vectors/50m-land/>
Archive: <https://naturalearth.s3.amazonaws.com/50m_physical/ne_50m_land.zip>
SHA-256: `0b8e670cf80dce9cbebe2a193bc44ba5602758c22e1fa603980553646d7ff162`
Natural Earth data is public domain:
<https://www.naturalearthdata.com/about/terms-of-use/>.
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.