Open-Meteo完全免费的天气 API查询

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,支持中文时区,是获取详细天气数据的好选择!

相关推荐
龘龍龙5 分钟前
Python基础学习(十)
服务器·python·学习
轻竹办公PPT7 分钟前
用 AI 制作 2026 年工作计划 PPT,需要准备什么
大数据·人工智能·python·powerpoint
Mqh1807628 分钟前
day58 经典时序预测模型
python
Amelia1111118 分钟前
day44
python
高洁0112 分钟前
10分钟了解向量数据库(1)
python·深度学习·机器学习·transformer·知识图谱
DP+GISer14 分钟前
00基于pytorch的深度学习遥感地物分类全流程实战教程(包含遥感深度学习数据集制作与大图预测)-前言
pytorch·python·深度学习·图像分割·遥感·地物分类
耶夫斯计21 分钟前
【SQL_agent】基于LLM实现sql助理
数据库·python·sql·语言模型
vibag22 分钟前
RAG向量数据库
python·语言模型·langchain·大模型
kisshuan1239622 分钟前
基于YOLO11改进的C3k2-AdditiveBlock实现命中检测与双重命中事件识别_1
python
mg66824 分钟前
0基础开发学习python工具_____用 Python + Pygame 打造绚丽烟花秀 轻松上手体验
开发语言·python·学习·pygame