From 5bbbd33e2b433d5125029b41b43910e1142ae8be Mon Sep 17 00:00:00 2001 From: "2569718930@qq.com" <2569718930@qq.com> Date: Thu, 5 Mar 2026 16:55:29 +0800 Subject: [PATCH] feat: Add multi-source weather data collector with support for OpenWeatherMap, Visual Crossing, and NOAA METAR. --- src/data_collection/weather_sources.py | 38 +++++++++++++++++++------- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/src/data_collection/weather_sources.py b/src/data_collection/weather_sources.py index 339e7257..35e44511 100644 --- a/src/data_collection/weather_sources.py +++ b/src/data_collection/weather_sources.py @@ -632,14 +632,20 @@ class WeatherDataCollector: logger.warning(f"MGM 找不到省份 {province} 的站点元数据") return [] - # 为了性能,如果站点太多(比如安卡拉有50多个),可以只取前 25 个 - # 同时确保我们关心的 root_ist_no 一定在里面 - target_ist_nos = province_ist_nos[:25] - if root_ist_no and root_ist_no in province_ist_nos and root_ist_no not in target_ist_nos: - target_ist_nos.append(root_ist_no) - # 如果是安卡拉,额外确保 17128 (机场站) 也在里面 - if province_upper == "ANKARA" and "17128" in province_ist_nos and "17128" not in target_ist_nos: - target_ist_nos.append("17128") + # 同时确保我们关心的几个核心站一定在里面 + target_ist_nos = [str(i) for i in province_ist_nos[:25]] + # 17130: 安卡拉总站 (市区核心) + if 17130 in province_ist_nos or "17130" in province_ist_nos: + if "17130" not in target_ist_nos: + target_ist_nos.append("17130") + # 17128: 机场官方站 + if 17128 in province_ist_nos or "17128" in province_ist_nos: + if "17128" not in target_ist_nos: + target_ist_nos.append("17128") + if root_ist_no: + rs = str(root_ist_no) + if rs not in target_ist_nos: + target_ist_nos.append(rs) # 3. 多线程获取每个站点的最新观测 (sondurumlar) def fetch_single_station(ist_no): @@ -668,12 +674,24 @@ class WeatherDataCollector: # 4. 组装最终结果 for ist_no, temp in station_temps.items(): - meta = metadata[ist_no] + sid = str(ist_no) + # metadata 可能使用 int 或 str 作为 key + meta = metadata.get(sid) or metadata.get(int(sid)) + if not meta: + continue + lat = meta.get("enlem") lon = meta.get("boylam") # 优先显示区县名,地图更清晰 display_name = (meta.get("ilce") or meta.get("istAd") or f"Station {ist_no}").title() + # 特殊处理核心站点的显示名称 + sid = str(ist_no) + if sid == "17130": + display_name = "Ankara (Bölge/Center)" + elif sid == "17128": + display_name = "Airport (MGM/17128)" + results.append({ "name": display_name, "lat": lat, @@ -1367,7 +1385,7 @@ class WeatherDataCollector: # 对土耳其城市,额外获取 MGM 官方数据与周边测站 turkish_provinces = { - "ankara": ("17130", "Ankara"), + "ankara": ("17128", "Ankara"), # 使用机场站 (Esenboğa Havalimanı) 作为结算参考主站 "istanbul": ("17060", "Istanbul"), } if city_lower in turkish_provinces: