packaging
This commit is contained in:
1111
packaging/route_packager.py
Normal file
1111
packaging/route_packager.py
Normal file
File diff suppressed because it is too large
Load Diff
114
packaging/route_packager_README.md
Normal file
114
packaging/route_packager_README.md
Normal file
@@ -0,0 +1,114 @@
|
|||||||
|
# Route Packager — OsmAnd + Google KMZ
|
||||||
|
|
||||||
|
This package contains `route_packager.py`, a Python CLI for the scraped route archive tree in `v4-scrape-675.tar.gz`.
|
||||||
|
|
||||||
|
## What it does
|
||||||
|
|
||||||
|
- Scans the canonical `downloads_by_hash/` folder by default, avoiding retry/failure duplicate folders.
|
||||||
|
- Extracts ZIP, RAR, 7Z payloads.
|
||||||
|
- Imports GPX, KML, KMZ routes directly.
|
||||||
|
- Converts Garmin GDB to GPX when `gpsbabel` is installed.
|
||||||
|
- Carries over scrape metadata from `*.source.json` into route descriptions and reports.
|
||||||
|
- Carries over small text files into route descriptions.
|
||||||
|
- Embeds image files into the KMZ and OSF package under `media/...` and references them from descriptions.
|
||||||
|
- Writes machine-readable `report.json` and `routes.csv` for validation/pre-push review.
|
||||||
|
|
||||||
|
## Outputs
|
||||||
|
|
||||||
|
Default command creates all of these:
|
||||||
|
|
||||||
|
- `<name>.osmand-tracks.osf` — OsmAnd package/zip containing normalized GPX tracks.
|
||||||
|
- `<name>.all-routes.gpx` — fallback aggregate GPX for OsmAnd if the OSF package import is not accepted by a particular build.
|
||||||
|
- `<name>.google-earth-maps.kmz` — binary zipped KML package for Google My Maps / Google Earth.
|
||||||
|
- `<name>.google-earth-maps.kml` — plain KML fallback.
|
||||||
|
- `<name>.report.json` — full import/skip/warning report.
|
||||||
|
- `<name>.routes.csv` — route list with source archive, point count, distance, bbox, etc.
|
||||||
|
|
||||||
|
## Install extraction/conversion tools
|
||||||
|
|
||||||
|
The script itself is stdlib-only for ZIP/KML/KMZ/GPX. RAR and GDB need external tools:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo apt update
|
||||||
|
sudo apt install p7zip-full unrar-free gpsbabel
|
||||||
|
```
|
||||||
|
|
||||||
|
If `unrar-free` fails on some RAR versions, install one of `unrar`, `unar`, or `bsdtar` depending on your distro.
|
||||||
|
|
||||||
|
## Full run
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python3 route_packager.py \
|
||||||
|
--input ./v4-scrape-675.tar.gz \
|
||||||
|
--out ./route-out \
|
||||||
|
--target both \
|
||||||
|
--name bg-mountain-routes \
|
||||||
|
--verbose
|
||||||
|
```
|
||||||
|
|
||||||
|
## Google My Maps one-file safe mode
|
||||||
|
|
||||||
|
Google My Maps has a small uncompressed KML/KMZ import ceiling. For a single importable KMZ, use safe mode. It simplifies only the Google output; OsmAnd keeps full GPX detail.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python3 route_packager.py \
|
||||||
|
--input ./v4-scrape-675.tar.gz \
|
||||||
|
--out ./route-out-google-safe \
|
||||||
|
--target google \
|
||||||
|
--name bg-mountain-routes \
|
||||||
|
--google-my-maps-safe
|
||||||
|
```
|
||||||
|
|
||||||
|
Manual geometry cap if needed:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python3 route_packager.py --input ./v4-scrape-675.tar.gz --out ./out --target google \
|
||||||
|
--google-max-points-per-route 500 --google-lean-descriptions
|
||||||
|
```
|
||||||
|
|
||||||
|
## ZIP-only validation without RAR tooling
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python3 route_packager.py \
|
||||||
|
--input ./v4-scrape-675.tar.gz \
|
||||||
|
--out ./route-out-zip-only \
|
||||||
|
--target both \
|
||||||
|
--skip-rar \
|
||||||
|
--name bg-mountain-routes-zip-only
|
||||||
|
```
|
||||||
|
|
||||||
|
## Strict CI/pre-push mode
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python3 route_packager.py \
|
||||||
|
--input ./v4-scrape-675.tar.gz \
|
||||||
|
--out ./route-out \
|
||||||
|
--target both \
|
||||||
|
--name bg-mountain-routes \
|
||||||
|
--strict
|
||||||
|
```
|
||||||
|
|
||||||
|
`--strict` exits non-zero if RARs/GDBs fail to import.
|
||||||
|
|
||||||
|
## Validation commands
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python3 -m py_compile route_packager.py
|
||||||
|
python3 route_packager.py --input ./v4-scrape-675.tar.gz --out ./out --target both --skip-rar --name smoke
|
||||||
|
python3 - <<'PY'
|
||||||
|
from pathlib import Path
|
||||||
|
import zipfile, xml.etree.ElementTree as ET
|
||||||
|
out = Path('./out')
|
||||||
|
for name in ['smoke.osmand-tracks.osf', 'smoke.google-earth-maps.kmz']:
|
||||||
|
with zipfile.ZipFile(out / name) as z:
|
||||||
|
assert z.testzip() is None, name
|
||||||
|
ET.parse(out / 'smoke.all-routes.gpx')
|
||||||
|
with zipfile.ZipFile(out / 'smoke.google-earth-maps.kmz') as z:
|
||||||
|
ET.fromstring(z.read('doc.kml'))
|
||||||
|
print('OK')
|
||||||
|
PY
|
||||||
|
```
|
||||||
|
|
||||||
|
## Format note
|
||||||
|
|
||||||
|
There is no arbitrary custom binary route format for Google Maps imports. KMZ is the practical binary container because it is zipped KML and can include images/media. For OsmAnd, the script emits an OSF-style package plus a GPX fallback because GPX is OsmAnd's most predictable track import path.
|
||||||
9
packaging/start.sh
Normal file
9
packaging/start.sh
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
# sudo apt update
|
||||||
|
# sudo apt install p7zip-full unrar-free gpsbabel
|
||||||
|
|
||||||
|
python3 route_packager.py \
|
||||||
|
--input ./v4-scrape-675.tar.gz \
|
||||||
|
--out ./route-out \
|
||||||
|
--target both \
|
||||||
|
--name bg-mountain-routes \
|
||||||
|
--verbose
|
||||||
BIN
packaging/v4-scrape-675.tar.gz
Normal file
BIN
packaging/v4-scrape-675.tar.gz
Normal file
Binary file not shown.
Reference in New Issue
Block a user