From bf4be0436bd97e02c506c9e0bf27623f87159a32 Mon Sep 17 00:00:00 2001 From: "2569718930@qq.com" <2569718930@qq.com> Date: Mon, 25 May 2026 06:10:54 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=20lau=20fau=20shan=20?= =?UTF-8?q?=E2=86=92=20shenzhen=20=E5=85=A8=E9=87=8F=E9=87=8D=E5=91=BD?= =?UTF-8?q?=E5=90=8D=EF=BC=8C=E5=89=8D=E7=AB=AF=E5=BA=93=E5=92=8C=E6=96=87?= =?UTF-8?q?=E6=A1=A3=E5=90=8C=E6=AD=A5=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../scan-terminal/continent-grouping.ts | 1 - frontend/hooks/useLeafletMap.ts | 2 +- frontend/lib/dashboard-home-copy.ts | 6 ++-- frontend/lib/dashboard-official-sources.ts | 6 ++-- frontend/lib/observation-source-utils.ts | 2 +- frontend/lib/scan-market-focus.ts | 2 +- src/bot/runtime_coordinator.py | 2 +- src/data_collection/city_registry.py | 32 ++++--------------- src/data_collection/city_time.py | 3 +- src/data_collection/country_networks.py | 1 - src/data_collection/hko_obs_sources.py | 6 ++-- src/data_collection/polymarket_readonly.py | 3 -- src/data_collection/weather_sources.py | 13 +++----- web/analysis_service.py | 2 +- web/scan_terminal_service.py | 6 ++-- 15 files changed, 30 insertions(+), 57 deletions(-) diff --git a/frontend/components/dashboard/scan-terminal/continent-grouping.ts b/frontend/components/dashboard/scan-terminal/continent-grouping.ts index 344ad803..86b282f0 100644 --- a/frontend/components/dashboard/scan-terminal/continent-grouping.ts +++ b/frontend/components/dashboard/scan-terminal/continent-grouping.ts @@ -21,7 +21,6 @@ const CITY_REGION_FALLBACK: Record = { chongqing: "east_asia", guangzhou: "east_asia", "hong kong": "east_asia", - "lau fau shan": "east_asia", qingdao: "east_asia", seoul: "east_asia", shanghai: "east_asia", diff --git a/frontend/hooks/useLeafletMap.ts b/frontend/hooks/useLeafletMap.ts index 6be6c823..4dab8899 100644 --- a/frontend/hooks/useLeafletMap.ts +++ b/frontend/hooks/useLeafletMap.ts @@ -48,7 +48,7 @@ const CITY_MARKER_DISPLAY_OFFSETS: Record< // Shek Kong sits between the Hong Kong and Shenzhen cards and gets visually buried // by their wide marker bubbles. Shift only the rendered marker, not the true point. "shek kong": { x: 34, y: -26, zIndexOffset: 320 }, - "lau fau shan": { x: -40, y: 14, zIndexOffset: 300 }, + "shenzhen": { x: -40, y: 14, zIndexOffset: 300 }, }; function getMarkerDisplayOffset(cityName: string) { diff --git a/frontend/lib/dashboard-home-copy.ts b/frontend/lib/dashboard-home-copy.ts index 1f11bdd4..324dac25 100644 --- a/frontend/lib/dashboard-home-copy.ts +++ b/frontend/lib/dashboard-home-copy.ts @@ -26,7 +26,7 @@ const CITY_NAME_ZH: Record = { Jakarta: "雅加达", Jeddah: "吉达", Karachi: "卡拉奇", - "Lau Fau Shan": "流浮山", + "shenzhen": "深圳流浮山", London: "伦敦", Lucknow: "勒克瑙", Madrid: "马德里", @@ -77,7 +77,7 @@ const AIRPORT_NAME_ZH: Record = { Jakarta: "苏加诺-哈达国际机场", Jeddah: "阿卜杜勒-阿齐兹国王国际机场", Karachi: "真纳国际机场", - "Lau Fau Shan": "流浮山监测站", + "shenzhen": "深圳流浮山监测站", London: "希思罗机场", Lucknow: "乔杜里·查兰·辛格国际机场", Madrid: "马德里-巴拉哈斯机场", @@ -107,7 +107,7 @@ const AIRPORT_NAME_ZH: Record = { const AIRPORT_NAME_EN: Record = { "Hong Kong": "Hong Kong Observatory HQ", - "Lau Fau Shan": "Lau Fau Shan Monitoring Station", + "shenzhen": "shenzhen Monitoring Station", }; function normalizeCityKey(value: string | null | undefined) { diff --git a/frontend/lib/dashboard-official-sources.ts b/frontend/lib/dashboard-official-sources.ts index 646b9e4b..7b7a67e6 100644 --- a/frontend/lib/dashboard-official-sources.ts +++ b/frontend/lib/dashboard-official-sources.ts @@ -76,19 +76,19 @@ const CITY_SPECIFIC_SOURCES: Record = { kind: "metar", }, { - label: "流浮山站(HKO)", + label: "深圳流浮山站(HKO)", href: "https://www.hko.gov.hk/sc/wxinfo/ts/index.htm", kind: "agency", }, ], - "lau fau shan": [ + "shenzhen": [ { label: "香港天文台", href: "https://www.hko.gov.hk/en/index.html", kind: "agency", }, { - label: "流浮山站(HKO)", + label: "深圳流浮山站(HKO)", href: "https://www.hko.gov.hk/sc/wxinfo/ts/index.htm", kind: "airport", }, diff --git a/frontend/lib/observation-source-utils.ts b/frontend/lib/observation-source-utils.ts index 99b02c36..27330bdf 100644 --- a/frontend/lib/observation-source-utils.ts +++ b/frontend/lib/observation-source-utils.ts @@ -20,7 +20,7 @@ export function getObservationSourceCode(detail: CityDetail): string { if ( city === "hong kong" || city === "shek kong" || - city === "lau fau shan" + city === "shenzhen" ) { return "hko"; } diff --git a/frontend/lib/scan-market-focus.ts b/frontend/lib/scan-market-focus.ts index 6ce1e08d..9aa4fd3f 100644 --- a/frontend/lib/scan-market-focus.ts +++ b/frontend/lib/scan-market-focus.ts @@ -89,7 +89,7 @@ const CITY_REGION_FALLBACK: Record = { seoul: "asia_pacific", busan: "asia_pacific", "hong kong": "asia_pacific", - "lau fau shan": "asia_pacific", + "shenzhen": "asia_pacific", taipei: "asia_pacific", shanghai: "asia_pacific", singapore: "asia_pacific", diff --git a/src/bot/runtime_coordinator.py b/src/bot/runtime_coordinator.py index 39966a60..3da7d9b7 100644 --- a/src/bot/runtime_coordinator.py +++ b/src/bot/runtime_coordinator.py @@ -167,7 +167,7 @@ class StartupCoordinator: "istanbul", "paris", "hong kong", - "lau fau shan", + "shenzhen", "taipei", ], "chat_targets": len(chat_ids), diff --git a/src/data_collection/city_registry.py b/src/data_collection/city_registry.py index 8d412103..a6f9d3bf 100644 --- a/src/data_collection/city_registry.py +++ b/src/data_collection/city_registry.py @@ -134,8 +134,8 @@ CITY_REGISTRY = { "distance_km": 2.0, "warning": "海风与地形共同作用,午后对流触发后温度回落可能偏快。", }, - "lau fau shan": { - "name": "Lau Fau Shan", + "shenzhen": { + "name": "Shenzhen", "lat": 22.4686, "lon": 113.9970, "icao": "LFS", @@ -146,12 +146,12 @@ CITY_REGISTRY = { "disable_aviationweather": True, "tz_offset": 28800, "use_fahrenheit": False, - "is_major": False, + "is_major": True, "risk_level": "medium", "risk_emoji": "🟡", - "airport_name": "流浮山站", + "airport_name": "流浮山天文台站", "distance_km": 0.0, - "warning": "HKO 结算取流浮山站分钟级观测;该站不是机场 METAR,不能与 VHHH/VHSK 报文混用。", + "warning": "香港天文台流浮山站分钟级观测,Polymarket 深圳温度市场结算源;非机场 METAR,不可与 ZGSZ/VHHH 报文混用。", }, "taipei": { "name": "Taipei", @@ -665,24 +665,6 @@ CITY_REGISTRY = { "distance_km": 19.0, "warning": "四大火炉之一,夏季持续高温,夜间温度偏高,湿度大。", }, - "shenzhen": { - "name": "Shenzhen", - "lat": 22.6393, - "lon": 113.8107, - "icao": "ZGSZ", - "settlement_source": "wunderground", - "settlement_station_code": "ZGSZ", - "settlement_station_label": "Shenzhen Bao'an International Airport Station", - "settlement_url": "https://www.wunderground.com/history/daily/cn/shenzhen/ZGSZ", - "tz_offset": 28800, - "use_fahrenheit": False, - "is_major": True, - "risk_level": "medium", - "risk_emoji": "🟡", - "airport_name": "深圳宝安国际机场", - "distance_km": 32.0, - "warning": "市场现按 Wunderground 深圳宝安国际机场站整度°C口径结算;以历史页当日最终完成后的最高整度摄氏值为准。", - }, "guangzhou": { "name": "Guangzhou", "lat": 23.3924, @@ -816,7 +798,7 @@ ALIASES = { "dal": "dallas", "mia": "miami", "atl": "atlanta", "sea": "seattle", "tor": "toronto", "sel": "seoul", "seo": "seoul", "hkg": "hong kong", "hk": "hong kong", - "lfs": "lau fau shan", "laufaushan": "lau fau shan", + "lfs": "shenzhen", "laufaushan": "shenzhen", "lau fau shan": "shenzhen", "tpe": "taipei", "tp": "taipei", "taipei": "taipei", "pus": "busan", "bus": "busan", "rkpk": "busan", "sha": "shanghai", "sh": "shanghai", "sin": "singapore", @@ -858,7 +840,7 @@ ALIASES = { "多伦多": "toronto", "首尔": "seoul", "香港": "hong kong", - "流浮山": "lau fau shan", + "流浮山": "shenzhen", "台北": "taipei", "臺北": "taipei", "釜山": "busan", diff --git a/src/data_collection/city_time.py b/src/data_collection/city_time.py index deef1ded..62f439cd 100644 --- a/src/data_collection/city_time.py +++ b/src/data_collection/city_time.py @@ -34,7 +34,7 @@ CITY_TIME_ZONES = { "jeddah": "Asia/Riyadh", "karachi": "Asia/Karachi", "kuala lumpur": "Asia/Kuala_Lumpur", - "lau fau shan": "Asia/Hong_Kong", + "shenzhen": "Asia/Hong_Kong", "london": "Europe/London", "los angeles": "America/Los_Angeles", "lucknow": "Asia/Kolkata", @@ -54,7 +54,6 @@ CITY_TIME_ZONES = { "seattle": "America/Los_Angeles", "seoul": "Asia/Seoul", "shanghai": "Asia/Shanghai", - "shenzhen": "Asia/Shanghai", "singapore": "Asia/Singapore", "taipei": "Asia/Taipei", "tel aviv": "Asia/Jerusalem", diff --git a/src/data_collection/country_networks.py b/src/data_collection/country_networks.py index 6908c8b6..be1093a9 100644 --- a/src/data_collection/country_networks.py +++ b/src/data_collection/country_networks.py @@ -15,7 +15,6 @@ CHINA_CMA_CITIES = { "guangzhou", "qingdao", "shanghai", - "shenzhen", "wuhan", } diff --git a/src/data_collection/hko_obs_sources.py b/src/data_collection/hko_obs_sources.py index 5371c0a4..b3223619 100644 --- a/src/data_collection/hko_obs_sources.py +++ b/src/data_collection/hko_obs_sources.py @@ -25,10 +25,10 @@ HKO_STATIONS = { "icao": "HKO", "label": "HK Observatory 1min (HKO)", }, - "lau fau shan": { - "code": "Lau Fau Shan", + "shenzhen": { + "code": "Shenzhen (LFS)", "icao": "LFS", - "label": "Lau Fau Shan 1min (HKO)", + "label": "流浮山天文台 1min (HKO)", }, } diff --git a/src/data_collection/polymarket_readonly.py b/src/data_collection/polymarket_readonly.py index fe50eae2..2deacbcc 100644 --- a/src/data_collection/polymarket_readonly.py +++ b/src/data_collection/polymarket_readonly.py @@ -84,9 +84,6 @@ def _normalize_city_key(city: Any) -> str: MARKET_CITY_ALIASES: Dict[str, str] = { - # Lau Fau Shan has its own HKO observation / settlement layer, but - # Polymarket lists this temperature market under nearby Shenzhen. - "lau fau shan": "shenzhen", } MARKET_CITY_SLUG_ALIASES: Dict[str, str] = { diff --git a/src/data_collection/weather_sources.py b/src/data_collection/weather_sources.py index a6bccbb2..a5063bff 100644 --- a/src/data_collection/weather_sources.py +++ b/src/data_collection/weather_sources.py @@ -67,7 +67,6 @@ class WeatherDataCollector(OpenMeteoCacheMixin, SettlementSourceMixin, MetarSour "chongqing": ["ZUCK", "ZUPS"], "guangzhou": ["ZGGG", "ZGSZ"], "qingdao": ["ZSQD"], - "shenzhen": ["ZGSZ", "ZGGG"], "beijing": ["ZBAA", "ZBAD"], "wuhan": ["ZHHH", "ZHES"], "shanghai": ["ZSPD", "ZSSS", "ZSNB", "ZSHC"], @@ -657,9 +656,9 @@ class WeatherDataCollector(OpenMeteoCacheMixin, SettlementSourceMixin, MetarSour "vhsk": "Shek Kong", "石岗": "Shek Kong", "石崗": "Shek Kong", - "lau fau shan": "Lau Fau Shan", - "lfs": "Lau Fau Shan", - "流浮山": "Lau Fau Shan", + "shenzhen": "shenzhen", + "lfs": "shenzhen", + "深圳流浮山": "shenzhen", "taipei": "Taipei", "台北": "Taipei", "臺北": "Taipei", @@ -667,8 +666,6 @@ class WeatherDataCollector(OpenMeteoCacheMixin, SettlementSourceMixin, MetarSour "成都": "Chengdu", "chongqing": "Chongqing", "重庆": "Chongqing", - "shenzhen": "Shenzhen", - "深圳": "Shenzhen", "qingdao": "Qingdao", "青岛": "Qingdao", "青島": "Qingdao", @@ -846,7 +843,7 @@ class WeatherDataCollector(OpenMeteoCacheMixin, SettlementSourceMixin, MetarSour def _supports_aviationweather(self, city_lower: str) -> bool: city_meta = self.CITY_REGISTRY.get(str(city_lower or "").strip().lower(), {}) or {} settlement_source = str(city_meta.get("settlement_source") or "").strip().lower() - # HKO-settled Hong Kong cities (Hong Kong, Lau Fau Shan, future HKO stations) + # HKO-settled Hong Kong cities (Hong Kong, shenzhen, future HKO stations) # are official observatory stations, not airport/METAR contracts. Do not fetch # AviationWeather for their city cards; Shenzhen remains ZGSZ/Bao'an METAR-backed. if settlement_source == "hko": @@ -1085,7 +1082,7 @@ class WeatherDataCollector(OpenMeteoCacheMixin, SettlementSourceMixin, MetarSour def _attach_hko_obs_official_nearby( self, results: Dict, city_lower: str, use_fahrenheit: bool ) -> None: - if city_lower not in ("hong kong", "lau fau shan"): + if city_lower not in ("hong kong", "shenzhen"): return rows = self.fetch_hko_obs_official_nearby( city_lower, use_fahrenheit=use_fahrenheit diff --git a/web/analysis_service.py b/web/analysis_service.py index c23eaab5..a3b48d9f 100644 --- a/web/analysis_service.py +++ b/web/analysis_service.py @@ -55,7 +55,7 @@ HIGH_FREQ_AIRPORT_ANALYSIS_CITIES = { "istanbul", "paris", "hong kong", - "lau fau shan", + "shenzhen", "taipei", "beijing", "shanghai", diff --git a/web/scan_terminal_service.py b/web/scan_terminal_service.py index 1add20b5..f0554702 100644 --- a/web/scan_terminal_service.py +++ b/web/scan_terminal_service.py @@ -91,13 +91,13 @@ SCAN_TERMINAL_PAYLOAD_TTL_SEC = max( ) SCAN_TERMINAL_BUILD_TIMEOUT_SEC = max( 8, - int(os.getenv("POLYWEATHER_SCAN_TERMINAL_BUILD_TIMEOUT_SEC", "22")), + int(os.getenv("POLYWEATHER_SCAN_TERMINAL_BUILD_TIMEOUT_SEC", "60")), ) SCAN_TERMINAL_MAX_WORKERS = _env_int( "POLYWEATHER_SCAN_TERMINAL_MAX_WORKERS", - 2, + 6, min_value=1, - max_value=4, + max_value=8, ) DEFAULT_SCAN_AI_MODEL = "mimo-v2.5-pro" DEFAULT_SCAN_AI_BASE_URL = "https://token-plan-cn.xiaomimimo.com/v1"