😺

OpenWeather使ってみた

2023/03/29に公開

前説

基本的な機能が無料で使える天気予報プラットフォームとしては有名どころのOpenWeather。独習のために使ってみました。

※2023年1月時点の内容です。

プランの確認

OWMプラン

利用条件を確認しますと、

  • 60回/分、1,000,000回/月のリクエスト
  • Current Weather
  • 3-hour Forecast 5 days(3時間の予報を5日分)

5 day forecast is available at any location on the globe. It includes weather forecast data with 3-hour step. Forecast is available in JSON or XML format.

十分と思いますので、安心してFreeGet API keyを押してみます。

アカウントの作成

Get API keyを押すと、アカウントの作成が始まります。

Create New Account

下3つのチェックはよくある「お便りを受け取りますか?」というやつのようです。

I consent to receive communications from OpenWeather Group of Companies and their partners:

OpenWeather Group of Companies およびそのパートナーからの通信を受け取ることに同意します。

もろもろ入力し、ロボットではないこともチェックして証明したらCreate Accountをクリックします。

How you use

Create AccountをクリックするとAPIの利用目的を聞かれますので、選択肢から選んで回答します。
私の場合は完全に独習目的でしたので、Education/Scienceとしました。
Saveをクリックすると、下のようなメールが届きます。

verify mail

Verify your emailをクリックしてメールを認証するとOpenWeatherの画面が開き、メールが認証された旨のメッセージが表示されます。

verified

API Keysの確認

先ほどのメッセージの下部にAPI Keysというタブがあるので、さっそくクリックしてみます。

API Keys

1つのAPI Keyが自動的に生成されていました。上のメッセージ部分には、

You can generate as many API keys as needed for your subscription. We accumulate the total load from all of them.

サブスクリプションに必要な数だけAPIキーを生成することができます。それら全てから合計の負荷を蓄積します。

と、書かれています。

API Keysの追加

Create Keyの部分にAPI Key nameという欄とGenerateというボタンがあるので、

Create Key

任意のkey名を入力してGenerateを押してみます。

add a key

新しいkeyが追加されました。(key名にはpractice-useと入力してみました)

APIを実行してみる - Current weather -

今回選択しているFree PlanではCurrent weather3-hour Forecast 5 daysが使えるはずです。
とりあえずCurrent weatherを試してみます。

APIs

- Access current weather data for any location including over 200,000 cities
- We collect and process weather data from different sources such as global and local weather models, satellites, radars and a vast network of weather stations
- JSON, XML, and HTML formats
- Included in both free and paid subscriptions
  • 20万以上の都市を含む、あらゆる場所の現在の気象データにアクセスできます。
  • グローバルおよびローカル気象モデル、人工衛星、レーダー、気象観測所の広大なネットワークなど、さまざまなソースから気象データを収集し、処理します。
  • JSON、XML、およびHTML形式
  • 無料および有料のサブスクリプションに含まれます。
// 緯度と経度から
https://api.openweathermap.org/data/2.5/weather?lat={lat}&lon={lon}&appid={API key}
// 都市名から?
https://api.openweathermap.org/data/2.5/weather?q={city name}&appid={API key}

なるほどですね。

たたいてみた

curl 'https://api.openweathermap.org/data/2.5/weather?zip=169-0072,JP&appid={your-api-key}&lang=jp'

東京都新宿区大久保(※行ったことなし)の現在の天気を、郵便番号で拾ってみました。
わかる範囲でパラメータの詳細を調べたものを追記しています。

{
    "coord": {
        "lon": 139.7056,  // 都市の地理的位置、経度
        "lat": 35.7018  // 都市の地理的位置、緯度
    },
    "weather": [  // ココ、配列なので注意!
        {
            "id": 803,  // 気象条件ID
            "main": "Clouds",  // 気象パラメータ群(雨、雪、異常気象など)
            "description": "broken clouds",  // グループ内の気象条件
            "icon": "04d"  // 天気アイコンID
        }
    ],
    "base": "stations",  // 内部パラメータ
    "main": {
        "temp": 284.52,  // 気温(ケルビン温度)
        "feels_like": 282.89,  // 体感温度
        "temp_min": 282.98,  // 現時点での最低気温。現在観測されている最低気温(大規模なメガロポリスや都市部内)。
        "temp_max": 286.3,  // 現時点での最高気温
        "pressure": 1019,  // 大気圧(sea_levelまたはgrnd_levelのデータがない場合は海面気圧)、hPa
        "humidity": 45  // 湿度, %.
    },
    "visibility": 10000,  // 視認性、メートル。視界の最大値は10km
    "wind": {
        "speed": 4.12,  // 風速(m/s)
        "deg": 350  // 風向き(度)
    },
    "clouds": {
        "all": 75  // 曇り度, %.
    },
    "dt": 1675732660,  // データ算出時刻、unix、UTC
    "sys": {
        "type": 2,  // 内部パラメータ
        "id": 2001249,  // 内部パラメータ
        "country": "JP",  // 国コード
        "sunrise": 1675719421,  // 日の出時刻、Unix、UTC
        "sunset": 1675757614  // 日没時刻、Unix、UTC
    },
    "timezone": 32400,  // UTCからのシフト(秒
    "id": 0,  // 
    "name": "Ookubo",   // ちゃんと「Ookubo」になっている
    "cod": 200  // 内部パラメータらしい
}

気温の数値がケルビン温度で応答されるので、摂氏温度にするには273.15を引けばよさそうです。
天気のほかにも体感温度、風向、風速なども含まれているので、けっこう遊べそうです!

もう1つ、Free Planで実行できる3-hour Forecast 5 daysを試してみます。

APIを実行してみる - 5 day / 3 hour forecast -

5 day forecast is available at any location on the globe. 
It includes weather forecast data with 3-hour step. Forecast is available in JSON or XML format.

地球上のどの場所でも5日間予報が可能です。3時間ステップの天気予報データも含まれています。JSON形式またはXML形式で提供されます。

こちらは天気の現況を問い合わせるCurrent weatherと異なり、未来の予報データが返されるのが大きな特徴です。いわゆる「天気予報」ですね。

これもたたいてみた

ここでは兵庫県明石市大久保町(※行ったことなし)の緯度経度情報を使ってみます。

curl 'https://api.openweathermap.org/data/2.5/forecast?lon=134.9445&lat=34.6788&appid={your-api-key}&lang=jp'
{
  "cod": "200",
  "message": 0,
  "cnt": 40,
  "list": [
    {
      "dt": 1680069600,
      "main": {
        "temp": 287.07,
        "feels_like": 285.33,
        "temp_min": 287.07,
        "temp_max": 289.38,
        "pressure": 1020,
        "sea_level": 1020,
        "grnd_level": 1019,
        "humidity": 31,
        "temp_kf": -2.31
      },
      "weather": [
        {
          "id": 803,
          "main": "Clouds",
          "description": "broken clouds",
          "icon": "04d"
        }
      ],
      "clouds": {
        "all": 65
      },
      "wind": {
        "speed": 1.59,
        "deg": 309,
        "gust": 3.07
      },
      "visibility": 10000,
      "pop": 0,
      "sys": {
        "pod": "d"
      },
      "dt_txt": "2023-03-29 06:00:00"
    },
    {
      "dt": 1680080400,
      "main": {
        "temp": 287.13,
        "feels_like": 285.5,
        "temp_min": 287.13,
        "temp_max": 287.25,
        "pressure": 1021,
        "sea_level": 1021,
        "grnd_level": 1020,
        "humidity": 35,
        "temp_kf": -0.12
      },
      "weather": [
        {
          "id": 803,
          "main": "Clouds",
          "description": "broken clouds",
          "icon": "04d"
        }
      ],
      "clouds": {
        "all": 77
      },
      "wind": {
        "speed": 4.6,
        "deg": 31,
        "gust": 5.67
      },
      "visibility": 10000,
      "pop": 0,
      "sys": {
        "pod": "d"
      },
      "dt_txt": "2023-03-29 09:00:00"
    },
    {
      "dt": 1680091200,
      "main": {
        "temp": 285.58,
        "feels_like": 283.87,
        "temp_min": 284.83,
        "temp_max": 285.58,
        "pressure": 1022,
        "sea_level": 1022,
        "grnd_level": 1021,
        "humidity": 38,
        "temp_kf": 0.75
      },

    // --- 中略 ---

    }
  ],
  "city": {
    "id": 1847966,
    "name": "Akashi",
    "coord": {
      "lat": 34.6788,
      "lon": 134.9445
    },
    "country": "JP",
    "population": 297279,
    "timezone": 32400,
    "sunrise": 1680036746,
    "sunset": 1680081466
  }
}

トップレベル要素のlistの中に、気温や天気などの要素群が配列で格納されています。
日時にあたるdtはUTC、かつUNIXタイムスタンプ値なのでわかりにくいですが、最後のdt_txtに日時形式の文字列で表現されています。
この日時は現在日時以降、1つ1つは3時間おきの値になっています。

例えば現在時刻が 11:30 なら、その日の 12:00、15:00、18:00、21:00、翌0:00、3:00、6:00... といった感じで、5日分の天気情報が並ぶ構造です。

おもしろいのはこのAPIだと、取得した都市の「人口(population)」が返ってきました。
天気予報関係ないやんとも思いましたが、過去からの気象条件の推移などを見る場合には、その場所の人口も大切な統計要素なのかもしれません。

(ご参考:兵庫県明石市/推計人口 2023年(令和5年)3月1日現在)

天気アイコンについて

最後に、APIのレスポンスデータに含まれる「天気アイコン」についても調べました。

Current WeatherAPIのweather要素を抜粋します。

"weather": [
    {
        "id": 803,
        "main": "Clouds",
        "description": "broken clouds",
        "icon": "04d"  // 天気アイコンID
    }
],

この「天気アイコンID」、APIのドキュメントだけ見ても「Weather icon id」としか書かれておらず用途に困ったのですが、下記のドキュメントに詳細が書かれていました。

How to get icon URL
For code 500 - light rain icon = "10d". See below a full list of codes
URL is https://openweathermap.org/img/wn/10d@2x.png

上記のとおり、https://openweathermap.org/img/wn/{icon-id}@2x.pngようなURLを組み立てて{icon-id}の部分をしかるべきアイコンIDにしてあげれば、天気アイコンの画像データが取得できました。

同じドキュメントにweather.idの説明も書かれており、眺めているとおもしろいです。(「雷雨」だけで10種類、「霧雨(Drizzle)」だけで9種類もあるとは...)

まとめ

以上です。
このOpenWeatherのAPIを使って天気予報サイトを作ってみています。この件は、別の記事で書きたいと思います。

最後までお読みいただき、ありがとうございました。

ではまた!

Discussion