From 64605b38bb926f2bb57f122b248b0b3e748d9c9d Mon Sep 17 00:00:00 2001 From: Matt Date: Tue, 21 Apr 2026 00:52:04 +0000 Subject: [PATCH] Add TomTom traffic proxy and update profiles for hillshade/traffic layers - Add /api/traffic/flow proxy route to hide TomTom API key from frontend - Add tileset_hillshade and traffic config blocks to all three profiles - Flip has_hillshade and has_traffic_overlay flags in home and regional profiles - Minimal profile has config blocks but flags remain false (dormant) Co-Authored-By: Claude Opus 4.6 --- config/profiles/home.yaml | 13 +++++++++++-- config/profiles/minimal_pi.yaml | 9 +++++++++ config/profiles/regional_pi.yaml | 11 ++++++++++- lib/api.py | 22 +++++++++++++++++++++- 4 files changed, 51 insertions(+), 4 deletions(-) diff --git a/config/profiles/home.yaml b/config/profiles/home.yaml index e4eb3de..49dc373 100644 --- a/config/profiles/home.yaml +++ b/config/profiles/home.yaml @@ -11,6 +11,15 @@ tileset: max_zoom: 15 attribution: "Protomaps © OSM" +tileset_hillshade: + url: "/tiles/hillshade-na.pmtiles" + encoding: "terrarium" + max_zoom: 12 + +traffic: + provider: "tomtom" + proxy_url: "/api/traffic/flow/{z}/{x}/{y}.png" + services: geocode: "/api/geocode" reverse: "/api/reverse" @@ -20,9 +29,9 @@ services: features: has_nominatim_details: false has_kiwix_wiki: false - has_hillshade: false + has_hillshade: true has_3d_terrain: false - has_traffic_overlay: false + has_traffic_overlay: true has_landclass: false has_address_book_write: false diff --git a/config/profiles/minimal_pi.yaml b/config/profiles/minimal_pi.yaml index 5e26b59..e4fe651 100644 --- a/config/profiles/minimal_pi.yaml +++ b/config/profiles/minimal_pi.yaml @@ -11,6 +11,15 @@ tileset: max_zoom: 15 attribution: "Protomaps © OSM" +tileset_hillshade: + url: "/tiles/hillshade-idaho.pmtiles" + encoding: "terrarium" + max_zoom: 12 + +traffic: + provider: "tomtom" + proxy_url: "/api/traffic/flow/{z}/{x}/{y}.png" + services: geocode: "/api/geocode" reverse: "/api/reverse" diff --git a/config/profiles/regional_pi.yaml b/config/profiles/regional_pi.yaml index e2b469c..89d56f3 100644 --- a/config/profiles/regional_pi.yaml +++ b/config/profiles/regional_pi.yaml @@ -11,6 +11,15 @@ tileset: max_zoom: 15 attribution: "Protomaps © OSM" +tileset_hillshade: + url: "/tiles/hillshade-regional.pmtiles" + encoding: "terrarium" + max_zoom: 12 + +traffic: + provider: "tomtom" + proxy_url: "/api/traffic/flow/{z}/{x}/{y}.png" + services: geocode: "/api/geocode" reverse: "/api/reverse" @@ -22,7 +31,7 @@ features: has_kiwix_wiki: false has_hillshade: true has_3d_terrain: false - has_traffic_overlay: false + has_traffic_overlay: true has_landclass: true has_address_book_write: true diff --git a/lib/api.py b/lib/api.py index 297a680..5a72889 100644 --- a/lib/api.py +++ b/lib/api.py @@ -17,7 +17,7 @@ import shutil import tempfile import requests as http_requests -from flask import Flask, request, jsonify, redirect, render_template +from flask import Flask, request, jsonify, redirect, render_template, make_response from qdrant_client import QdrantClient from qdrant_client.models import Filter, FieldCondition, MatchValue from werkzeug.utils import secure_filename @@ -1166,6 +1166,26 @@ def api_knowledge_stats(): return jsonify(_cache['knowledge_stats']) + +@app.route('/api/traffic/flow///.png') +def api_traffic_flow(z, x, y): + """Proxy TomTom traffic flow tiles to hide API key from frontend.""" + key = os.environ.get('TOMTOM_API_KEY') + if not key: + return 'Traffic service not configured', 503 + url = f'https://api.tomtom.com/traffic/map/4/tile/flow/relative/{z}/{x}/{y}.png?key={key}' + try: + resp = http_requests.get(url, timeout=10) + if resp.status_code != 200: + return 'Upstream error', 502 + r = make_response(resp.content) + r.headers['Content-Type'] = 'image/png' + r.headers['Cache-Control'] = 'public, max-age=120' + return r + except Exception: + return 'Upstream timeout', 504 + + @app.route('/api/config') def api_config(): """Return deployment profile config for frontend consumption."""