Files
cpp-garmin-img-to-osm/README.md
T

170 lines
7.8 KiB
Markdown
Raw Normal View History

2026-10-19 08:52:24 +00:00
# BGMountains Garmin IMG → native OsmAnd OBF — v0.95
2026-10-14 11:16:43 +00:00
2026-10-19 08:52:24 +00:00
**This is the integrated source release.** It replaces the v0.92/v0.93 Python
pipeline and v0.94 standalone CSVs. Do not combine scripts from older ZIPs:
those versions accept different flags and do not apply the 79 name-conditional
rules. This archive has **one POI config and one line config**.
2026-10-14 11:16:43 +00:00
2026-10-19 08:52:24 +00:00
## Quick start (Ubuntu/Debian)
2026-10-14 11:16:43 +00:00
2026-10-19 08:52:24 +00:00
```bash
2026-10-14 17:04:46 +00:00
sudo apt update
2026-10-19 08:52:24 +00:00
sudo apt install -y cmake g++ make libpng-dev libsqlite3-dev python3 openjdk-21-jre-headless unzip
unzip BGMountains-garmin2osm-v0.95-integrated.zip
cd BGMountains-garmin2osm-v0.95
```
2026-10-14 11:16:43 +00:00
2026-10-19 08:52:24 +00:00
Use **exactly** this from the release root (where `scripts/` and `config/` are):
```bash
nohup python3 scripts/build_bgmountains.py \
--img "$HOME/gmapsupp.img" \
--poi-config config/BGMountains-native-poi-mapping-v094.csv \
--line-config config/line-mapping.csv \
--out bg-mountains-v095-build \
--download-creator \
--jobs 8 \
--java-opts '-Xms512M -Xmx25G' > bg-v095.log 2>&1 &
```
The `--poi-config` and `--line-config` arguments are **implemented and tested**.
Other supported flags: `--creator /path/to/OsmAndMapCreator`, `--bbox W,S,E,N`,
`--prepare-only`, `--keep-raw`, `--template`, `--attach-routes`,
`--disk-headroom-gb N`, `--ignore-disk-check`, `--jobs N` (default 1).
**Check your actual disk space first.** Full-country MapCreator compilation has
previously required over 25 GiB of temporary disk space in addition to the
source OSM (6+ GiB) on your machine. The script uses a conservative estimate
`max(2 GiB, 5 × native-OSM-size + 1 GiB)`, unless `--disk-headroom-gb`
requires more. These figures are not upper bounds. Choose an output filesystem
with generous free space. `-Xmx25G` controls heap RAM, **not disk usage**.
## Safe regional test, no Java or extra download
```bash
2026-10-14 17:04:46 +00:00
python3 scripts/build_bgmountains.py \
2026-10-19 08:52:24 +00:00
--img "$HOME/gmapsupp.img" \
--poi-config config/BGMountains-native-poi-mapping-v094.csv \
--line-config config/line-mapping.csv \
--bbox '25.05,42.43,25.16,42.54' \
--jobs 8 \
--out ./regional-test \
2026-10-14 17:57:55 +00:00
--prepare-only
2026-10-14 17:04:46 +00:00
```
2026-10-19 08:52:24 +00:00
Inspect `regional-test/BGMountains-native.osm`, `semantic-audit.json`,
`route-report.json`, `extract.log`, `translate.log`, `audit.log`. The tool
must exit nonzero on a failed conversion subprocess. You can instead pass an
existing MapCreator with `--creator ...` (omit `--prepare-only`) for a small
real OBF build.
2026-10-14 17:04:46 +00:00
2026-10-19 08:52:24 +00:00
## Two editable configuration files
2026-10-14 17:04:46 +00:00
2026-10-19 08:52:24 +00:00
### 1. `config/BGMountains-native-poi-mapping-v094.csv`
2026-10-14 17:04:46 +00:00
2026-10-19 08:52:24 +00:00
1,871 base hex-code entries plus 79 **name-specific** exceptions (1,950 data
rows). Columns include: `code`, `source_count`, `legend_bg`, `legend_en`,
`meaning_confidence`, `osm_tags`, `label_bg`, `priority`, `zoom_hint`, `action`,
`note`, examples, and optional `name_contains`. For conditional matching,
set `name_contains` in an additional row with the same `code`. The matcher uses
case-sensitive substring matching on the **original Garmin name**, with rules
applied in file order after the base rule. `replace` changes the converter's
semantic defaults; `append` retains previous tags; `raw` leaves unspecified
features unclassified until private-map fallback; `drop` discards the feature.
2026-10-14 17:04:46 +00:00
2026-10-19 08:52:24 +00:00
The Python pipeline automatically creates `cpp-poi-override.csv` and
`cpp-name-labels.csv` **inside the build output directory**. These are generated
intermediates, **not third and fourth user configuration files**. There is no
need to manually supply them or an icon pack to OsmAnd.
2026-10-14 11:16:43 +00:00
2026-10-19 08:52:24 +00:00
Important native examples:
2026-10-14 17:57:55 +00:00
2026-10-19 08:52:24 +00:00
- `0x6414`: `amenity=drinking_water;man_made=water_tap` (legacy v18 dual
classification); named dry sources such as `(Сух.)` remove drinking-water
classification and get `drinking_water=no`.
- `0x6500`: `man_made=water_intake;amenity=water_point;drinking_water=unknown`
for **private-map index compatibility**, not evidence that its water is
potable, available or accessible. Named shaft (`Шах...`) exceptions remove
the compatibility alias.
- `0x6511`: `natural=spring` (potability not asserted).
- `0x6402`: `building=yes` by default, explicitly named `Заслон` or `Хижа`
may become shelter/hut (availability/access not verified).
- `0x661d`: agricultural structures remain agricultural unless specifically
identified otherwise.
- `0x6600`: keep numeric spot height `ele=*`, **no fake settlement**.
- Unknown POIs: `place=locality`, `Неуточнено - <stable hash>` if unnamed,
and `bgm:synthetic_fallback=place_locality`; this private-map fallback **does
not guarantee Nearby POI indexing**.
2026-10-14 17:57:55 +00:00
2026-10-19 08:52:24 +00:00
`priority` and `zoom_hint` are documented classification hints only. They do
**not force stock OsmAnd to show an icon at zoom 12**. Likewise `garmin:type`
remains a provenance tag, not a display rule. Only stock OsmAnd classifications
and rendering apply to the resulting OBF.
2026-10-14 17:57:55 +00:00
2026-10-19 08:52:24 +00:00
### 2. `config/line-mapping.csv`
2026-10-14 17:57:55 +00:00
2026-10-19 08:52:24 +00:00
50 Garmin line types (20 currently have `route_mode=relation`, 30 preserve
source geometry). Columns include Garmin `code`, legend, color,
`osm_way_tags`, `route_mode`, `osmc_symbol`, `network`, confidence and priority.
Selected source overlay segments are grouped into native
`type=route;route=hiking` relations with `osmc:symbol`. Garmin source color is
preserved as relation `colour=*`. The script does not create duplicate routable
paths from decoration lines. Opt-in `--attach-routes` matches overlays to real
existing path geometries, but can use significant memory; it is off by default.
**Existing physical path routing remains in the data.** Exact phone-side color,
icon and at-zoom visibility still depend on stock OsmAnd.
2026-10-14 17:57:55 +00:00
2026-10-19 08:52:24 +00:00
## New or unknown IMG maps: generate configuration templates
2026-10-14 17:57:55 +00:00
2026-10-19 08:52:24 +00:00
```bash
python3 scripts/build_bgmountains.py --img /path/to/unknown.img \
--out ./template-newmap --bbox '23.0,42.0,24.0,43.0' --template
2026-10-14 11:16:43 +00:00
```
2026-10-19 08:52:24 +00:00
Produces `poi-mapping.TEMPLATE.csv` and `line-mapping.TEMPLATE.csv` with
observed types and sample coordinates. Fill them manually and run with
`--poi-config ./template-newmap/poi-mapping.TEMPLATE.csv` and
`--line-config ./template-newmap/line-mapping.TEMPLATE.csv`. **Do not assume
Garmin codes have the same meaning in unrelated maps.** If you need a complete
catalog for a new national map, generate its templates without `--bbox`, but
this can require significant time and intermediate disk space.
2026-10-14 11:16:43 +00:00
2026-10-19 08:52:24 +00:00
## Validation and provenance
2026-10-14 11:16:43 +00:00
2026-10-19 08:52:24 +00:00
```bash
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -j 4
ctest --test-dir build --output-on-failure
```
There is also `tools/audit_osmand_poi_mapping.py`, which takes the official
version-matched OsmAnd `poi_types.xml` and produces a registry compatibility
report, **not a claim of final icon visibility**:
```bash
python3 tools/audit_osmand_poi_mapping.py \
--mapping config/BGMountains-native-poi-mapping-v094.csv \
--poi-types /path/to/poi_types.xml \
--report native-poi-audit.csv --json native-poi-audit.json
```
Source: https://github.com/osmandapp/OsmAnd-resources/blob/master/poi/poi_types.xml
## Tested, and NOT tested
- C++ Release build, 6 CTest test groups, conditional POI CSV generation,
CLI options, and simulated MapCreator orchestration passed.
- Original 422 MiB IMG: regional `--jobs 8` and serial preparation succeeded
with identical 427 POI coordinate/name/tag records and 6 route relations.
- Separate region: `(Сух.)` water-tap conditional correctly produced
`man_made=water_tap;drinking_water=no`, and no `amenity=drinking_water`.
- **A real OsmAndMapCreator binary was not available here**; its host was
unreachable. The OBF orchestration unit test uses a **mock**, so native
nationwide OBF compilation and phone rendering are not verified. Do not
mistake that mock for real OBF validation.
License: the source bundle contains historically BGMountains-derived
classification information. Treat that data as private-map material under
applicable source licenses; the package is **not** authorization to republish
BGMountains geography or to import its features into the public OSM database.