diff --git a/src/data_collection/city_registry.py b/src/data_collection/city_registry.py index 8d86c9a0..ef145514 100644 --- a/src/data_collection/city_registry.py +++ b/src/data_collection/city_registry.py @@ -9,6 +9,7 @@ CITY_REGISTRY = { "icao": "LTAC", "tz_offset": 10800, "use_fahrenheit": False, + "is_major": False, "risk_level": "medium", "risk_emoji": "🟑", "airport_name": "Esenboğa 机场", @@ -22,6 +23,7 @@ CITY_REGISTRY = { "icao": "EGLC", "tz_offset": 0, "use_fahrenheit": False, + "is_major": True, "risk_level": "low", "risk_emoji": "🟒", "airport_name": "London City 机场", @@ -35,6 +37,7 @@ CITY_REGISTRY = { "icao": "LFPG", "tz_offset": 3600, "use_fahrenheit": False, + "is_major": True, "risk_level": "medium", "risk_emoji": "🟑", "airport_name": "Charles de Gaulle 机场", @@ -48,6 +51,7 @@ CITY_REGISTRY = { "icao": "RKSI", "tz_offset": 32400, "use_fahrenheit": False, + "is_major": True, "risk_level": "high", "risk_emoji": "πŸ”΄", "airport_name": "δ»ε·ε›½ι™…ζœΊεœΊ", @@ -61,6 +65,7 @@ CITY_REGISTRY = { "icao": "CYYZ", "tz_offset": -18000, "use_fahrenheit": False, + "is_major": True, "risk_level": "low", "risk_emoji": "🟒", "airport_name": "Pearson ε›½ι™…ζœΊεœΊ", @@ -74,6 +79,7 @@ CITY_REGISTRY = { "icao": "SAEZ", "tz_offset": -10800, "use_fahrenheit": False, + "is_major": True, "risk_level": "medium", "risk_emoji": "🟑", "airport_name": "Ezeiza ε›½ι™…ζœΊεœΊ", @@ -87,6 +93,7 @@ CITY_REGISTRY = { "icao": "NZWN", "tz_offset": 46800, "use_fahrenheit": False, + "is_major": False, "risk_level": "low", "risk_emoji": "🟒", "airport_name": "ζƒ η΅ι‘Ώε›½ι™…ζœΊεœΊ", @@ -100,6 +107,7 @@ CITY_REGISTRY = { "icao": "KLGA", "tz_offset": -18000, "use_fahrenheit": True, + "is_major": True, "risk_level": "low", "risk_emoji": "🟒", "airport_name": "LaGuardia 机场", @@ -113,6 +121,7 @@ CITY_REGISTRY = { "icao": "KORD", "tz_offset": -21600, "use_fahrenheit": True, + "is_major": False, "risk_level": "high", "risk_emoji": "πŸ”΄", "airport_name": "O'Hare ε›½ι™…ζœΊεœΊ", @@ -126,6 +135,7 @@ CITY_REGISTRY = { "icao": "KDAL", "tz_offset": -21600, "use_fahrenheit": True, + "is_major": False, "risk_level": "medium", "risk_emoji": "🟑", "airport_name": "Dallas Love Field 机场", @@ -139,6 +149,7 @@ CITY_REGISTRY = { "icao": "KMIA", "tz_offset": -18000, "use_fahrenheit": True, + "is_major": False, "risk_level": "low", "risk_emoji": "🟒", "airport_name": "Miami ε›½ι™…ζœΊεœΊ", @@ -152,6 +163,7 @@ CITY_REGISTRY = { "icao": "KATL", "tz_offset": -18000, "use_fahrenheit": True, + "is_major": False, "risk_level": "low", "risk_emoji": "🟒", "airport_name": "Hartsfield-Jackson 机场", @@ -165,6 +177,7 @@ CITY_REGISTRY = { "icao": "KSEA", "tz_offset": -28800, "use_fahrenheit": True, + "is_major": False, "risk_level": "low", "risk_emoji": "🟒", "airport_name": "Sea-Tac ε›½ι™…ζœΊεœΊ", @@ -178,6 +191,7 @@ CITY_REGISTRY = { "icao": "VILK", "tz_offset": 19800, "use_fahrenheit": False, + "is_major": False, "risk_level": "medium", "risk_emoji": "🟑", "airport_name": "Chaudhary Charan Singh ε›½ι™…ζœΊεœΊ", @@ -191,6 +205,7 @@ CITY_REGISTRY = { "icao": "SBGR", "tz_offset": -10800, "use_fahrenheit": False, + "is_major": True, "risk_level": "high", "risk_emoji": "πŸ”΄", "airport_name": "SΓ£o Paulo/Guarulhos 机场", @@ -204,6 +219,7 @@ CITY_REGISTRY = { "icao": "EDDM", "tz_offset": 3600, "use_fahrenheit": False, + "is_major": False, "risk_level": "high", "risk_emoji": "πŸ”΄", "airport_name": "Munich 机场", diff --git a/web/app.py b/web/app.py index 1a66da78..3509952c 100644 --- a/web/app.py +++ b/web/app.py @@ -548,6 +548,7 @@ async def list_cities(): "airport": risk.get("airport_name", ""), "icao": risk.get("icao", ""), "temp_unit": "fahrenheit" if info["f"] else "celsius", + "is_major": CITY_REGISTRY.get(name, {}).get("is_major", True), } ) return {"cities": out} diff --git a/web/static/app.js b/web/static/app.js index 3d6b137a..97c28cc3 100644 --- a/web/static/app.js +++ b/web/static/app.js @@ -71,6 +71,33 @@ function initMap() { map.on("click", () => { closePanel(); }); + + // Handle zoom-based visibility for local stations and minor cities + map.on("zoomend", updateMapVisibility); +} + +function updateMapVisibility() { + if (!map) return; + const zoom = map.getZoom(); + + // 1. Handle Nearby Individual Stations (very high zoom only) + // These are the "Ankara-style" local station markers + if (zoom < 7) { + if (map.hasLayer(nearbyLayerGroup)) map.removeLayer(nearbyLayerGroup); + } else { + if (!map.hasLayer(nearbyLayerGroup)) map.addLayer(nearbyLayerGroup); + } + + // 2. Handle Primary City Markers (Major vs Minor) + Object.values(markers).forEach(({ marker, city }) => { + const isMajor = city.is_major !== false; + // Hide minor cities (like Ankara/Atlanta) when zoomed way out + if (zoom < 4 && !isMajor) { + if (map.hasLayer(marker)) map.removeLayer(marker); + } else { + if (!map.hasLayer(marker)) map.addLayer(marker); + } + }); } // ────────────────────────────────────────────────────────── @@ -109,6 +136,7 @@ function addCityMarkers(cities) { }); document.getElementById("cityCount").textContent = cities.length; + updateMapVisibility(); } function updateMarkerTemp(cityName, temp) {