Open-Meteo 是一个完全免费的天气 API,支持获取非常详细的天气信息。让我为你创建一个完整的代码,获取并输出所有可用的天气数据:


python
import requests
from datetime import datetime
def get_comprehensive_weather_openmeteo(lng, lat):
"""
使用 Open-Meteo 获取完整的天气信息
"""
url = "https://api.open-meteo.com/v1/forecast"
params = {
"latitude": lat,
"longitude": lng,
"current_weather": True,
"hourly": [
"temperature_2m", "relativehumidity_2m", "apparent_temperature",
"precipitation", "rain", "showers", "snowfall", "snow_depth",
"pressure_msl", "surface_pressure", "cloudcover", "cloudcover_low",
"cloudcover_mid", "cloudcover_high", "shortwave_radiation",
"direct_radiation", "diffuse_radiation", "direct_normal_irradiance",
"evapotranspiration", "et0_fao_evapotranspiration", "vapor_pressure_deficit",
"windspeed_10m", "windspeed_80m", "windspeed_120m", "windspeed_180m",
"winddirection_10m", "winddirection_80m", "winddirection_120m", "winddirection_180m",
"windgusts_10m", "temperature_80m", "temperature_120m", "temperature_180m",
"soil_temperature_0cm", "soil_temperature_6cm", "soil_temperature_18cm", "soil_temperature_54cm",
"soil_moisture_0_1cm", "soil_moisture_1_3cm", "soil_moisture_3_9cm", "soil_moisture_9_27cm", "soil_moisture_27_81cm"
],
"daily": [
"weathercode", "temperature_2m_max", "temperature_2m_min", "apparent_temperature_max",
"apparent_temperature_min", "precipitation_sum", "rain_sum", "showers_sum", "snowfall_sum",
"precipitation_hours", "sunrise", "sunset", "windspeed_10m_max", "windgusts_10m_max",
"winddirection_10m_dominant", "shortwave_radiation_sum", "et0_fao_evapotranspiration"
],
"timezone": "Asia/Shanghai",
"forecast_days": 7 # 预报7天
}
try:
response = requests.get(url, params=params, timeout=15)
if response.status_code == 200:
data = response.json()
return data
else:
print(f"API 错误: {response.status_code}")
print(f"响应内容: {response.text}")
return None
except Exception as e:
print(f"请求失败: {e}")
return None
def format_weather_data(data):
"""
格式化并输出完整的天气信息
"""
if not data:
return
print("=" * 60)
print("Open-Meteo 完整天气信息")
print("=" * 60)
# 当前天气信息
print("\n📍 当前天气:")
print("-" * 30)
current = data.get("current_weather", {})
if current:
print(f"经度: {data.get('longitude')}")
print(f"纬度: {data.get('latitude')}")
print(f"时区: {data.get('timezone')}")
print(f"当前温度: {current.get('temperature', 'N/A')}°C")
print(f"当前风速: {current.get('windspeed', 'N/A')} km/h")
print(f"当前风向: {current.get('winddirection', 'N/A')}°")
print(f"当前天气代码: {current.get('weathercode', 'N/A')}")
print(f"观测时间: {current.get('time', 'N/A')}")
print(f"是否为降水: {current.get('is_day', 'N/A')}")
# 小时预报(前12小时)
print("\n⏰ 12小时预报:")
print("-" * 30)
hourly = data.get("hourly", {})
if hourly:
times = hourly.get("time", [])[:12]
temps = hourly.get("temperature_2m", [])[:12]
hums = hourly.get("relativehumidity_2m", [])[:12]
precips = hourly.get("precipitation", [])[:12]
winds = hourly.get("windspeed_10m", [])[:12]
for i in range(len(times)):
print(f"{times[i]}: "
f"温度 {temps[i]}°C, "
f"湿度 {hums[i]}%, "
f"降水 {precips[i]}mm, "
f"风速 {winds[i]}km/h")
# 日预报
print("\n📅 7天预报:")
print("-" * 30)
daily = data.get("daily", {})
if daily:
times = daily.get("time", [])
max_temps = daily.get("temperature_2m_max", [])
min_temps = daily.get("temperature_2m_min", [])
precips = daily.get("precipitation_sum", [])
sunrises = daily.get("sunrise", [])
sunsets = daily.get("sunset", [])
for i in range(len(times)):
print(f"{times[i]}: "
f"最高温 {max_temps[i]}°C, "
f"最低温 {min_temps[i]}°C, "
f"总降水 {precips[i]}mm")
print(f" 日出: {sunrises[i] if i < len(sunrises) else 'N/A'}, "
f"日落: {sunsets[i] if i < len(sunsets) else 'N/A'}")
# 详细小时数据(部分)
print("\n📊 详细小时数据 (前3小时):")
print("-" * 30)
if hourly:
for key, values in hourly.items():
if key != "time": # 跳过时间字段
print(f"{key}: {values[:3] if len(values) >= 3 else values}")
# 每日详细数据
print("\n📈 每日详细数据:")
print("-" * 30)
if daily:
for key, values in daily.items():
if key != "time": # 跳过时间字段
print(f"{key}: {values}")
# 元数据
print("\n🔧 API 元数据:")
print("-" * 30)
print(f"生成时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
print(f"海拔: {data.get('elevation', 'N/A')}m")
print(f"时区缩写: {data.get('timezone_abbreviation', 'N/A')}")
print(f"UTC 偏移: {data.get('utc_offset_seconds', 'N/A')}秒")
# ===== 使用示例 =====
if __name__ == "__main__":
# 北京坐标 (GCJ-02 坐标可以直接使用,偏差不大)
lng, lat = 116.481488, 39.990464
print("正在获取 Open-Meteo 天气数据...")
weather_data = get_comprehensive_weather_openmeteo(lng, lat)
if weather_data:
format_weather_data(weather_data)
else:
print("未能获取天气数据")
Open-Meteo 支持的天气信息包括:
🌡️ 温度相关
temperature_2m: 2米高温度
apparent_temperature: 体感温度
不同高度的温度: temperature_80m, temperature_120m, temperature_180m
💧 降水相关
precipitation: 总降水
rain: 雨量
showers: 阵雨
snowfall: 降雪
snow_depth: 雪深
💨 风相关
windspeed_10m: 10米风速
windspeed_80m/120m/180m: 不同高度风速
winddirection_10m: 风向
windgusts_10m: 阵风
☁️ 云和辐射
cloudcover: 总云量
cloudcover_low/mid/high: 各层云量
shortwave_radiation: 短波辐射
direct_radiation: 直射辐射
🌞 日照相关
sunrise: 日出
sunset: 日落
precipitation_hours: 降水小时数
🌱 土壤相关
soil_temperature: 不同深度土壤温度
soil_moisture: 不同深度土壤湿度
📊 其他指标
pressure_msl: 海平面气压
relativehumidity_2m: 相对湿度
evapotranspiration: 蒸散发
et0_fao_evapotranspiration: FAO 蒸散发
这个 API 完全免费,无需 API Key,支持中文时区,是获取详细天气数据的好选择!