maps/backend/scripts/06_build_offline_packages.sh
2026-03-30 10:27:36 +02:00

72 lines
2.8 KiB
Bash
Executable file

#!/bin/bash
# scripts/06_build_offline_packages.sh
PG_CONN="postgresql://maps:maps@postgres:5432/maps"
PACKAGES_DIR="/data/offline_packages"
REGION_ID="amsterdam"
BBOX="4.7288,52.2783,5.0796,52.4311" # minLon,minLat,maxLon,maxLat
mkdir -p "${PACKAGES_DIR}/${REGION_ID}"
# --- Tiles: extract MBTiles for the bounding box ---
# Use martin-cp (Martin's CLI tool) to export tiles from PostGIS to MBTiles
martin-cp \
--output-file "${PACKAGES_DIR}/${REGION_ID}/tiles.mbtiles" \
--mbtiles-type flat \
--bbox "$BBOX" \
--min-zoom 0 \
--max-zoom 16 \
--source openmaptiles \
--connect "$PG_CONN"
# --- POIs: export to SQLite with FTS5 index ---
# Custom Rust tool or Python script that queries PostGIS and writes SQLite
/app/tools/export_pois_sqlite \
--bbox "$BBOX" \
--pg-conn "$PG_CONN" \
--output "${PACKAGES_DIR}/${REGION_ID}/pois.db"
# --- Routing: tar the OSRM files per profile ---
for PROFILE in car foot bicycle; do
tar -cf "${PACKAGES_DIR}/${REGION_ID}/routing-${PROFILE}.tar" \
-C "/data/osrm/${PROFILE}" \
region.osrm region.osrm.cell_metrics region.osrm.cells \
region.osrm.datasource_names region.osrm.ebg region.osrm.ebg_nodes \
region.osrm.edges region.osrm.fileIndex region.osrm.geometry \
region.osrm.icd region.osrm.maneuver_overrides \
region.osrm.mldgr region.osrm.names region.osrm.nbg_nodes \
region.osrm.partition region.osrm.properties \
region.osrm.ramIndex region.osrm.timestamp \
region.osrm.tld region.osrm.tls region.osrm.turn_duration_penalties \
region.osrm.turn_penalties_index region.osrm.turn_weight_penalties
done
# --- Update offline_regions table with file sizes ---
TILES_SIZE=$(stat -f%z "${PACKAGES_DIR}/${REGION_ID}/tiles.mbtiles" 2>/dev/null || stat -c%s "${PACKAGES_DIR}/${REGION_ID}/tiles.mbtiles")
ROUTING_SIZE=0
for PROFILE in car foot bicycle; do
SIZE=$(stat -f%z "${PACKAGES_DIR}/${REGION_ID}/routing-${PROFILE}.tar" 2>/dev/null || stat -c%s "${PACKAGES_DIR}/${REGION_ID}/routing-${PROFILE}.tar")
ROUTING_SIZE=$((ROUTING_SIZE + SIZE))
done
POIS_SIZE=$(stat -f%z "${PACKAGES_DIR}/${REGION_ID}/pois.db" 2>/dev/null || stat -c%s "${PACKAGES_DIR}/${REGION_ID}/pois.db")
psql "$PG_CONN" <<SQL
INSERT INTO offline_regions (id, name, description, bbox, tiles_size_bytes, routing_size_bytes, pois_size_bytes, last_updated)
VALUES (
'${REGION_ID}',
'Amsterdam',
'Amsterdam metropolitan area',
ST_MakeEnvelope(4.7288, 52.2783, 5.0796, 52.4311, 4326),
${TILES_SIZE},
${ROUTING_SIZE},
${POIS_SIZE},
NOW()
)
ON CONFLICT (id) DO UPDATE SET
tiles_size_bytes = EXCLUDED.tiles_size_bytes,
routing_size_bytes = EXCLUDED.routing_size_bytes,
pois_size_bytes = EXCLUDED.pois_size_bytes,
last_updated = EXCLUDED.last_updated;
SQL
echo "Offline package for ${REGION_ID} built."