v07
This commit is contained in:
@@ -1,3 +1,5 @@
|
||||
garmin2osmand-v3/*.osm
|
||||
*.obf*
|
||||
*.ocbf*
|
||||
compiling-obf/*
|
||||
bgmountains-build/*
|
||||
|
||||
@@ -1,19 +0,0 @@
|
||||
## 0.3.0
|
||||
- Adds --whole-map and --plan.
|
||||
- Uses geographical submap coverage interval union instead of one large rectangular export loop.
|
||||
- Commits completed scanlines atomically and enables efficient continuation with --resume.
|
||||
- Ensures compatible inputs/options when resuming via a settings fingerprint.
|
||||
- Tested full Bulgarian IMG on zoom 10: 330 PNG tiles; peak RSS 20 MiB, 6.8 seconds, resumed in 0.02 seconds.
|
||||
- Planned countrywide 12–16: 1,698,680 candidate tiles (prior global rectangle 1,705,377).
|
||||
- Full zoom-16 countrywide render has NOT been executed or sized in this environment.
|
||||
|
||||
## 0.2.0
|
||||
- TYP line, polygons, icons, LBL codepage and antialiasing improvements.
|
||||
- Real-map 2,033-tile Rila test, 36.29 MiB, 34 seconds, peak 28 MiB.
|
||||
|
||||
## v0.6 (2026-10-14)
|
||||
- Reviewed 67 POI code icons directly against supplied BGMountains legend; 48 semantic default updates and a detailed CSV log.
|
||||
- Corrected extended POI LBL pointer offset (117 changed decoded labels) and added a subdivision-bounds sanity check (5,602 suspicious points filtered).
|
||||
- Added optional coordinate/name exact-match CSV fixes, no automatic speculative place-name correction.
|
||||
- Added strict reviewed nationwide type catalog, annotated legacy catalog, 16×16 TYP bitmap offline explorer, and GPXSee QA waypoint file.
|
||||
- Original OBF has not been validated, and no actual IMG is included in this source release.
|
||||
+4
-1
@@ -1,5 +1,5 @@
|
||||
cmake_minimum_required(VERSION 3.16)
|
||||
project(garmin2osmand VERSION 0.6.0 LANGUAGES CXX)
|
||||
project(garmin2osmand VERSION 0.7.0 LANGUAGES CXX)
|
||||
set(CMAKE_CXX_STANDARD 17)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
find_package(PNG REQUIRED)
|
||||
@@ -23,3 +23,6 @@ if(Python3_Interpreter_FOUND)
|
||||
add_test(NAME native_vector_export COMMAND ${Python3_EXECUTABLE} ${CMAKE_SOURCE_DIR}/tests/test_vector.py $<TARGET_FILE:garmin2osm>)
|
||||
add_test(NAME bgmountains_legend_audit COMMAND ${Python3_EXECUTABLE} ${CMAKE_SOURCE_DIR}/tests/test_legend_audit.py)
|
||||
endif()
|
||||
if(Python3_Interpreter_FOUND)
|
||||
add_test(NAME osmand_obf_pipeline_xml COMMAND ${Python3_EXECUTABLE} ${CMAKE_SOURCE_DIR}/tests/test_obf_pipeline.py)
|
||||
endif()
|
||||
|
||||
@@ -1,66 +1,127 @@
|
||||
# BGMountains Garmin IMG → OSM v0.6 (legend-reviewed, spatially validated)
|
||||
# BGMountains Garmin IMG → OsmAnd OBF (v0.7)
|
||||
|
||||
This is an **incremental source + QA release**, based on the v0.5 converter. Original map IMG/OBF binaries are **not bundled**. The source map's license is **not** the converter's GPL license: map-derived data, icons, CSV and examples are for private verification unless the rights holders authorize redistribution.
|
||||
**One command builds the C++ IMG converter, emits a reviewed OSM, generates complete custom OsmAnd POI and map type definitions, validates the intermediate source/OSM data, and invokes OsmAndMapCreator to build an OBF.**
|
||||
|
||||
## Corrected
|
||||
Unlike v0.6's optional `build_obf.sh` wrapper, the main script no longer expects you to create any missing XML files. First-time setup requires access to the official OsmAnd resource files and the OsmAndMapCreator Java tool; the script can download both on demand. Java, Python, CMake, libpng, SQLite3 and a C++ compiler must be installed.
|
||||
|
||||
1. **67 exact extracted TYP icon ↔ supplied BGMountains legend matches**, 60 of them present as decoded POI types in the IMG (7 icons occur only in its TYP catalog), including 48 changes to the previous semantic defaults. Changes appear in `data/legend-corrections-log.csv`, and new mappings are embedded directly in `src/vector.cpp` as safe fallbacks. Every verified icon also gets a `garmin:legend` tag to aid inspection. Optional `config/poi-overrides-legend-reviewed.csv` permits further edits while retaining the original 1,871 type rows.
|
||||
2. **Extended-point label pointer**: v0.5 read the label pointer at `p+len-3`; Garmin's layout places it at `p+6`, before the optional extra byte. Correcting this fixed or cleared **117 label outcomes**. See `data/extended-label-decoder-changes.csv`, with old/new names/coordinates. The string `есебър` was a decoder artifact at the *wrong geographic location*, not a misspelling to force to `Несебър`. The actual town of Несебър is in the normal classic point data at 42.6599550,27.7197504, mapset 02235056.
|
||||
3. **Spatial sanity gate**: Extended POIs outside their own TRE subdivision bounds (beyond 0.00005° margin) are no longer emitted. **5,602 suspected/invalid point records** disappear; classic POI count remains **407,820**. This is a conservative defense against malformed extended streams, not independent Garmin specification conformance testing. Retained extended records may still warrant validation. Total kept POIs: **410,563**, distinct types: **263** (113 classic, 150 extended). The old 1,871-code inventory remains available, annotated with exclusion counts.
|
||||
4. **Optional per-feature POI name corrections**, `--poi-name-fixes config/poi-name-fixes.csv` uses an exact source-map ID, hex code, latitude, longitude, previous name and replacement name. Never blanket-correct all points with a particular substring: it could mask a decoder error. No name corrections are active by default.
|
||||
5. **Threads are off by default** (`--jobs 1`); use `--jobs 4` to enable four parallel workers. POI rules apply consistently in both cases.
|
||||
|
||||
## Files
|
||||
|
||||
- `config/poi-overrides-all-types.csv` (same as `config/poi-overrides-legend-reviewed.csv`): **corrected editable 1,871-row override file** (schema `code,name_contains,mode,tags,note`). 60 active POI-code rows corrected (plus 7 extra verified icons embedded in C++ for future occurrences). Unverified rows are left inert and flagged in the notes.
|
||||
- `config/poi-name-fixes.csv`: name correction template, no active fixes by default.
|
||||
- `data/BGMountains-unique-poi-types.csv` (same as `data/BGMountains-unique-poi-types-STRICT-reviewed.csv`): **current useful catalog: 263 retained raw types**, current counts, reviewed classification status, up to five real source coordinates and names per type.
|
||||
- `data/BGMountains-unique-poi-types-reviewed.csv`: **historical 1,871-type catalog**, with v0.5 counts, exclusions and review status; do not mistake rejected coordinates for correct map objects.
|
||||
- `data/legend-corrections-log.csv`: 60 present-and-verified mappings; `data/all-67-icon-legend-matches.csv`: 67 TYP icon-to-legend matches (7 icon codes not observed as POIs), including original/new OSM semantic tags and one coordinate each.
|
||||
- `data/extended-label-decoder-changes.csv`: 117 extended-label before/after results (some names vanish because they came from the wrong LBL offset).
|
||||
- `data/legend-verified-POI-QA-waypoints.gpx`: 179 sample POIs of verified hex codes, for simultaneous visual comparison in GPXSee + original IMG. Exact count is in the GPX file.
|
||||
- `data/BGMountains-POI-Explorer.html`: no-network/offline searchable icon reference, with copyable sample coordinates and basemap links.
|
||||
- `data/poi-icons/*.png`: embedded Garmin icons extracted from the original TYP (copyright depends on source data).
|
||||
- `tools/validate_pois.py`: previously tested source→OSM audit; limitation remains that it is not a third-party ground-truth or OBF assertion.
|
||||
|
||||
## Build and validation
|
||||
## One-command full Bulgarian map
|
||||
|
||||
```bash
|
||||
sudo apt-get install -y cmake g++ libpng-dev libsqlite3-dev python3
|
||||
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
|
||||
cmake --build build -j "$(nproc)"
|
||||
ctest --test-dir build --output-on-failure
|
||||
sudo apt update
|
||||
sudo apt install -y build-essential cmake libpng-dev libsqlite3-dev python3 openjdk-21-jre-headless unzip
|
||||
|
||||
./build/garmin2osm --input 'gmapsupp.img' \
|
||||
--output BGMountains-legend-reviewed.osm \
|
||||
--poi-overrides config/poi-overrides-legend-reviewed.csv \
|
||||
--poi-name-fixes config/poi-name-fixes.csv \
|
||||
--poi-manifest BGMountains-source-reviewed.csv \
|
||||
--poi-types-out BGMountains-types-reviewed.csv
|
||||
|
||||
python3 tools/validate_pois.py compare \
|
||||
--source BGMountains-source-reviewed.csv \
|
||||
--osm BGMountains-legend-reviewed.osm \
|
||||
--rules config/poi-overrides-legend-reviewed.csv \
|
||||
--report validated.json --mismatches mismatches.csv
|
||||
python3 scripts/build_bgmountains.py \
|
||||
--img '/path/to/gmapsupp.img' \
|
||||
--out '/path/to/BGMountains-build' \
|
||||
--download-creator
|
||||
```
|
||||
|
||||
Parallelism: append `--jobs 4` to the converter command if desired; otherwise it uses one worker.
|
||||
If you **already have** OsmAndMapCreator, use `--creator /path/to/OsmAndMapCreator` in place of `--download-creator`. You can also `export OSMAND_MAPCREATOR=/path/to/OsmAndMapCreator` and omit `--creator`.
|
||||
|
||||
**Adding one verified name correction:** edit `config/poi-name-fixes.csv`, with this schema:
|
||||
OsmAndMapCreator is ~150 MB and requires extra disk space and Java RAM. By default, the script downloads it **only when** you request `--download-creator`; upstream OsmAnd `poi_types.xml` and `rendering_types.xml` are downloaded or read from your MapCreator directory automatically, then cached in the output folder. Requires Internet for first use unless you supply existing XML files with `--poi-base FILE --rendering-base FILE`.
|
||||
|
||||
**Multithreading remains disabled by default (`--jobs 1`).** Pass `--jobs 4` explicitly for the IMG parsing stage. It does not control MapCreator's Java processing.
|
||||
|
||||
If the Java process runs out of memory:
|
||||
|
||||
```bash
|
||||
python3 scripts/build_bgmountains.py --img gmapsupp.img --out ./BGMountains-build \
|
||||
--creator ~/OsmAndMapCreator --jobs 4 \
|
||||
--java-opts '-Xms1G -Xmx12G'
|
||||
```
|
||||
|
||||
The full-country OSM can be large. Allocate substantial disk space for OSM XML, temporary indexing databases, and OBF output. The script retains intermediate files for auditing.
|
||||
|
||||
## What is generated
|
||||
|
||||
```text
|
||||
BGMountains-build/
|
||||
BGMountains.osm # converted source, Garmin type and name kept
|
||||
source-pois.csv # source point audit manifest
|
||||
poi-types.csv # observed type counts and example coordinates
|
||||
validation.json # source-to-OSM counts/mismatches
|
||||
mismatches.csv
|
||||
converter.log
|
||||
validator.log
|
||||
upstream/poi_types.xml # official OsmAnd definitions (if downloaded)
|
||||
upstream/rendering_types.xml
|
||||
osmand-config/
|
||||
poi_types.bgmountains.xml # FULL base OsmAnd POI rules + 1 custom type per observed Garmin code
|
||||
rendering_types.bgmountains.xml # FULL base render encoding + map encoding for each Garmin code
|
||||
BGMountains-custom.render.xml # OPTIONAL visual style for custom icons in OsmAnd
|
||||
type-index-summary.json
|
||||
mapcreator.log
|
||||
*.obf # full map (created by OsmAndMapCreator)
|
||||
obf-poi-index.txt # dump from inspector.sh, if available
|
||||
build-manifest.json
|
||||
```
|
||||
|
||||
For the v0.6 reviewed **national catalog**: 263 decoded types, 410,563 POIs, 87 types with **at least 100** occurrences, 86 with Garmin TYP bitmap extraction. Actual new runs produce their own observed counts. The default threshold is 100; use `--threshold 250` to change it.
|
||||
|
||||
### Three different meanings of 'icon'
|
||||
|
||||
1. **Native OsmAnd map icon.** Verified type receives proper OSM tags (`natural=spring`, `tourism=hotel`, etc.) from `config/poi-overrides-all-types.csv`. Existing OsmAnd styles choose their built-in symbols.
|
||||
2. **Custom Garmin type in OBF.** Every observed POI receives `garmin:type` and `bgm_poi=type_0xHEX`; the generated POI and map type XML preserve those types as a dedicated category. Map-index objects at high-frequency types are stored from zoom **15** by default, rare types from zoom **17** (adjustable by `--frequent-zoom`, `--rare-zoom`). Native OsmAnd styles may not draw custom types without a matching style.
|
||||
3. **Actual Garmin TYP bitmap.** Preserved separately as PNG in `data/poi-icons/`; an OBF **does not embed third-party bitmap resources into the app icon set**. To display these exact symbols requires changing OsmAnd application resources, not just editing XML. A different installed OsmAnd render style may refer to already available built-in symbols.
|
||||
|
||||
## Assign additional built-in OsmAnd icons yourself
|
||||
|
||||
Edit `config/osmand-icons.csv`:
|
||||
|
||||
```csv
|
||||
mapset,code,lat,lon,old_name,new_name,note
|
||||
# Example (illustrative; this row is NOT a real correction):
|
||||
# 02234071,0x6609,42.1897745,23.2835913,Х.Иван Вазов,х. Иван Вазов,Check actual Garmin source before use
|
||||
code,show_in_custom_style,minzoom,osmand_builtin_icon,...
|
||||
0x650b,yes,16,information,...
|
||||
```
|
||||
|
||||
The original `name` and coordinates in the source manifest are quantized to seven decimals for exact matching. A manual name fix affects both OSM and the manifest, so it **cannot count as independent evidence of cartographic correctness**; record your verification separately.
|
||||
For common unknowns (>=100 occurrences with no verified standard OSM semantic category) the sample config enables a generic **built-in** `information` icon in an optional style. For verified classes, `show_in_custom_style=no` lets the stock OsmAnd map style draw a more meaningful native icon. The file includes one entry for **all 263 source types**, occurrence counts and sample coordinates. Change the `osmand_builtin_icon` to a valid icon ID supported by your installed OsmAnd version and set `show_in_custom_style=yes` to override the default.
|
||||
|
||||
## What this does not prove
|
||||
After building, install `BGMountains-custom.render.xml` as a custom OsmAnd rendering style in the application's `rendering` directory, then select the corresponding map style. It depends on OsmAnd's `default` style. It is optional and **not automatically installed** by placing the OBF on the device. Its exact icon rendering has not been device-tested in this release; built-in IDs and application versions may differ. Avoid over-rendering at low zoom because 410k points can be slow.
|
||||
|
||||
The user's full `.obf` was not provided. Compile it again from the updated OSM source and inspect its POI categories/index; neither a successful OSM export nor this audit proves that OsmAnd indexing retains all custom tags. Geometry classification for the map's **area and line legend** remains a separate review (this patch principally covers POIs). Extended types other than those confirmed by icons are **unverified**, even when they pass the subdivision bounds check. Several extended nautical symbols (e.g., navigation lights) appear plausible but have no matching extracted TYP glyph.
|
||||
## Test a region first
|
||||
|
||||
## 0x10d1f / Несебър
|
||||
```bash
|
||||
python3 scripts/build_bgmountains.py --img gmapsupp.img \
|
||||
--out ./rila-build --bbox 23.22,42.08,23.47,42.29 \
|
||||
--creator ~/OsmAndMapCreator
|
||||
```
|
||||
|
||||
The v0.5 type list showed `есебър` at **43.0592179,27.7399421**. At that latitude it is ~44 km north of the original Nesebar town POI. The v0.6 label-pointer fix no longer returns `есебър` at that record, and the subdivision bounds check suppresses the spurious record. **No synthetic `Несебър` POI has been inserted.** The real original city/town record is preserved unchanged.
|
||||
Alternatively use `--prepare-only` to stop before Java: this produces the OSM plus generated XML and validation reports.
|
||||
|
||||
## Rebuild from existing OSM
|
||||
|
||||
Only use an OSM generated by **v0.7 or later** containing `bgm_poi` tags:
|
||||
|
||||
```bash
|
||||
python3 scripts/build_bgmountains.py \
|
||||
--osm ./BGMountains-build/BGMountains.osm \
|
||||
--catalog ./BGMountains-build/poi-types.csv \
|
||||
--creator ~/OsmAndMapCreator \
|
||||
--out ./obf-rebuild
|
||||
```
|
||||
|
||||
Original v0.6 OSM exports **lack** the `bgm_poi` classifier. The script rejects those for this path rather than quietly producing an incomplete custom POI index. To reuse old data, rerun the IMG extraction with v0.7.
|
||||
|
||||
## How POIs are edited
|
||||
|
||||
- `config/poi-overrides-all-types.csv`: reviewed original IMG type → semantic OSM tags (five-column CSV). You can override/add rules, preserving provenance. This includes the earlier 67 legend/icon matches.
|
||||
- `config/poi-name-fixes.csv`: coordinate-specific correction of verified names, never guessed universally.
|
||||
- `config/poi-additions.csv`: manually add personally verified POIs.
|
||||
- `config/osmand-icons.csv`: optional on-screen **stock OsmAnd** symbol selections for custom raw types.
|
||||
- `data/BGMountains-unique-poi-types.csv`: counts, names, five real sample coordinates per Garmin hex type.
|
||||
- `data/poi-icons`: 96 extracted TYP bitmaps for reference, not automatically installed into OsmAnd.
|
||||
|
||||
### Validation
|
||||
|
||||
The C++/Python roundtrip test checks extracted source POI manifest against OSM coordinates, names and tags. `ctest --test-dir build --output-on-failure` runs 5 bundled tests, including checks of full upstream XML augmentation. On the tested source bbox (23.22,42.08,23.47,42.29) a v0.7 extraction produced 3,986 POIs across 60 types and zero source-versus-OSM mismatches. **These tests do not assert OBF persistence** until MapCreator runs on your machine and `obf-poi-index.txt` is reviewed.
|
||||
|
||||
OsmAnd has separate indexed data for map rendering and POI search, and an additional app-side style/icons component. A successful OBF build does not prove every icon will be visible. To debug OBF use `~/OsmAndMapCreator/inspector.sh -vpoi /path/to/map.obf` and compare the categories to `osmand-config/type-index-summary.json`.
|
||||
|
||||
## Upstream and redistribution
|
||||
|
||||
The repository's C++ converter has its own `LICENSE`; BGMountains-derived SVG/PNG icons, data, examples and Garmin IMG/OBF remain subject to map licensors' conditions. Do not redistribute the full data release or generated OBF as unrestricted ODbL/CC0 without additional rights clearance. The script downloads official OsmAnd XML into a private build directory rather than repackaging those resource files in this source ZIP.
|
||||
|
||||
Official references:
|
||||
- https://osmand.net/docs/technical/map-creation/create-offline-maps-yourself/
|
||||
- https://github.com/osmandapp/OsmAnd-resources/tree/master/poi
|
||||
- https://github.com/osmandapp/OsmAnd-resources/tree/master/obf_creation
|
||||
- https://osmand.net/docs/technical/osmand-file-formats/osmand-rendering-style/
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
export JAVA_OPTS="-Xms256M -Xmx19G"
|
||||
export JAVA_OPTS="-Xms256M -Xmx25G"
|
||||
|
||||
/home/opthq/vector-v4/garmin2osmand-v3/scripts/build_obf.sh \
|
||||
/home/opthq/vector-v4/osm-map-creator \
|
||||
/home/opthq/vector-v4/garmin2osmand-v3/Bulgaria-Garmin.osm
|
||||
../../scripts/build_obf.sh \
|
||||
$(realpath .) \
|
||||
$(realpath ../Bulgaria-garmin.osm)
|
||||
|
||||
@@ -0,0 +1,264 @@
|
||||
code,show_in_custom_style,minzoom,osmand_builtin_icon,count,garmin_icon_extracted,legend_en,reviewed_osm_tags,example_lat,example_lon,note
|
||||
0x200,no,18,information,2,yes,Capital City,place=city;capital=yes,41.0612941,28.8116670,"Custom style opt-in; for recognized OSM types, keep native OsmAnd icons."
|
||||
0x800,no,18,information,51,yes,Large City,place=city,43.9025259,22.2788572,"Custom style opt-in; for recognized OSM types, keep native OsmAnd icons."
|
||||
0x900,no,16,information,283,yes,Town,place=town,42.0570374,24.5459247,"Custom style opt-in; for recognized OSM types, keep native OsmAnd icons."
|
||||
0xd00,yes,16,information,6610,no,,,41.6287208,23.7694144,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0xe00,yes,16,information,114,no,,,43.9952660,22.8717756,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1100,yes,16,information,8430,no,,,42.5975990,22.5972247,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x2800,no,16,information,54902,no,,place=locality,42.6277471,24.3122506,"Custom style opt-in; for recognized OSM types, keep native OsmAnd icons."
|
||||
0x2a07,yes,16,information,227,no,,,43.8551474,25.9693837,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x2a0e,yes,16,information,525,yes,,,42.0046806,24.8740768,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x2b00,no,16,information,1558,no,,tourism=hotel,42.6465440,27.6449919,"Custom style opt-in; for recognized OSM types, keep native OsmAnd icons."
|
||||
0x2c01,no,18,information,20,yes,,,42.0264173,23.9946342,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x2c02,yes,16,information,538,yes,,,42.3479176,25.0754786,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x2c03,yes,16,information,474,yes,,,43.2219315,25.7480693,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x2c05,no,16,information,2481,yes,School,amenity=school,41.7214394,24.6845198,"Custom style opt-in; for recognized OSM types, keep native OsmAnd icons."
|
||||
0x2c06,no,18,information,57,yes,,,43.2240987,27.9363871,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x2c07,no,18,information,20,yes,,,43.1368518,24.7227359,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x2c08,yes,16,information,1328,yes,,,41.9112968,24.9703360,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x2c0b,no,16,information,1606,yes,Church,amenity=place_of_worship,43.0217957,24.8099613,"Custom style opt-in; for recognized OSM types, keep native OsmAnd icons."
|
||||
0x2d01,no,18,information,68,no,,,42.8797030,25.3179932,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x2d02,yes,16,information,434,no,,,42.1507859,24.7315550,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x2d03,no,18,information,57,no,,,42.6922703,23.3241892,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x2d09,no,16,information,337,yes,,leisure=swimming_pool,41.8625021,23.5053134,"Custom style opt-in; for recognized OSM types, keep native OsmAnd icons."
|
||||
0x2e02,yes,16,information,477,no,,,41.6551137,25.5503798,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x2e03,yes,16,information,502,no,,,43.2763910,27.9675651,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x2e04,no,18,information,66,no,,,42.5185919,27.4564004,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x2e05,no,16,information,487,yes,Pharmacy,amenity=pharmacy,42.7442837,25.3431416,"Custom style opt-in; for recognized OSM types, keep native OsmAnd icons."
|
||||
0x2e06,yes,16,information,348,no,,,43.4717417,23.9467192,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x2e07,no,16,information,105,yes,Clothes shop,shop=clothes,43.0698609,25.6080151,"Custom style opt-in; for recognized OSM types, keep native OsmAnd icons."
|
||||
0x2e08,no,18,information,13,no,,,42.7295208,23.2671332,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x2e09,no,18,information,8,no,,,43.2294202,27.8701901,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x2e0a,yes,16,information,159,no,,,43.8517356,25.9867859,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x2e0b,no,18,information,52,no,,,42.1881008,24.3556809,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x2f00,yes,16,information,1269,yes,,,42.9236698,24.2466116,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x2f01,yes,16,information,778,no,,,41.5430832,23.2712317,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x2f03,yes,16,information,106,no,,,41.3775158,25.0830102,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x2f05,no,16,information,486,no,,amenity=post_office,42.0306015,23.8108063,"Custom style opt-in; for recognized OSM types, keep native OsmAnd icons."
|
||||
0x2f06,yes,16,information,320,no,,,42.3073840,23.8596869,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x2f08,yes,16,information,123,yes,,,42.6397204,23.3731771,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x2f0a,no,18,information,4,yes,Synagogue,amenity=place_of_worship;religion=jewish,41.5711713,23.7286234,"Custom style opt-in; for recognized OSM types, keep native OsmAnd icons."
|
||||
0x2f0b,yes,16,information,1499,no,,,43.7308860,23.9443588,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x2f0c,no,16,information,320,yes,Mosque,amenity=place_of_worship;religion=muslim,44.0549612,26.7991304,"Custom style opt-in; for recognized OSM types, keep native OsmAnd icons."
|
||||
0x2f0e,no,18,information,4,yes,Car Wash,amenity=car_wash,42.2939301,22.7035904,"Custom style opt-in; for recognized OSM types, keep native OsmAnd icons."
|
||||
0x3001,yes,16,information,170,yes,,,43.3623934,25.1447439,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x3002,yes,16,information,564,no,,,42.5638032,27.6036644,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x3003,yes,16,information,841,no,,,43.2501698,27.7748966,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x3006,no,18,information,85,yes,,,43.7391043,28.5608482,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x3007,yes,16,information,132,no,,,43.2023406,25.7318473,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x3008,no,18,information,37,yes,Fire Station,amenity=fire_station,42.5666571,27.6193285,"Custom style opt-in; for recognized OSM types, keep native OsmAnd icons."
|
||||
0x4700,no,16,information,101,yes,Port,industrial=port,41.6431189,25.2845192,"Custom style opt-in; for recognized OSM types, keep native OsmAnd icons."
|
||||
0x4e00,no,18,information,14,no,,,41.9877291,24.0870094,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x6400,no,16,information,465,yes,Quarry,landuse=quarry,40.8776808,23.9436078,"Custom style opt-in; for recognized OSM types, keep native OsmAnd icons."
|
||||
0x6401,no,16,information,1679,yes,Bridge,man_made=bridge,42.6645684,22.9691291,"Custom style opt-in; for recognized OSM types, keep native OsmAnd icons."
|
||||
0x6402,no,16,information,6186,yes,Building,building=yes,42.5507569,23.2217932,"Custom style opt-in; for recognized OSM types, keep native OsmAnd icons."
|
||||
0x6403,yes,16,information,1729,yes,Graveyard/Tombstone,,43.0418801,23.5914874,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x6404,no,16,information,1507,yes,Church,amenity=place_of_worship,42.1896243,27.0861053,"Custom style opt-in; for recognized OSM types, keep native OsmAnd icons."
|
||||
0x6405,yes,16,information,260,yes,Hunting Lodge,,42.7514720,27.2207522,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x6406,no,16,information,854,yes,Barrier/Gate,barrier=gate,41.5502286,24.7455668,"Custom style opt-in; for recognized OSM types, keep native OsmAnd icons."
|
||||
0x6407,no,16,information,2861,yes,Picnic Site,tourism=picnic_site,41.9156528,25.3233576,"Custom style opt-in; for recognized OSM types, keep native OsmAnd icons."
|
||||
0x6408,no,18,information,12,yes,Mountain Rescue,emergency=mountain_rescue,42.6026416,23.2414269,"Custom style opt-in; for recognized OSM types, keep native OsmAnd icons."
|
||||
0x6409,no,16,information,1235,yes,Monument,historic=monument,43.1282043,23.6027098,"Custom style opt-in; for recognized OSM types, keep native OsmAnd icons."
|
||||
0x640a,yes,16,information,2095,yes,Danger,,43.1507993,25.3284001,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x640b,no,16,information,1128,yes,Chapel,amenity=place_of_worship,41.9598985,24.3688774,"Custom style opt-in; for recognized OSM types, keep native OsmAnd icons."
|
||||
0x640c,no,16,information,1353,yes,Mine Shaft,man_made=mine_shaft,43.0497336,22.9328442,"Custom style opt-in; for recognized OSM types, keep native OsmAnd icons."
|
||||
0x640d,yes,16,information,137,yes,Lift,,42.6056242,23.2995987,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x640e,no,16,information,977,yes,Bus Stop/Station,highway=bus_stop,43.3513427,25.1430917,"Custom style opt-in; for recognized OSM types, keep native OsmAnd icons."
|
||||
0x640f,yes,16,information,2766,yes,Graveyard/Tombstone,,42.0345068,22.4919534,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x6410,no,18,information,98,yes,,,43.6105728,23.6852574,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x6411,no,16,information,875,yes,Tower,man_made=tower,41.7411375,24.8182654,"Custom style opt-in; for recognized OSM types, keep native OsmAnd icons."
|
||||
0x6413,no,18,information,76,yes,Tunnel,,42.6872063,23.3418703,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x6414,no,16,information,32922,yes,Drinking Water,amenity=drinking_water,43.1117034,23.7205982,"Custom style opt-in; for recognized OSM types, keep native OsmAnd icons."
|
||||
0x6415,no,16,information,264,yes,Camp Site,tourism=camp_site,41.7506647,25.1023221,"Custom style opt-in; for recognized OSM types, keep native OsmAnd icons."
|
||||
0x6416,no,16,information,2886,yes,Ruins,historic=ruins,41.5940452,24.3094182,"Custom style opt-in; for recognized OSM types, keep native OsmAnd icons."
|
||||
0x6417,no,16,information,8868,yes,Well,man_made=water_well,42.2628808,24.2223430,"Custom style opt-in; for recognized OSM types, keep native OsmAnd icons."
|
||||
0x6418,yes,16,information,305,yes,,,42.7693677,26.3003898,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x6419,yes,16,information,113,yes,,,42.5478601,26.7053819,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x641a,no,18,information,62,yes,Church,amenity=place_of_worship,42.9599547,23.0566549,"Custom style opt-in; for recognized OSM types, keep native OsmAnd icons."
|
||||
0x641c,no,16,information,3120,yes,Bus Stop/Station,highway=bus_stop,42.8542113,25.3382707,"Custom style opt-in; for recognized OSM types, keep native OsmAnd icons."
|
||||
0x641d,no,18,information,17,yes,,,42.1828008,24.7408462,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x641e,no,18,information,55,yes,,,42.3201728,24.3003416,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x641f,no,18,information,1,yes,,,43.7468505,23.7692428,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x6500,yes,16,information,31214,yes,Reservoir,,42.0310307,24.7559094,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x6501,no,16,information,2412,yes,Restaurant,amenity=restaurant,43.3456135,28.0715060,"Custom style opt-in; for recognized OSM types, keep native OsmAnd icons."
|
||||
0x6502,yes,16,information,1864,yes,River Passage,,42.7929711,25.2992177,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x6503,yes,16,information,760,yes,Crossroad,,43.4149003,28.4942007,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x6506,no,16,information,424,yes,Museum,tourism=museum,42.1463013,24.7487855,"Custom style opt-in; for recognized OSM types, keep native OsmAnd icons."
|
||||
0x650b,yes,16,information,8767,yes,Winter Marking,,42.0000887,23.3820820,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x6511,no,16,information,50308,yes,Spring,natural=spring,42.8732872,23.3371925,"Custom style opt-in; for recognized OSM types, keep native OsmAnd icons."
|
||||
0x6600,yes,16,information,66206,yes,Triangulation,,41.2312603,22.6785922,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x6601,yes,16,information,165,yes,Natural Phenomenon,,42.9589677,25.2119064,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x6602,no,16,information,891,yes,Viewpoint,tourism=viewpoint,41.7438412,23.4641790,"Custom style opt-in; for recognized OSM types, keep native OsmAnd icons."
|
||||
0x6603,no,16,information,26366,yes,Triangulation,man_made=survey_point,42.5520873,23.8540435,"Custom style opt-in; for recognized OSM types, keep native OsmAnd icons."
|
||||
0x6604,no,18,information,10,yes,,,42.2186995,27.7872348,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x6608,no,16,information,2644,yes,Hotel,tourism=hotel,42.8794885,27.8957462,"Custom style opt-in; for recognized OSM types, keep native OsmAnd icons."
|
||||
0x6609,no,16,information,372,yes,Hut,tourism=alpine_hut,43.2779145,27.1159101,"Custom style opt-in; for recognized OSM types, keep native OsmAnd icons."
|
||||
0x660a,no,16,information,275,yes,Refuge,amenity=shelter;shelter_type=basic_hut,42.8157377,23.8160634,"Custom style opt-in; for recognized OSM types, keep native OsmAnd icons."
|
||||
0x660b,yes,16,information,2612,yes,Mark,,43.9378452,22.4072385,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x660c,no,18,information,94,yes,,natural=saddle,43.6241341,22.4983478,"Custom style opt-in; for recognized OSM types, keep native OsmAnd icons."
|
||||
0x660d,no,18,information,8,yes,,,42.6904893,23.4124017,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x660e,no,18,information,8,yes,,,43.4520006,24.5126653,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x660f,no,18,information,44,yes,,,42.6426816,26.3592696,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x6610,no,18,information,15,yes,Meadow,,42.8212094,26.1542845,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x6613,no,16,information,1746,yes,Waterfall,waterway=waterfall,42.7435327,24.6398234,"Custom style opt-in; for recognized OSM types, keep native OsmAnd icons."
|
||||
0x6614,yes,16,information,15289,yes,Rock,,42.7437901,25.2693915,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x6615,no,16,information,942,yes,Cave,natural=cave_entrance,41.8003178,23.3853436,"Custom style opt-in; for recognized OSM types, keep native OsmAnd icons."
|
||||
0x6616,no,16,information,15540,no,,natural=peak,42.8516150,25.7782173,"Custom style opt-in; for recognized OSM types, keep native OsmAnd icons."
|
||||
0x6617,no,16,information,112,yes,Peak,natural=peak,41.7893529,22.9647946,"Custom style opt-in; for recognized OSM types, keep native OsmAnd icons."
|
||||
0x6618,no,16,information,10176,yes,Tree,natural=tree,42.7752686,23.9033318,"Custom style opt-in; for recognized OSM types, keep native OsmAnd icons."
|
||||
0x6619,no,16,information,195,yes,Prehistoric site,historic=archaeological_site,42.5703692,25.3767228,"Custom style opt-in; for recognized OSM types, keep native OsmAnd icons."
|
||||
0x661a,no,16,information,384,yes,Antiquity site,historic=archaeological_site,41.7153454,26.0307527,"Custom style opt-in; for recognized OSM types, keep native OsmAnd icons."
|
||||
0x661b,no,16,information,319,yes,Medieval site,historic=archaeological_site,42.0922279,24.2505813,"Custom style opt-in; for recognized OSM types, keep native OsmAnd icons."
|
||||
0x661c,yes,16,information,1169,yes,,,41.8346500,26.4578676,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x661d,yes,16,information,1412,yes,,,41.1914778,24.0922236,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x661e,no,16,information,979,yes,,amenity=shelter,41.4122772,24.8197031,"Custom style opt-in; for recognized OSM types, keep native OsmAnd icons."
|
||||
0x10000,no,18,information,2,no,,,43.1772995,27.7539325,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x10018,no,18,information,2,no,,,43.1856465,27.9490042,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x10100,no,18,information,12,no,,,42.4783373,27.4493837,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x10118,no,18,information,1,no,,,43.1870842,27.6683164,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1011e,no,18,information,1,no,,,42.5841022,27.6902461,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x10204,no,18,information,2,no,,,42.6573801,27.7476025,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x10205,no,18,information,1,no,,,42.4590254,27.5740099,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x10209,no,18,information,8,no,,,42.4733591,27.4699187,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1020a,no,18,information,9,no,,,42.4602699,27.4538684,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1020b,no,18,information,5,no,,,41.8699050,28.0232477,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1020c,no,18,information,2,no,,,43.1899381,27.8013968,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x10218,no,18,information,3,no,,,42.0534110,27.9847956,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x10301,yes,16,information,2006,no,,,43.4377956,28.9283538,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x10401,yes,16,information,157,no,,,42.6565218,27.7297497,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x10402,no,18,information,41,no,,,43.2109666,28.1308579,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x10403,no,18,information,2,no,,,41.3038731,28.7996078,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1040d,yes,16,information,229,no,,,41.9180989,28.0489111,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1040e,no,18,information,4,no,,,42.8295565,27.9202938,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1041e,no,18,information,1,no,,,42.6499343,27.8320599,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x10501,no,18,information,1,no,,,43.2052803,27.9446054,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x10602,no,18,information,1,no,,,42.7095008,27.8530884,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1061d,no,18,information,1,no,,,43.2051730,27.9395843,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x10701,no,18,information,58,no,,,43.1964397,27.8618217,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x10705,no,18,information,33,no,,,43.2224250,28.1217384,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x10706,no,18,information,32,no,,,43.4509492,28.8183832,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x10801,no,18,information,1,no,,,42.8644896,27.9285121,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x10903,no,18,information,1,no,,,42.6283908,27.6877141,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x10a01,no,18,information,1,no,,,43.2014394,27.8667355,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x10b01,no,18,information,1,no,,,41.8894100,28.0229688,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x10b09,no,18,information,1,no,,,43.2140994,27.9750752,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x10c00,no,18,information,1,no,,,43.2016969,27.9050374,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x10d01,no,18,information,1,no,,,43.2011819,27.8610492,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1161f,no,18,information,1,no,,,43.1953883,27.9319453,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1171e,no,18,information,1,no,,,43.2054305,27.8968406,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1181f,no,18,information,1,no,,,43.2013321,27.7061892,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x11901,no,18,information,1,no,,,43.8046575,28.5944295,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x11902,no,18,information,1,no,,,43.2049370,27.7813983,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x11a02,no,18,information,1,no,,,43.1968260,27.6557207,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1201f,no,18,information,1,no,,,42.5242352,27.5483894,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x12102,no,18,information,1,no,,,42.4892378,27.5353217,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x12502,no,18,information,1,no,,,43.2015038,27.8690314,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x12a03,no,18,information,1,no,,,42.6277685,27.7115536,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x12c1e,no,18,information,1,no,,,43.2013321,27.7046227,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x12d01,no,18,information,1,no,,,43.1838441,27.9260015,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x12e1f,no,18,information,1,no,,,43.2423377,28.1846094,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x13001,no,18,information,1,no,,,43.1683517,28.0398345,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1321f,no,18,information,1,no,,,42.6127267,27.8121257,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1331f,no,18,information,1,no,,,43.2015467,27.8662419,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x13400,no,18,information,1,no,,,43.1861830,27.9269886,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x13a01,no,18,information,1,no,,,42.5860548,27.6915121,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x13c03,no,18,information,1,no,,,42.4661279,27.6418805,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x13d1e,no,18,information,1,no,,,43.2068896,27.9138136,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1411e,no,18,information,1,no,,,43.2047009,27.7807546,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x14400,no,18,information,1,no,,,43.2175541,27.9579949,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x14401,no,18,information,1,no,,,43.2052159,27.9493475,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1441c,no,18,information,1,no,,,43.1683731,28.0286121,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x14501,no,18,information,1,no,,,42.6383686,27.8804684,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x14602,no,18,information,1,no,,,43.1857967,27.8471661,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1461c,no,18,information,1,no,,,43.2015252,27.7032280,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1461f,no,18,information,1,no,,,43.2052588,27.8920341,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1471f,no,18,information,1,no,,,43.2224464,27.8871202,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x14803,no,18,information,1,no,,,42.5953245,27.7765274,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1481f,no,18,information,1,no,,,43.2054090,27.8980207,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x14a1e,no,18,information,1,no,,,43.2069111,27.9140067,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x14b01,no,18,information,1,no,,,43.2014823,27.8672075,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x14c01,no,18,information,1,no,,,43.2069111,27.9118609,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x14d1f,no,18,information,1,no,,,42.5163817,27.6553559,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x14e1e,no,18,information,1,no,,,42.4459577,27.6790023,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x15200,no,18,information,1,no,,,43.2048941,27.7857113,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x15303,no,18,information,1,no,,,43.2014179,27.8711987,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1541d,no,18,information,1,no,,,42.4657202,27.6436615,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x15501,no,18,information,1,no,,,43.2052588,27.8956819,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x15800,no,18,information,1,no,,,43.2052588,27.9370308,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x15a00,no,18,information,1,no,,,43.2053447,27.8867555,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x15e01,no,18,information,1,no,,,42.6091433,27.6586604,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x16103,no,18,information,1,no,,,43.1455421,28.0770850,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x16201,no,18,information,1,no,,,43.2000232,27.9100585,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x16701,no,18,information,1,no,,,43.1955171,27.9348421,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1681c,no,18,information,1,no,,,42.6561785,27.8976774,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1681d,no,18,information,1,no,,,43.2166100,28.0465937,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x16a00,no,18,information,1,no,,,43.2054305,27.8999090,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x16b1c,no,18,information,1,no,,,42.6562428,27.9021621,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x16e1f,no,18,information,1,no,,,42.6637101,27.7445555,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x17000,no,18,information,1,no,,,42.5416589,27.6806760,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1711d,no,18,information,1,no,,,43.2069111,27.9155731,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x17303,no,18,information,1,no,,,42.5860977,27.6886582,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1731e,no,18,information,1,no,,,43.1925559,27.8419733,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1751f,no,18,information,1,no,,,43.2048941,27.7850676,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1771e,no,18,information,1,no,,,42.4598193,27.7104378,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1791e,no,18,information,1,no,,,43.2051516,27.8927636,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x17d1e,no,18,information,1,no,,,43.2051086,27.9474807,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x17e03,no,18,information,1,no,,,43.1967616,27.6618361,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x18003,no,18,information,1,no,,,43.1717634,27.9500127,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1811e,no,18,information,1,no,,,42.5413799,27.6878858,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x18302,no,18,information,1,no,,,43.2048941,27.7903032,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1861d,no,18,information,1,no,,,43.2015252,27.8606415,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1861f,no,18,information,1,no,,,43.2055807,27.8994370,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x18901,no,18,information,1,no,,,42.6384759,27.8675079,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x18a1f,no,18,information,2,no,,,43.2052374,27.8961754,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x18c1e,no,18,information,1,no,,,43.2053876,27.8944159,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x18d01,no,18,information,1,no,,,42.6413083,27.7646613,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x19001,no,18,information,1,no,,,42.6142931,27.7507782,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1921f,no,18,information,1,no,,,43.1928349,27.8456640,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x19a00,no,18,information,1,no,,,43.0997944,27.9608488,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x19d03,no,18,information,1,no,,,42.8070259,27.9287481,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1a11f,no,18,information,1,no,,,42.6562643,27.9072046,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1a401,no,18,information,1,no,,,43.1839085,27.9244995,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1a501,no,18,information,1,no,,,42.6584101,27.8624225,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1a51c,no,18,information,1,no,,,43.2050872,27.9406786,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1a800,no,18,information,1,no,,,42.5856042,27.6471162,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1a81c,no,18,information,1,no,,,43.2015252,27.7040648,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1a91c,no,18,information,1,no,,,43.2051516,27.9386616,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1a91f,no,18,information,1,no,,,43.1954098,27.9332972,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1ab1f,no,18,information,1,no,,,42.5952172,27.7136993,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1b101,no,18,information,1,no,,,43.1928992,27.8481531,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1b31f,no,18,information,1,no,,,43.2052374,27.9455066,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1b402,no,18,information,2,no,,,42.5443196,27.5562000,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1b41c,no,18,information,2,no,,,43.1952381,27.7601337,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1b703,no,18,information,1,no,,,42.7092648,27.8581309,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1ba03,no,18,information,1,no,,,43.2014394,27.8686452,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1be1c,no,18,information,1,no,,,43.2013321,27.7118969,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1c11e,no,18,information,1,no,,,43.1928992,27.8475738,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1c31d,no,18,information,1,no,,,43.1954956,27.9373097,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1c500,no,18,information,1,no,,,43.2015681,27.8681087,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1c71f,no,18,information,1,no,,,43.2048726,27.7903676,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1c81e,no,18,information,1,no,,,43.1928992,27.8485823,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1cb1f,no,18,information,1,no,,,43.2015681,27.8663921,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1ce02,no,18,information,1,no,,,43.2049799,27.7835441,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1d501,no,18,information,1,no,,,42.4691319,27.6782942,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1d51e,no,18,information,1,no,,,43.2054305,27.8993511,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1d61f,no,18,information,1,no,,,43.2015681,27.8704262,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1d71c,no,18,information,1,no,,,43.2011819,27.8677869,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1d800,no,18,information,1,no,,,43.2052159,27.8855324,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1da01,no,18,information,1,no,,,42.5940800,27.8528523,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1da1e,no,18,information,1,no,,,42.4458933,27.5304723,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1db01,no,18,information,1,no,,,43.1839299,27.9252076,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1db1e,no,18,information,1,no,,,43.2012463,27.8598905,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1db1f,no,18,information,1,no,,,43.1928563,27.8472519,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1dc01,no,18,information,1,no,,,43.1860757,27.8722286,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1de1f,no,18,information,1,no,,,43.2052588,27.9385757,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1e101,no,18,information,1,no,,,43.1975555,27.8627014,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1e21f,no,18,information,2,no,,,43.2048941,27.7844238,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1ea00,no,18,information,1,no,,,43.1715059,27.9508066,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1ec1d,no,18,information,1,no,,,43.2013321,27.7051377,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1f401,no,18,information,1,no,,,43.1708193,28.0719352,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1f501,no,18,information,1,no,,,42.5145793,27.5918198,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1fb01,no,18,information,1,no,,,43.2013750,27.7114248,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1ff00,no,18,information,1,no,,,43.2054734,27.8981280,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1ff11,no,18,information,1,no,,,42.4699044,27.4409509,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
0x1ff18,no,18,information,1,no,,,43.1953454,27.9564929,Unclassified: verify against Garmin TYP legend before changing the icon.
|
||||
|
@@ -0,0 +1,88 @@
|
||||
garmin_hex,count,legend_en,legend_bg,verified_osm_tags,extracted_garmin_icon,example1_lat,example1_lon,example1_name,example2_lat,example2_lon,review_status,default_osmand_display
|
||||
0x6600,66206,Triangulation,Кота,,yes,41.2312603,22.6785922,217,42.8680515,22.6715970,icon_legend_verified,custom_style_information
|
||||
0x2800,54902,,,place=locality,no,42.6277471,24.3122506,Големия поп,43.3119893,27.8330684,not_on_legend,native_osmand
|
||||
0x6511,50308,Spring,Извор,natural=spring,yes,42.8732872,23.3371925,Студена вода,42.5154161,23.1598663,icon_legend_verified,native_osmand
|
||||
0x6414,32922,Drinking Water,Чешма,amenity=drinking_water,yes,43.1117034,23.7205982,затлачена,42.2771502,25.3026724,icon_legend_verified,native_osmand
|
||||
0x6500,31214,Reservoir,Каптаж,,yes,42.0310307,24.7559094,Забучена,42.7306151,22.7937984,icon_legend_verified,custom_style_information
|
||||
0x6603,26366,Triangulation,Кота,man_made=survey_point,yes,42.5520873,23.8540435,1079,42.5116181,23.8444304,icon_legend_verified,native_osmand
|
||||
0x6616,15540,,,natural=peak,no,42.8516150,25.7782173,Симов чукар,43.4484601,23.3003926,name_supported,native_osmand
|
||||
0x6614,15289,Rock,Скала,,yes,42.7437901,25.2693915,15,42.7658057,25.9388924,icon_legend_verified,custom_style_information
|
||||
0x6618,10176,Tree,Дърво,natural=tree,yes,42.7752686,23.9033318,столетно дърво,43.2969904,24.6177006,icon_legend_verified,native_osmand
|
||||
0x6417,8868,Well,Кладенец,man_made=water_well,yes,42.2628808,24.2223430,Юсеиновия кладенец,41.7512012,25.0972795,icon_legend_verified,native_osmand
|
||||
0x650b,8767,Winter Marking,Зимна маркировка,,yes,42.0000887,23.3820820,94,42.7546048,24.7787404,icon_legend_verified,custom_style_information
|
||||
0x1100,8430,,,,no,42.5975990,22.5972247,Върбица,42.8741455,25.5907202,not_on_legend,custom_style_information
|
||||
0xd00,6610,,,,no,41.6287208,23.7694144,Балдево,43.4385252,26.5020704,not_on_legend,custom_style_information
|
||||
0x6402,6186,Building,Сграда,building=yes,yes,42.5507569,23.2217932,Чакало,42.2648549,23.5112143,icon_legend_verified,native_osmand
|
||||
0x641c,3120,Bus Stop/Station,Спирка,highway=bus_stop,yes,42.8542113,25.3382707,1-7-10-14,42.8205442,23.3609891,icon_legend_verified,native_osmand
|
||||
0x6416,2886,Ruins,Руини,historic=ruins,yes,41.5940452,24.3094182,Разв.,41.9296217,24.6835971,icon_legend_verified,native_osmand
|
||||
0x6407,2861,Picnic Site,Пикник,tourism=picnic_site,yes,41.9156528,25.3233576,беседка,42.6045942,23.4355974,icon_legend_verified,native_osmand
|
||||
0x640f,2766,Graveyard/Tombstone,"Гробище, оброк",,yes,42.0345068,22.4919534,Гробище,41.4501715,24.6433210,icon_legend_verified,custom_style_information
|
||||
0x6608,2644,Hotel,Хотел,tourism=hotel,yes,42.8794885,27.8957462,Fortuna Cape Complex,42.3725724,27.7117682,icon_legend_verified,native_osmand
|
||||
0x660b,2612,Mark,Маркировка,,yes,43.9378452,22.4072385,Пир. 454,41.6514015,24.3190312,icon_legend_verified,custom_style_information
|
||||
0x2c05,2481,School,Училище,amenity=school,yes,41.7214394,24.6845198,СУ Олимпийски Надежди,42.2714853,24.5394874,icon_legend_verified,native_osmand
|
||||
0x6501,2412,Restaurant,Ресторант,amenity=restaurant,yes,43.3456135,28.0715060,Therma beach,42.4869204,26.4846039,icon_legend_verified,native_osmand
|
||||
0x640a,2095,Danger,Опасност,,yes,43.1507993,25.3284001,Стълба,42.5652623,23.4620762,icon_legend_verified,custom_style_information
|
||||
0x10301,2006,,,,no,43.4377956,28.9283538,,42.2109532,27.8938365,extended_unverified,custom_style_information
|
||||
0x6502,1864,River Passage,Брод,,yes,42.7929711,25.2992177,Бент,42.1954823,23.7029600,icon_legend_verified,custom_style_information
|
||||
0x6613,1746,Waterfall,Водопад,waterway=waterfall,yes,42.7435327,24.6398234,Кастрак дере горен,42.0257735,24.5287156,icon_legend_verified,native_osmand
|
||||
0x6403,1729,Graveyard/Tombstone,"Гробище, оброк",,yes,43.0418801,23.5914874,Св. Мария Магдалена,41.7204952,24.8700428,icon_legend_verified,custom_style_information
|
||||
0x6401,1679,Bridge,Мост,man_made=bridge,yes,42.6645684,22.9691291,Зидан мост,41.3415956,22.8474855,icon_legend_verified,native_osmand
|
||||
0x2c0b,1606,Church,Църква,amenity=place_of_worship,yes,43.0217957,24.8099613,Рождество Богородично,41.6844034,25.7115483,icon_legend_verified,native_osmand
|
||||
0x2b00,1558,,,tourism=hotel,no,42.6465440,27.6449919,Sotirovi Holiday,41.6332698,24.7040462,not_on_legend,native_osmand
|
||||
0x6404,1507,Church,Църква,amenity=place_of_worship,yes,42.1896243,27.0861053,Св. Димитър,42.6495481,23.1854010,icon_legend_verified,native_osmand
|
||||
0x2f0b,1499,,,,no,43.7308860,23.9443588,автополигон,42.2151589,24.0181303,not_on_legend,custom_style_information
|
||||
0x661d,1412,,,,yes,41.1914778,24.0922236,Овчарник,42.7084708,25.3351378,not_on_legend,custom_style_information
|
||||
0x640c,1353,Mine Shaft,Мина,man_made=mine_shaft,yes,43.0497336,22.9328442,(Въгл.),41.5701199,24.6346951,icon_legend_verified,native_osmand
|
||||
0x2c08,1328,,,,yes,41.9112968,24.9703360,"Конна база ""Wild City""",42.6861334,23.3365059,not_on_legend,custom_style_information
|
||||
0x2f00,1269,,,,yes,42.9236698,24.2466116,индустриални сгради,42.8208017,23.1913233,not_on_legend,custom_style_information
|
||||
0x6409,1235,Monument,Паметник,historic=monument,yes,43.1282043,23.6027098,Перо Херцеговинеца,42.4960184,22.8770757,icon_legend_verified,native_osmand
|
||||
0x661c,1169,,,,yes,41.8346500,26.4578676,Койчовата могила,43.6355710,28.5723281,not_on_legend,custom_style_information
|
||||
0x640b,1128,Chapel,Параклис,amenity=place_of_worship,yes,41.9598985,24.3688774,Параклис,41.9762921,24.8116350,icon_legend_verified,native_osmand
|
||||
0x661e,979,,,amenity=shelter,yes,41.4122772,24.8197031,Навес с барбекю,41.3865280,24.7667241,not_on_legend,native_osmand
|
||||
0x640e,977,Bus Stop/Station,Спирка,highway=bus_stop,yes,43.3513427,25.1430917,Левски,42.3796749,22.7069807,icon_legend_verified,native_osmand
|
||||
0x6615,942,Cave,Пещера,natural=cave_entrance,yes,41.8003178,23.3853436,Дупка,43.2577872,24.0077662,icon_legend_verified,native_osmand
|
||||
0x6602,891,Viewpoint,Гледка,tourism=viewpoint,yes,41.7438412,23.4641790,Кьошка (Балконе)-панорама,42.8009748,27.1023059,icon_legend_verified,native_osmand
|
||||
0x6411,875,Tower,Кула,man_made=tower,yes,41.7411375,24.8182654,GSM клетка,42.1343064,24.8024940,icon_legend_verified,native_osmand
|
||||
0x6406,854,Barrier/Gate,Бариера,barrier=gate,yes,41.5502286,24.7455668,Военен обект!,41.2806129,25.2994323,icon_legend_verified,native_osmand
|
||||
0x3003,841,,,,no,43.2501698,27.7748966,Кметство,41.8338132,24.8308182,not_on_legend,custom_style_information
|
||||
0x2f01,778,,,,no,41.5430832,23.2712317,Газостанция,43.7991214,26.1920500,not_on_legend,custom_style_information
|
||||
0x6503,760,Crossroad,Кръстопът,,yes,43.4149003,28.4942007,на запад Черноморски път,41.5363026,23.6495304,icon_legend_verified,custom_style_information
|
||||
0x3002,564,,,,no,42.5638032,27.6036644,First Aid,42.4966407,24.7085094,not_on_legend,custom_style_information
|
||||
0x2c02,538,,,,yes,42.3479176,25.0754786,Детска градина,43.5124254,26.7439628,not_on_legend,custom_style_information
|
||||
0x2a0e,525,,,,yes,42.0046806,24.8740768,Pandora,42.6043367,23.0305839,not_on_legend,custom_style_information
|
||||
0x2e03,502,,,,no,43.2763910,27.9675651,магазин,42.1473527,24.7843194,not_on_legend,custom_style_information
|
||||
0x2e05,487,Pharmacy,Аптека,amenity=pharmacy,yes,42.7442837,25.3431416,Аптечка,42.6866698,23.3093405,icon_legend_verified,native_osmand
|
||||
0x2f05,486,,,amenity=post_office,no,42.0306015,23.8108063,Поща,43.7494254,27.4069619,not_on_legend,native_osmand
|
||||
0x2e02,477,,,,no,41.6551137,25.5503798,Хранителни стоки,41.6634393,24.3756366,not_on_legend,custom_style_information
|
||||
0x2c03,474,,,,yes,43.2219315,25.7480693,читалище Съединение,43.7368727,26.1066914,not_on_legend,custom_style_information
|
||||
0x6400,465,Quarry,Кариера,landuse=quarry,yes,40.8776808,23.9436078,(Кам.),42.0491624,26.4963627,icon_legend_verified,native_osmand
|
||||
0x2d02,434,,,,no,42.1507859,24.7315550,Casa de Cuba,42.0225549,23.9974666,not_on_legend,custom_style_information
|
||||
0x6506,424,Museum,Музей,tourism=museum,yes,42.1463013,24.7487855,Градска художествена галерия,42.4936581,27.4754548,icon_legend_verified,native_osmand
|
||||
0x661a,384,Antiquity site,Античен обект,historic=archaeological_site,yes,41.7153454,26.0307527,Тракийска крепост Курт кале,43.2776999,27.1080351,icon_legend_verified,native_osmand
|
||||
0x6609,372,Hut,Хижа,tourism=alpine_hut,yes,43.2779145,27.1159101,Хижа Мадарски конник,41.8324399,24.7721529,icon_legend_verified,native_osmand
|
||||
0x2e06,348,,,,no,43.4717417,23.9467192,Trayкov Shop,42.6665640,25.4079223,not_on_legend,custom_style_information
|
||||
0x2d09,337,,,leisure=swimming_pool,yes,41.8625021,23.5053134,Минерален басейн Пирин,42.2918701,23.2552886,not_on_legend,native_osmand
|
||||
0x2f06,320,,,,no,42.3073840,23.8596869,Банка ДСК,43.2122111,27.9121184,not_on_legend,custom_style_information
|
||||
0x2f0c,320,Mosque,Джамия,amenity=place_of_worship;religion=muslim,yes,44.0549612,26.7991304,Джамия,41.4958334,24.6339655,icon_legend_verified,native_osmand
|
||||
0x661b,319,Medieval site,Средновековен обект,historic=archaeological_site,yes,42.0922279,24.2505813,"Средновековен манастир ""Св. Седмочиленици""",42.2452426,24.0083671,icon_legend_verified,native_osmand
|
||||
0x6418,305,,,,yes,42.7693677,26.3003898,Ветрогенератор,42.7765560,26.3197017,not_on_legend,custom_style_information
|
||||
0x900,283,Town,Град <75 000,place=town,yes,42.0570374,24.5459247,Перущица,40.8942676,26.1739397,icon_legend_verified,native_osmand
|
||||
0x660a,275,Refuge,Заслон,amenity=shelter;shelter_type=basic_hut,yes,42.8157377,23.8160634,Заслон,42.7268600,26.3467383,icon_legend_verified,native_osmand
|
||||
0x6415,264,Camp Site,Място за бивакуване,tourism=camp_site,yes,41.7506647,25.1023221,Бивак,43.2923126,27.1431398,icon_legend_verified,native_osmand
|
||||
0x6405,260,Hunting Lodge,Ловна хижа,,yes,42.7514720,27.2207522,заслон Зайчар,41.6350079,25.5436206,icon_legend_verified,custom_style_information
|
||||
0x1040d,229,,,,no,41.9180989,28.0489111,,42.8007388,27.8943729,extended_unverified,custom_style_information
|
||||
0x2a07,227,,,,no,43.8551474,25.9693837,Тирол,42.7743888,26.8785238,not_on_legend,custom_style_information
|
||||
0x6619,195,Prehistoric site,Праисторически обект,historic=archaeological_site,yes,42.5703692,25.3767228,Бащин камък (Слънчева врата),41.9394493,26.1900759,icon_legend_verified,native_osmand
|
||||
0x3001,170,,,,yes,43.3623934,25.1447439,полиция,43.1404138,24.7057414,not_on_legend,custom_style_information
|
||||
0x6601,165,Natural Phenomenon,Природен феномен,,yes,42.9589677,25.2119064,"скален феномен ""Момичките""",42.5682020,25.5528045,icon_legend_verified,custom_style_information
|
||||
0x2e0a,159,,,,no,43.8517356,25.9867859,Автокъщи,43.2120609,27.9186201,not_on_legend,custom_style_information
|
||||
0x10401,157,,,,no,42.6565218,27.7297497,,43.2037354,27.8479171,extended_unverified,custom_style_information
|
||||
0x640d,137,Lift,Лифт,,yes,42.6056242,23.2995987,Драгалевски междинна,42.5832009,23.2924747,icon_legend_verified,custom_style_information
|
||||
0x3007,132,,,,no,43.2023406,25.7318473,Помпена ст.,42.6586461,27.7180338,not_on_legend,custom_style_information
|
||||
0x2f08,123,,,,yes,42.6397204,23.3731771,Акад. Александър Теодоров - Балан,42.7053809,23.3233523,not_on_legend,custom_style_information
|
||||
0xe00,114,,,,no,43.9952660,22.8717756,жк. Крум Бъчваров,43.9941502,22.8833628,not_on_legend,custom_style_information
|
||||
0x6419,113,,,,yes,42.5478601,26.7053819,Фотоволтаична ценрала,42.4148440,25.6047320,not_on_legend,custom_style_information
|
||||
0x6617,112,Peak,Връх,natural=peak,yes,41.7893529,22.9647946,Огреяк (Кадийца) (1924),41.9179702,24.9033022,icon_legend_verified,native_osmand
|
||||
0x2f03,106,,,,no,41.3775158,25.0830102,"Автосервиз ""Профиров""",43.8112664,25.9830523,not_on_legend,custom_style_information
|
||||
0x2e07,105,Clothes shop,Магазин за дрехи,shop=clothes,yes,43.0698609,25.6080151,"Кооперативен пазар ""Бузлуджа""",42.1253800,24.7373700,icon_legend_verified,native_osmand
|
||||
0x4700,101,Port,Пристанище,industrial=port,yes,41.6431189,25.2845192,Пристан,42.0604706,27.9666424,icon_legend_verified,native_osmand
|
||||
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"source_pois": 3986,
|
||||
"expected_after_drops": 3986,
|
||||
"declared_drops": 0,
|
||||
"osm_pois": 3986,
|
||||
"missing": 0,
|
||||
"extra": 0,
|
||||
"rule_tag_violations": {},
|
||||
"examples": [],
|
||||
"status": "PASS",
|
||||
"limitation": "Same IMG decoder is used for manifest and OSM: this validates export fidelity, not ground truth or OBF persistence."
|
||||
}
|
||||
Executable
+303
@@ -0,0 +1,303 @@
|
||||
#!/usr/bin/env python3
|
||||
"""One-command BGMountains IMG -> reviewed OSM -> custom indexed OsmAnd OBF.
|
||||
|
||||
Only Python 3 stdlib needed for orchestration; CMake/C++/OsmAndMapCreator are external.
|
||||
"""
|
||||
from __future__ import annotations
|
||||
import argparse
|
||||
import csv
|
||||
import datetime as dt
|
||||
import hashlib
|
||||
import json
|
||||
import os
|
||||
from pathlib import Path
|
||||
import shutil
|
||||
import subprocess
|
||||
import sys
|
||||
import urllib.request
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[1]
|
||||
UPSTREAM = {
|
||||
'poi': 'https://raw.githubusercontent.com/osmandapp/OsmAnd-resources/master/poi/poi_types.xml',
|
||||
'rendering': 'https://raw.githubusercontent.com/osmandapp/OsmAnd-resources/master/obf_creation/rendering_types.xml'
|
||||
}
|
||||
|
||||
def call(argv, cwd=None, log=None, env=None):
|
||||
argv = [str(s) for s in argv]
|
||||
print('+', ' '.join(shlex_quote(s) for s in argv), flush=True)
|
||||
if log:
|
||||
with Path(log).open('w', encoding='utf-8') as output:
|
||||
r = subprocess.run(argv, cwd=cwd, env=env, stdout=output, stderr=subprocess.STDOUT)
|
||||
if r.returncode:
|
||||
print('Command failed; last log lines:', file=sys.stderr)
|
||||
print('\n'.join(Path(log).read_text(errors='replace').splitlines()[-35:]), file=sys.stderr)
|
||||
raise SystemExit(r.returncode)
|
||||
else:
|
||||
subprocess.run(argv, cwd=cwd, env=env, check=True)
|
||||
|
||||
def shlex_quote(s):
|
||||
import shlex
|
||||
return shlex.quote(s)
|
||||
|
||||
def base_xml(provided, creator, key, cache, offline):
|
||||
if provided:
|
||||
p = Path(provided).expanduser().resolve()
|
||||
if not p.is_file(): raise SystemExit('Upstream XML not found: '+str(p))
|
||||
return p
|
||||
names = ['poi_types.xml'] if key == 'poi' else ['rendering_types.xml']
|
||||
if creator:
|
||||
for prefix in [creator, creator/'resources', creator/'config', creator/'poi', creator/'obf_creation']:
|
||||
for name in names:
|
||||
candidate = prefix/name
|
||||
if candidate.is_file(): return candidate.resolve()
|
||||
target = cache/names[0]
|
||||
if target.is_file(): return target
|
||||
if offline:
|
||||
raise SystemExit('Missing upstream '+names[0]+': pass --'+key+'-base FILE or allow download')
|
||||
target.parent.mkdir(parents=True,exist_ok=True)
|
||||
print('Fetching official OsmAnd '+names[0]+' (first run only) ...', flush=True)
|
||||
try:
|
||||
with urllib.request.urlopen(UPSTREAM[key], timeout=50) as u, target.open('wb') as out:
|
||||
shutil.copyfileobj(u,out)
|
||||
except Exception as ex:
|
||||
target.unlink(missing_ok=True)
|
||||
raise SystemExit('Cannot fetch official OsmAnd '+names[0]+': '+str(ex)+'\nProvide --'+key+'-base FILE manually.')
|
||||
return target
|
||||
|
||||
def catalog_rows(p):
|
||||
with Path(p).open('r',encoding='utf-8-sig',newline='') as f:
|
||||
rows=list(csv.DictReader(f))
|
||||
if not rows or not {'code','count','has_typ_icon'}.issubset(rows[0]):
|
||||
raise SystemExit('Invalid POI catalog (expected code,count,has_typ_icon): '+str(p))
|
||||
out=[]
|
||||
seen=set()
|
||||
for r in rows:
|
||||
code='0x'+format(int(r['code'],0),'x')
|
||||
if code in seen:raise SystemExit('Duplicate code in catalog: '+code)
|
||||
seen.add(code)
|
||||
out.append(dict(r,code=code,count=int(r['count'])))
|
||||
return sorted(out,key=lambda r:(-r['count'],int(r['code'],0)))
|
||||
|
||||
def write_xml(tree,path):
|
||||
ET.indent(tree,space=' ')
|
||||
tree.write(path,encoding='utf-8',xml_declaration=True)
|
||||
ET.parse(path)
|
||||
|
||||
def make_configs(poi_base,render_base,catalog,folder,threshold,frequent_zoom=15,rare_zoom=17):
|
||||
# Keep entire upstream definitions! Replacing with a standalone tiny XML is
|
||||
# precisely what used to make ordinary semantic POIs disappear.
|
||||
poi=ET.parse(poi_base); proot=poi.getroot()
|
||||
if proot.tag!='poi_types':raise SystemExit('Not an OsmAnd poi_types.xml: '+str(poi_base))
|
||||
if any(c.get('name')=='bgmountains_raw' for c in proot.findall('poi_category')):
|
||||
raise SystemExit('Input poi_types.xml already has a bgmountains_raw category')
|
||||
cat=ET.SubElement(proot,'poi_category',name='bgmountains_raw', default_tag='bgm_poi', no_edit='true')
|
||||
for r in catalog:
|
||||
code=r['code']
|
||||
ET.SubElement(cat,'poi_type',name='bgm_'+code.replace('0x',''),tag='bgm_poi',value='type_'+code,no_edit='true')
|
||||
pa=folder/'poi_types.bgmountains.xml'
|
||||
write_xml(poi,pa)
|
||||
|
||||
rendering=ET.parse(render_base); rroot=rendering.getroot()
|
||||
if rroot.tag != 'osmand_types':
|
||||
# OsmAnd resources use the tag 'rendering_types'; fail instead of dropping all built-in types.
|
||||
raise SystemExit('Unexpected OsmAnd rendering_types.xml root: '+rroot.tag)
|
||||
cats=[c for c in rroot.iter('category') if c.get('name')=='user_defined']
|
||||
target=cats[0] if cats else ET.SubElement(rroot,'category',name='user_defined')
|
||||
for r in catalog:
|
||||
code=r['code']
|
||||
ET.SubElement(target,'type',tag='bgm_poi',value='type_'+code,
|
||||
minzoom=str(frequent_zoom) if r['count']>=threshold else str(rare_zoom))
|
||||
rp=folder/'rendering_types.bgmountains.xml'
|
||||
write_xml(rendering,rp)
|
||||
summary={
|
||||
'catalog_types':len(catalog),
|
||||
'poi_count_in_catalog':sum(r.get('sample_count',r['count']) for r in catalog),
|
||||
'types_at_or_above_threshold':sum(r['count']>=threshold for r in catalog),
|
||||
'frequent_index_minzoom':frequent_zoom, 'rare_index_minzoom':rare_zoom,
|
||||
'items_at_or_above_threshold':sum(r.get('sample_count',r['count']) for r in catalog if r['count']>=threshold),
|
||||
'types_with_extracted_icon':sum(r['has_typ_icon']=='yes' for r in catalog),
|
||||
'poi_base_sha256':hashlib.sha256(Path(poi_base).read_bytes()).hexdigest(),
|
||||
'rendering_base_sha256':hashlib.sha256(Path(render_base).read_bytes()).hexdigest(),
|
||||
'note':'All Garmin hex POI types indexed; high-frequency raw types inserted into OBF map index from selected frequent zoom; low-frequency from selected rare zoom. Rendering exact Garmin icon PNGs requires installing compatible icons/style in OsmAnd, not merely compiling an OBF.'
|
||||
}
|
||||
(folder/'type-index-summary.json').write_text(json.dumps(summary,ensure_ascii=False,indent=2)+'\n',encoding='utf-8')
|
||||
return pa,rp,summary
|
||||
|
||||
def make_style(icon_csv, folder, catalog):
|
||||
"""Optional addon for otherwise unclassified types using preinstalled OsmAnd icons.
|
||||
|
||||
This cannot install Garmin bitmap icons and must be enabled in OsmAnd.
|
||||
"""
|
||||
known={r['code'] for r in catalog}
|
||||
with Path(icon_csv).open(encoding='utf-8-sig',newline='') as f:
|
||||
rows=list(csv.DictReader(f))
|
||||
visible=[]
|
||||
for r in rows:
|
||||
code='0x'+format(int(r['code'],0),'x')
|
||||
if code not in known:continue # bbox builds are smaller than national config
|
||||
if r['show_in_custom_style'].strip().lower() not in ('yes','true','1'):continue
|
||||
name=r['osmand_builtin_icon'].strip()
|
||||
if not name or not name.replace('_','').replace('-','').isalnum():
|
||||
raise SystemExit('Invalid OsmAnd icon in '+str(icon_csv)+' for '+code)
|
||||
zoom=int(r['minzoom'])
|
||||
if not 1<=zoom<=21:raise SystemExit('Invalid icon zoom for '+code)
|
||||
visible.append((code,name,zoom))
|
||||
root=ET.Element('renderingStyle',name='BGMountains custom POIs',depends='default',
|
||||
defaultColor='#fff8ee',version='1')
|
||||
order=ET.SubElement(root,'order')
|
||||
points=ET.SubElement(root,'point')
|
||||
for code,name,zoom in visible:
|
||||
ET.SubElement(order,'case',tag='bgm_poi',value='type_'+code,minzoom=str(zoom),
|
||||
point='true',objectType='1',order='128')
|
||||
ET.SubElement(points,'case',tag='bgm_poi',value='type_'+code,minzoom=str(zoom),
|
||||
icon=name,iconOrder='10',iconVisibleSize='12')
|
||||
path=folder/'BGMountains-custom.render.xml'
|
||||
write_xml(ET.ElementTree(root),path)
|
||||
return path,len(visible)
|
||||
|
||||
def obtain_creator(cache, offline=False):
|
||||
"""Opt-in download from official OsmAnd nightly build (large file)."""
|
||||
import zipfile
|
||||
link='https://download.osmand.net/latest-night-build/OsmAndMapCreator-main.zip'
|
||||
target=cache/'OsmAndMapCreator-main.zip'
|
||||
extracted=cache/'unpacked'
|
||||
found=list(extracted.rglob('utilities.sh')) if extracted.is_dir() else []
|
||||
if found:return found[0].parent
|
||||
if offline:raise SystemExit('Cannot download MapCreator with --offline; pass --creator')
|
||||
cache.mkdir(parents=True,exist_ok=True)
|
||||
if not target.is_file():
|
||||
print('Downloading official OsmAndMapCreator (~150 MB) ...',flush=True)
|
||||
try:
|
||||
with urllib.request.urlopen(link,timeout=180) as src,target.open('wb') as dest:
|
||||
shutil.copyfileobj(src,dest,length=2**20)
|
||||
except Exception as ex:
|
||||
target.unlink(missing_ok=True)
|
||||
raise SystemExit('Cannot download OsmAndMapCreator: '+str(ex)+'\nDownload manually: '+link)
|
||||
print('Extracting MapCreator...',flush=True)
|
||||
extracted.mkdir(parents=True,exist_ok=True)
|
||||
with zipfile.ZipFile(target) as z:
|
||||
for m in z.infolist():
|
||||
rel=Path(m.filename)
|
||||
if rel.is_absolute() or '..' in rel.parts:
|
||||
raise SystemExit('Unsafe file in MapCreator archive: '+m.filename)
|
||||
z.extract(m,extracted)
|
||||
found=list(extracted.rglob('utilities.sh'))
|
||||
if not found:raise SystemExit('MapCreator ZIP extracted but utilities.sh not found')
|
||||
for name in ('utilities.sh','inspector.sh'):
|
||||
for f in extracted.rglob(name):f.chmod(f.stat().st_mode|0o111)
|
||||
return found[0].parent
|
||||
|
||||
def resolve_creator(path):
|
||||
name = path or os.environ.get('OSMAND_MAPCREATOR')
|
||||
if not name:return None
|
||||
creator=Path(name).expanduser().resolve()
|
||||
if creator.is_file() and creator.name=='utilities.sh':creator=creator.parent
|
||||
if not (creator/'utilities.sh').is_file():
|
||||
raise SystemExit('Cannot find utilities.sh under '+str(creator))
|
||||
return creator
|
||||
|
||||
def main():
|
||||
p=argparse.ArgumentParser(description=__doc__,formatter_class=argparse.ArgumentDefaultsHelpFormatter)
|
||||
inp=p.add_mutually_exclusive_group(required=True)
|
||||
inp.add_argument('--img',help='Original Garmin IMG; converter is compiled and executed')
|
||||
inp.add_argument('--osm',help='Already converted OSM XML; must contain bgm_poi=type_0x... tags (v0.7+)')
|
||||
p.add_argument('--creator',help='OsmAndMapCreator directory containing utilities.sh (or OSMAND_MAPCREATOR env)')
|
||||
p.add_argument('--download-creator',action='store_true',help='Download official OsmAndMapCreator ZIP automatically (~150 MB) when no --creator is set')
|
||||
p.add_argument('--out',default='build/bgmountains-output',help='Output folder')
|
||||
p.add_argument('--jobs',type=int,default=1,help='C++ IMG reader threads (opt-in)')
|
||||
p.add_argument('--bbox',help='Optional W,S,E,N bounds for small-area test')
|
||||
p.add_argument('--threshold',type=int,default=100,help='Frequent-type occurrence threshold')
|
||||
p.add_argument('--frequent-zoom',type=int,default=15,help='Store frequent raw map icons at zoom N and above')
|
||||
p.add_argument('--rare-zoom',type=int,default=17,help='Store rare raw map icons at zoom N and above')
|
||||
p.add_argument('--icons-config',default=str(ROOT/'config/osmand-icons.csv'),help='OsmAnd built-in icon choices for custom addon style')
|
||||
p.add_argument('--poi-overrides',default=str(ROOT/'config/poi-overrides-all-types.csv'))
|
||||
p.add_argument('--poi-name-fixes',default=str(ROOT/'config/poi-name-fixes.csv'))
|
||||
p.add_argument('--poi-additions',default=str(ROOT/'config/poi-additions.csv'))
|
||||
p.add_argument('--poi-base',help='Official upstream poi_types.xml; if omitted use cache/download')
|
||||
p.add_argument('--rendering-base',help='Official upstream rendering_types.xml; if omitted use cache/download')
|
||||
p.add_argument('--offline',action='store_true',help='Never download upstream XML')
|
||||
p.add_argument('--prepare-only',action='store_true',help='Do not run OsmAndMapCreator, but generate OSM and XMLs')
|
||||
p.add_argument('--skip-qa',action='store_true',help='Skip OSM comparison for faster repeat runs')
|
||||
p.add_argument('--java-opts',default='-Xms512M -Xmx8192M',help='JAVA_OPTS for OsmAndMapCreator')
|
||||
p.add_argument('--skip-cpp-build',action='store_true')
|
||||
p.add_argument('--catalog',help='Preexisting POI catalog when supplying --osm (otherwise use packaged nationwide catalog)')
|
||||
p.add_argument('--frequency-catalog',default=str(ROOT/'data/BGMountains-unique-poi-types.csv'),help='Reference nationwide counts for map index zoom decisions even in --bbox builds')
|
||||
args=p.parse_args()
|
||||
if args.jobs<1 or args.jobs>64 or args.threshold<1 or not 1<=args.frequent_zoom<=21 or not 1<=args.rare_zoom<=21: p.error('--jobs 1..64; threshold >=1; zoom 1..21')
|
||||
dest=Path(args.out).expanduser().resolve();dest.mkdir(parents=True,exist_ok=True)
|
||||
creator=resolve_creator(args.creator)
|
||||
if not creator and args.download_creator and not args.prepare_only:
|
||||
creator=obtain_creator(ROOT/'build'/'mapcreator-download',args.offline)
|
||||
if not creator and not args.prepare_only:p.error('Supply --creator /path/to/OsmAndMapCreator (or OSMAND_MAPCREATOR env) or use --prepare-only')
|
||||
if args.img:
|
||||
if not Path(args.img).is_file():p.error('IMG file missing: '+args.img)
|
||||
binary=ROOT/'build'/'garmin2osm'
|
||||
if not args.skip_cpp_build or not binary.is_file():
|
||||
call(['cmake','-S',ROOT,'-B',ROOT/'build','-DCMAKE_BUILD_TYPE=Release'])
|
||||
call(['cmake','--build',ROOT/'build','--config','Release','-j','2'])
|
||||
osm=dest/'BGMountains.osm'
|
||||
cmd=[binary,'--input',Path(args.img).resolve(),'--output',osm,'--poi-overrides',Path(args.poi_overrides).resolve(),
|
||||
'--poi-name-fixes',Path(args.poi_name_fixes).resolve(),'--poi-additions',Path(args.poi_additions).resolve(),
|
||||
'--poi-manifest',dest/'source-pois.csv','--poi-types-out',dest/'poi-types.csv','--jobs',args.jobs]
|
||||
if args.bbox:cmd+=['--bbox',args.bbox]
|
||||
call(cmd,log=dest/'converter.log')
|
||||
catalog=dest/'poi-types.csv'
|
||||
if not args.skip_qa:
|
||||
call([sys.executable,ROOT/'tools/validate_pois.py','compare','--source',dest/'source-pois.csv','--osm',osm,
|
||||
'--rules',Path(args.poi_overrides).resolve(),'--report',dest/'validation.json','--mismatches',dest/'mismatches.csv'],
|
||||
log=dest/'validator.log')
|
||||
else:
|
||||
osm=Path(args.osm).expanduser().resolve()
|
||||
if not osm.is_file():p.error('OSM file missing: '+str(osm))
|
||||
catalog=Path(args.catalog).expanduser().resolve() if args.catalog else ROOT/'data'/'BGMountains-unique-poi-types.csv'
|
||||
rows=catalog_rows(catalog)
|
||||
nationwide={r['code']:r['count'] for r in catalog_rows(args.frequency_catalog)} if args.frequency_catalog else {}
|
||||
for row in rows:
|
||||
row['sample_count']=row['count']
|
||||
row['count']=nationwide.get(row['code'],row['count'])
|
||||
# A separately supplied legacy OSM might lack our new classifier.
|
||||
# For --img, the v0.7 converter above just generated it by construction.
|
||||
if args.osm:
|
||||
import gzip
|
||||
opener=gzip.open if osm.suffix=='.gz' else open
|
||||
with opener(osm,'rt',encoding='utf-8',errors='replace') as f:
|
||||
found=any('k="bgm_poi"' in line for line in f)
|
||||
if not found:
|
||||
raise SystemExit('Existing OSM lacks bgm_poi; re-extract with v0.7 C++ converter.')
|
||||
folder=dest/'osmand-config';folder.mkdir(exist_ok=True)
|
||||
poi_base=base_xml(args.poi_base,creator,'poi',dest/'upstream',args.offline)
|
||||
rendering_base=base_xml(args.rendering_base,creator,'rendering',dest/'upstream',args.offline)
|
||||
poi_cfg,render_cfg,summary=make_configs(poi_base,rendering_base,rows,folder,args.threshold,args.frequent_zoom,args.rare_zoom)
|
||||
style,nicons=make_style(args.icons_config,folder,rows)
|
||||
print('Indexed POI types:',summary['catalog_types'],'frequent:',summary['types_at_or_above_threshold'],'custom style icons:',nicons,flush=True)
|
||||
if args.prepare_only:
|
||||
print('PREPARED (no OBF generated). Files at:',dest)
|
||||
return 0
|
||||
before={str(i.resolve()) for i in dest.glob('*.obf')}
|
||||
# Save Java logs, and preserve OsmAndMapCreator temp data inside user-selected output dir.
|
||||
env=os.environ.copy();env['JAVA_OPTS']=args.java_opts
|
||||
program=creator/'utilities.sh'
|
||||
cmd=[str(program),'generate-obf-no-address',str(osm),
|
||||
'--poi-types='+str(poi_cfg),'--rendering-types='+str(render_cfg)]
|
||||
call(cmd,cwd=dest,log=dest/'mapcreator.log',env=env)
|
||||
after=[i for i in dest.glob('*.obf') if str(i.resolve()) not in before]
|
||||
if not after:
|
||||
# Creator sometimes writes next to the .osm source, even with cwd changed.
|
||||
alt=list(osm.parent.glob('*.obf'))
|
||||
after=[i for i in alt if i.is_file()]
|
||||
if not after:raise SystemExit('MapCreator returned success but no .obf was found; see '+str(dest/'mapcreator.log'))
|
||||
built=max(after,key=lambda p:p.stat().st_mtime)
|
||||
print('OBF created:',built,'bytes:',built.stat().st_size)
|
||||
if (creator/'inspector.sh').is_file():
|
||||
call([str(creator/'inspector.sh'),'-vpoi',str(built)],cwd=dest,log=dest/'obf-poi-index.txt',env=env)
|
||||
(dest/'build-manifest.json').write_text(json.dumps({
|
||||
'created_at_utc':dt.datetime.now(dt.timezone.utc).isoformat(),
|
||||
'obf':str(built),'obf_bytes':built.stat().st_size,
|
||||
'input_osm':str(osm),'poi_types':str(poi_cfg),'rendering_types':str(render_cfg),
|
||||
'custom_style':str(style), 'custom_style_icon_rules':nicons,
|
||||
'summary':summary
|
||||
},ensure_ascii=False,indent=2)+'\n',encoding='utf-8')
|
||||
return 0
|
||||
if __name__=='__main__':
|
||||
sys.exit(main())
|
||||
+13
-16
@@ -1,18 +1,15 @@
|
||||
#!/usr/bin/env bash
|
||||
# Compatibility shim. No manually supplied POI XML files are required anymore.
|
||||
# Preferred: python3 scripts/build_bgmountains.py --img gmapsupp.img --download-creator --out ./build/out
|
||||
set -euo pipefail
|
||||
# Usage: build_obf.sh /path/OsmAndMapCreator map.osm[.gz] [--poi-types full-poi_types.xml] [--rendering-types full-rendering_types.xml]
|
||||
if (( $# < 2 )); then echo "Usage: $0 CREATOR_DIR MAP.osm[.gz] [--poi-types FILE] [--rendering-types FILE]" >&2;exit 2;fi
|
||||
creator="$1"; input="$2";shift 2
|
||||
[[ -f "$creator/utilities.sh" && -f "$input" ]] || { echo 'Missing OsmAnd utilities.sh or map input' >&2;exit 1; }
|
||||
args=(generate-obf-no-address "$input")
|
||||
while (( $# > 0 )); do
|
||||
case "$1" in
|
||||
--poi-types|--rendering-types)
|
||||
(( $# >= 2 )) || { echo "Missing file after $1" >&2;exit 2; }
|
||||
[[ -f "$2" ]] || { echo "Config not found: $2" >&2;exit 2; }
|
||||
args+=("$1=$2");shift 2;;
|
||||
*) echo "Unknown option: $1" >&2;exit 2;;
|
||||
esac
|
||||
done
|
||||
export JAVA_OPTS="${JAVA_OPTS:--Xms256M -Xmx4096M}"
|
||||
"$creator/utilities.sh" "${args[@]}"
|
||||
if (( $# < 2 )); then
|
||||
echo "Usage: $0 CREATOR_DIR INPUT_v0.7.osm[.gz] [OUTPUT_DIR]" >&2
|
||||
echo "Recommended instead: python3 scripts/build_bgmountains.py --img gmapsupp.img --download-creator --out ./build/out" >&2
|
||||
exit 2
|
||||
fi
|
||||
creator="$1"; osm="$2"; out="${3:-$(dirname "$osm")/rebuilt-obf}"
|
||||
root="$(cd "$(dirname "$0")/.." && pwd)"
|
||||
source_dir="$(dirname "$osm")"
|
||||
args=(--osm "$osm" --creator "$creator" --out "$out")
|
||||
if [[ -f "$source_dir/poi-types.csv" ]]; then args+=(--catalog "$source_dir/poi-types.csv"); fi
|
||||
exec python3 "$root/scripts/build_bgmountains.py" "${args[@]}"
|
||||
|
||||
+7
-2
@@ -238,13 +238,18 @@ std::string resolveNameFix(const std::string&map,int type,double lat,double lon,
|
||||
|
||||
std::optional<Tags> configuredPoi(int type,const std::string&name){
|
||||
Tags result=poiTags(type,name);
|
||||
auto hit=overrides.find(type);if(hit==overrides.end())return result;
|
||||
for(const auto&rule:hit->second){if(!rule.nameContains.empty()&&name.find(rule.nameContains)==std::string::npos)continue;
|
||||
auto hit=overrides.find(type);
|
||||
if(hit!=overrides.end())for(const auto&rule:hit->second){
|
||||
if(!rule.nameContains.empty()&&name.find(rule.nameContains)==std::string::npos)continue;
|
||||
if(rule.mode=="drop")return std::nullopt;
|
||||
if(rule.mode=="replace"||rule.mode=="keep_raw"){
|
||||
result.erase(std::remove_if(result.begin(),result.end(),[](const auto&kv){return kv.first!="garmin:type"&&kv.first!="garmin:feature"&&kv.first!="name";}),result.end());}
|
||||
for(const auto&[k,v]:rule.tags){result.erase(std::remove_if(result.begin(),result.end(),[&](const auto&kv){return kv.first==k;}),result.end());if(!v.empty())result.emplace_back(k,v);}
|
||||
}
|
||||
// BGM-specific stable classifier: register in custom OsmAnd POI and map indexes.
|
||||
// Never disguise unknown objects as a fake OSM tourism/amenity category.
|
||||
result.erase(std::remove_if(result.begin(),result.end(),[](const auto&kv){return kv.first=="bgm_poi";}),result.end());
|
||||
tag(result,"bgm_poi","type_"+code(type));
|
||||
return result;
|
||||
}
|
||||
struct Sample{std::string map,name;double lat=0,lon=0;};
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Offline contract tests: upstream XML augmentation and frequent/rare type retention."""
|
||||
import importlib.util
|
||||
from pathlib import Path
|
||||
import tempfile
|
||||
import unittest
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
S=Path(__file__).resolve().parents[1]/'scripts'/'build_bgmountains.py'
|
||||
spec=importlib.util.spec_from_file_location('build_bgmountains',S)
|
||||
mod=importlib.util.module_from_spec(spec);spec.loader.exec_module(mod)
|
||||
|
||||
class XmlPipelineTests(unittest.TestCase):
|
||||
def test_full_default_preserved_and_all_codes_indexed(self):
|
||||
with tempfile.TemporaryDirectory() as td:
|
||||
td=Path(td)
|
||||
pb=td/'upstream-poi.xml';rb=td/'upstream-render.xml'
|
||||
pb.write_text('<poi_types><poi_category name="food"><poi_type name="restaurant" tag="amenity" value="restaurant"/></poi_category></poi_types>')
|
||||
rb.write_text('<osmand_types><category name="roads"><type tag="highway" value="path" minzoom="11"/></category><category name="user_defined"/></osmand_types>')
|
||||
cc=[dict(code='0x6414',count=32922,has_typ_icon='yes'),dict(code='0x123',count=1,has_typ_icon='no')]
|
||||
a,b,s=mod.make_configs(pb,rb,cc,td,100)
|
||||
p=ET.parse(a).getroot();r=ET.parse(b).getroot()
|
||||
self.assertIsNotNone(p.find(".//poi_type[@name='restaurant']"))
|
||||
self.assertEqual(len(p.findall(".//poi_category[@name='bgmountains_raw']/poi_type")),2)
|
||||
self.assertIsNotNone(r.find(".//type[@tag='highway']"))
|
||||
self.assertEqual(r.find(".//type[@value='type_0x6414']").get('minzoom'),'15')
|
||||
self.assertEqual(r.find(".//type[@value='type_0x123']").get('minzoom'),'17')
|
||||
self.assertEqual(s['types_at_or_above_threshold'],1)
|
||||
def test_real_catalog(self):
|
||||
d=mod.catalog_rows(S.parents[1]/'data'/'BGMountains-unique-poi-types.csv')
|
||||
self.assertEqual(len(d),263)
|
||||
self.assertEqual(sum(x['count'] for x in d),410563)
|
||||
self.assertEqual(sum(x['count']>=100 for x in d),87)
|
||||
|
||||
if __name__=='__main__':unittest.main()
|
||||
Reference in New Issue
Block a user