OpenWeather APIの無料枠の可能性に迫る

スポンサーリンク
tech系(python)
スポンサーリンク

はじめに

天気情報を取得できるAPIとして、「OpenWeather API」があります。

以下に金額のページがありますが、

Pricing - OpenWeatherMap
Explore OpenWeather's flexible subscription plans for real-time, forecast, and historical weather data. Discover our range of services including One Call API 3.

上記の画像にも書かれている通り、

  • ✅現在の天気情報
  • ✅3時間ごとの5日間の天気予報情報
  • ✅5つの現在のウェザーマップ
  • ✅大気汚染情報
  • ✅ジオコーディング

が無料枠で使えます。

「現在の天気情報」と「3時間ごとの5日間の天気予報情報」はネットを探すと実際にやってみた例が出てくるのですが、その他の3つは実際の例を見かけないので、試してみる事にしました。

pythonによる実装

✅3時間ごとの5日間の天気予報情報

まずは手始めに、「3時間ごとの5日間の天気予報情報」を取得してみます。

ベースになるpythonコード

今回はpythonで取得してみます。ベースとなるコードは以下のようになります。

import requests
import json
import datetime

endpoint = "https://api.openweathermap.org/data/2.5/forecast"

headers = {}

## 東京駅
params_0={
    "appid":"xxxxxxxxxxxxxxxxxxx", # ★取得したAPI
    "lon": 139.767,
    "lat": 35.681,
    "lang":"ja"
}

result = requests.get(endpoint, headers=headers, params=params_0)

#contentsをjsonから辞書型に変換
data = result.json()

print(json.dumps(data, indent=4, ensure_ascii=False))

実行結果は以下のようになります。

{
    "cod": "200",
    "message": 0,
    "cnt": 40,
    "list": [
        {
            "dt": 1740398400,
            "main": {
                "temp": 279.51,
                "feels_like": 275.36,
                "temp_min": 279.12,
                "temp_max": 279.51,
                "pressure": 1020,
                "sea_level": 1020,
                "grnd_level": 1019,
                "humidity": 31,
                "temp_kf": 0.39
            },
            "weather": [
                {
                    "id": 801,
                    "main": "Clouds",
                    "description": "薄い雲",
                    "icon": "02n"
                }
            ],
            "clouds": {
                "all": 18
            },
            "wind": {
                "speed": 7.16,
                "deg": 338,
                "gust": 12.31
            },
            "visibility": 10000,
            "pop": 0,
            "sys": {
                "pod": "n"
            },
            "dt_txt": "2025-02-24 12:00:00"
        },
        {
            "dt": 1740409200,
            "main": {
                "temp": 278.81,
                "feels_like": 275.37,
                "temp_min": 278.36,
                "temp_max": 278.81,
                "pressure": 1021,
                "sea_level": 1021,
                "grnd_level": 1020,
                "humidity": 33,
                "temp_kf": 0.45
            },
            "weather": [
                {
                    "id": 800,
                    "main": "Clear",
                    "description": "晴天",
                    "icon": "01n"
                }
            ],
            "clouds": {
                "all": 7
            },
            "wind": {
                "speed": 4.88,
                "deg": 326,
                "gust": 9.38
            },
            "visibility": 10000,
            "pop": 0,
            "sys": {
                "pod": "n"
            },
            "dt_txt": "2025-02-24 15:00:00"
        },
・・・【略】・・・
        {
            "dt": 1740819600,
            "main": {
                "temp": 288.24,
                "feels_like": 286.88,
                "temp_min": 288.24,
                "temp_max": 288.24,
                "pressure": 1020,
                "sea_level": 1020,
                "grnd_level": 1018,
                "humidity": 41,
                "temp_kf": 0
            },
            "weather": [
                {
                    "id": 800,
                    "main": "Clear",
                    "description": "晴天",
                    "icon": "01n"
                }
            ],
            "clouds": {
                "all": 5
            },
            "wind": {
                "speed": 4.67,
                "deg": 191,
                "gust": 6.35
            },
            "visibility": 10000,
            "pop": 0,
            "sys": {
                "pod": "n"
            },
            "dt_txt": "2025-03-01 09:00:00"
        }
    ],
    "city": {
        "id": 1857654,
        "name": "東京都千代田区丸の内",
        "coord": {
            "lat": 35.681,
            "lon": 139.767
        },
        "country": "JP",
        "population": 0,
        "timezone": 32400,
        "sunrise": 1740345475,
        "sunset": 1740385849
    }
}

✅現在の天気情報

現在の天気を求めてみます。

上記のベースになるpythonコードのendpointの値を以下に変更します。

endpoint = "https://api.openweathermap.org/data/2.5/weather"

実行すると以下のような結果になります。

現在の東京駅の天気情報が取得できました。

{
    "coord": {
        "lon": 139.767,
        "lat": 35.681
    },
    "weather": [
        {
            "id": 801,
            "main": "Clouds",
            "description": "薄い雲",
            "icon": "02n"
        }
    ],
    "base": "stations",
    "main": {
        "temp": 279.7,
        "feels_like": 275.12,
        "temp_min": 278.66,
        "temp_max": 280.34,
        "pressure": 1020,
        "humidity": 33,
        "sea_level": 1020,
        "grnd_level": 1018
    },
    "visibility": 10000,
    "wind": {
        "speed": 8.75,
        "deg": 340
    },
    "clouds": {
        "all": 20
    },
    "dt": 1740390414,
    "sys": {
        "type": 2,
        "id": 268395,
        "country": "JP",
        "sunrise": 1740345475,
        "sunset": 1740385849
    },
    "timezone": 32400,
    "id": 1857654,
    "name": "東京都千代田区丸の内",
    "cod": 200
}

✅5つの現在のウェザーマップ

5つのウェザーマップを取得できます。

これはベースのpythonコードではなく、別途コードを書いておく必要があります。

マップの表示をするので、jupyter notebookかgoogle colabなどを使用するといいです。

以下にコードを記載します。

import folium

# 地図の初期設定(緯度・経度・ズームレベル)
m = folium.Map(location=[35.6895, 139.6917], zoom_start=5)

# OpenWeatherMapのWeather Layerを追加
weather_layer_url = "https://tile.openweathermap.org/map/pressure_new/{z}/{x}/{y}.png?appid=dae057ba9fd933aa30ca408004b9bbce"

folium.raster_layers.TileLayer(
    tiles=weather_layer_url,
    attr="OpenWeatherMap",
    name="Weather Layer",
    overlay=True
).add_to(m)

# レイヤーコントロールを追加
folium.LayerControl().add_to(m)
m

このコードでは気圧をマッピングする例になります。

出力結果は以下になります。

他にも

  • 降水量
  • 風力
  • 気温

があります。

詳細は以下の公式ドキュメントを参照してください。

Weather maps 1.0 - OpenWeatherMap
Explore OpenWeather's diverse weather maps, including Precipitation, Clouds, Pressure, Temperature, and Wind, perfect for integration with mobile and web apps.

✅大気汚染情報

大気汚染情報を取得します。

上記のベースになるpythonコードのendpointの値を以下に変更します。

endpoint = "http://api.openweathermap.org/data/2.5/air_pollution"

出力は以下のようになります。(東京駅の緯度経度による値です)

{
    "coord": {
        "lon": 139.767,
        "lat": 35.681
    },
    "list": [
        {
            "main": {
                "aqi": 2
            },
            "components": {
                "co": 307.08,
                "no": 0,
                "no2": 16.79,
                "o3": 92.98,
                "so2": 10.97,
                "pm2_5": 0.6,
                "pm10": 1.37,
                "nh3": 1.22
            },
            "dt": 1740394583
        }
    ]
}

値の単位は「µg/m³」です。

それぞの値は以下のようになります。

  • co
    • 一酸化炭素
    • (主に化石燃料の不完全燃焼によって発生)
  • no
    • 一酸化窒素
    • (主に車の排ガスや工業活動で発生する)
  • no2
    • 二酸化窒素
    • (車の排ガスや火力発電所で発生する)
  • o3
    • オゾン
    • (NO₂などと紫外線が反応して生成される)
    • (今回の結果では高め)
  • so2
    • 二酸化硫黄
    • (石炭や石油の燃焼によって発生)
  • pm2_5
    • PM2.5(微小粒子状物質)
    • (直径2.5µm以下の微粒子で、燃焼や工業排出から発生する)
  • pm10
    • PM10(浮遊粒子状物質)
    • 直径10µm以下の粒子で、工業活動や砂ぼこりに由来する
  • nh3
    • アンモニア
    • 農業(肥料)や畜産業から発生する

✅ジオコーディング

最後はジオコーディングです。

上記のベースになるpythonコードの以下の値を変更します。

・・・【略】・・・
endpoint = "http://api.openweathermap.org/geo/1.0/direct"
・・・【略】・・・
params_0={
    "appid":"dae057ba9fd933aa30ca408004b9bbce",
    "q": "Tokyo",
    "limit": 3,
    "lang":"ja"
}

結果は以下のようになります。

[
    {
        "name": "Tokyo",
        "local_names": {
            "be": "Токіа",
            "et": "Tōkyō",
            "io": "Tokyo",
            "ta": "டோக்கியோ",
            "it": "Tokyo",
            "ar": "طوكيو",
            "ja": "東京都",
            "lv": "Tokija",
            "cs": "Tokio",
            "la": "Tokium",
            "cy": "Tokyo",
            "hu": "Tokió",
            "th": "โตเกียว",
            "ca": "Tòquio",
            "is": "Tókýó",
            "ru": "Токио",
            "nl": "Tokio",
            "mr": "तोक्यो",
            "ko": "도쿄도",
            "mi": "Tōkio",
            "tg": "Токио",
            "fi": "Tokio",
            "da": "Tokyo",
            "tr": "Tokyo",
            "en": "Tokyo",
            "de": "Tokio",
            "el": "Τόκιο",
            "hr": "Tokio",
            "ia": "Tokyo",
            "zh": "东京都/東京都",
            "oc": "Tòquio",
            "bg": "Токио",
            "sl": "Tokio",
            "eo": "Tokio",
            "pt": "Tóquio",
            "sk": "Tokio",
            "sr": "Токио",
            "vi": "Tokyo",
            "lb": "Tokio",
            "lt": "Tokijas",
            "he": "טוקיו",
            "pl": "Tokio",
            "ku": "Tokyo",
            "fa": "توکیو",
            "uk": "Токіо",
            "sv": "Tokyo",
            "fr": "Tokyo",
            "kn": "ಟೋಕ್ಯೊ",
            "es": "Tokio"
        },
        "lat": 35.6828387,
        "lon": 139.7594549,
        "country": "JP"
    },
    {
        "name": "Chofu",
        "local_names": {
            "tg": "Чōфу",
            "ms": "Chofu",
            "nl": "Chofu",
            "uk": "Тьофу",
            "sv": "Chofu",
            "th": "โชฟุ",
            "it": "Chōfu",
            "gl": "Chōfu, Tōkyō",
            "pt": "Chofu",
            "de": "Chōfu",
            "sh": "Čofu",
            "zh": "調布市",
            "ja": "調布市",
            "et": "Chōfu",
            "es": "Chofu",
            "bg": "Чофу",
            "fr": "Chōfu",
            "ru": "Тёфу",
            "fa": "چوفو، توکیو",
            "ko": "조후시",
            "fi": "Chōfu",
            "ar": "تشوفو، طوكيو",
            "lt": "Čiofu",
            "sr": "Чофу",
            "pl": "Chōfu",
            "en": "Chofu"
        },
        "lat": 35.660036,
        "lon": 139.554815,
        "country": "JP"
    },
    {
        "name": "Tama",
        "local_names": {
            "th": "ทามะ",
            "it": "Tama",
            "ms": "Tama",
            "fr": "Tama",
            "pl": "Tama",
            "zh": "多摩市",
            "de": "Tama",
            "bg": "Тама",
            "uk": "Тама",
            "es": "Tama",
            "gl": "Tama, Tōkyō",
            "fi": "Tama",
            "ja": "多摩市",
            "ko": "다마시",
            "tg": "Тама",
            "lt": "Tama",
            "sh": "Tama",
            "pt": "Tama",
            "sr": "Тама",
            "ar": "تاما، طوكيو",
            "en": "Tama",
            "fa": "تاما، توکیو",
            "nl": "Tama",
            "ru": "Тама"
        },
        "lat": 35.637188,
        "lon": 139.443503,
        "country": "JP"
    }
]

最後に

今回は「OpenWeather API」の無料枠でできる可能性について調べてみました。

無料でも結構使える機能が多くて驚きました。

タイトルとURLをコピーしました