A little bit of everything

元・情報系大学院生の備忘録

OpenWeatherMap の Web API の使い方

OpenWeatherMapとは

天気などの各種気象の情報を、無料のWeb APIとして提供するオンラインサービスです。
公的気象情報、空港の気象観測所、レーダーなどからのデータを、OpenWeatherMap独自のアルゴリズムで加工して提供しているようです。

使用できるAPIの一覧は、こちらのページ(Weather API - OpenWeatherMap)に載ってます。

OpenWeatherMapのアカウント作成

APIを使用するには、アカウントを作成する必要があります。

ここのページ(Members)からアカウントを作成します。

f:id:yuukiyg:20191117165244p:plain 上記のページにて、

  1. ユーザ名
  2. Email
  3. 作成するPassword

を入力し、Privacy Policyなどのチェックを入れ、 [Create Account] をクリックすると、次のページに遷移して、APIキーが表示されます。
このAPIキーが、自分専用のキーになるので、メモしておきましょう。

APIキーを忘れても、こちらのページ(Members)にアクセスすれば、自分のAPIキーを確認することができます。

特定の場所の、現在の天気を取得する

今回は、東京駅の天気を取得しようと思います。
天気を知りたい場所を指定する際に、その場所の郵便番号や、その場所の緯度経度を指定する方法など、複数の方法があります。 今回は、緯度経度を指定して、天気を取得してみます。


東京駅の緯度・経度を調べる

Google Maps(Google マップ)を開いて、「東京駅」と検索します。

すると、以下の画像のように、URLの入力欄に緯度・経度が表示されるので、この値をメモしておきます。
東京駅の緯度・経度は、35.6809704, 139.7678007でした。

f:id:yuukiyg:20191117171017p:plain

OpenWeatherMapのAPIを叩く

以下の形式のURLをWebブラウザで開く(つまり、GETリクエストを投げる)と、緯度・経度の情報を取得することができます。

http://api.openweathermap.org/data/2.5/weather?lat={緯度}&lon={経度}&APPID={自分のAPIキー}

ベースとなるAPIのURLは、
http://api.openweathermap.org/data/2.5/weather
という部分で、"?" 以降は、そのAPIに渡すパラメータ、通称「クエリパラメータ」です。
クエリパラメータが複数ある場合は、"&" で繋ぎます。
つまり、上記のURLの構造は、

ということになります。

実際にWebブラウザAPIを叩いてみると、以下のような結果が返ってきます。 f:id:yuukiyg:20191117172423p:plain


このJSON文字列を整形すると、以下ようになります。

{
    "coord": {
        "lon": 139.77,
        "lat": 35.68
    },
    "weather": [
        {
            "id": 803,
            "main": "Clouds",
            "description": "broken clouds",
            "icon": "04n"
        }
    ],
    "base": "stations",
    "main": {
        "temp": 288.52,
        "pressure": 1023,
        "humidity": 44,
        "temp_min": 285.93,
        "temp_max": 290.37
    },
    "visibility": 10000,
    "wind": {
        "speed": 4.6,
        "deg": 330
    },
    "clouds": {
        "all": 75
    },
    "dt": 1573978437,
    "sys": {
        "type": 1,
        "id": 8074,
        "country": "JP",
        "sunrise": 1573939084,
        "sunset": 1573976020
    },
    "timezone": 32400,
    "id": 1857654,
    "name": "Marunouchi",
    "cod": 200
}


"weather" のところで、 "id":803 となっています。
これは、「千切れ雲(broken clouds)が51-84%出ている曇り状態」を表しています(細かい…)。
天気のIDが何を表しているかは、こちらのページ(Weather Conditions - OpenWeatherMap)に詳しく載っています。


"temp": 288.52
と書かれている部分が、現在の気温です。
この値はケルビン(K) で表されているようです。
ケルビン(K) から摂氏(℃) に変換するには、-273.15 を計算します。
つまり、
288.52K=288.52-273.15=15.37℃ です。

11月17日の17:30現在、東京駅は15.37℃ということです。

その他、気圧(presure)や湿度(humidity)、最高気温(temp_max)、最低気温(temp_min)なども取得できています。

緯度・経度を指定するのは面倒な場合

「東京駅の天気」や、「浅草駅前のファミリーマートの天気」というように、ピンポイントの天気を知りたい場合は、緯度・経度でその場所を指定するしかありません。
これは非常に面倒です。
実際は、「東京の天気」とか、「大阪の天気」のような、ざっくりした場所を指定することがほとんどだと思います。

その場合は、以下のようにすれば、東京の天気を取得できます(最初からそれを言えよ!という感じですが…)。
http://api.openweathermap.org/data/2.5/weather?q=Tokyo&APPID={自分のAPIキー}

実際にこのAPIを叩いてみると、以下のような結果になりました。

{
    "coord": {
        "lon": 139.76,
        "lat": 35.68
    },
    "weather": [
        {
            "id": 803,
            "main": "Clouds",
            "description": "broken clouds",
            "icon": "04n"
        }
    ],
    "base": "stations",
    "main": {
        "temp": 287.78,
        "pressure": 1025,
        "humidity": 44,
        "temp_min": 285.37,
        "temp_max": 289.82
    },
    "visibility": 10000,
    "wind": {
        "speed": 4.1,
        "deg": 330
    },
    "clouds": {
        "all": 75
    },
    "dt": 1573980601,
    "sys": {
        "type": 1,
        "id": 8074,
        "country": "JP",
        "sunrise": 1573939086,
        "sunset": 1573976022
    },
    "timezone": 32400,
    "id": 1850147,
    "name": "Tokyo",
    "cod": 200
}

当たり前ですが、東京駅の天気とほぼ同じになりました。

特定の場所の天気予報を取得する

OpenWetherMapでは、

  • 1時間ごとの天気予報を向こう4日分取得する
  • 3時間ごとの天気予報を向こう5日分取得する
  • 日ごとの天気予報を向こう16日分取得する

などの天気予報が用意されています。

ここでは、東京の3時間ごとの天気予報を5日分取得してみます。

東京の3時間ごとの天気予報を5日分取得する場合は、以下のAPIを叩きます。

http://api.openweathermap.org/data/2.5/forecast?q=Tokyo&APPID={自分のAPIキー}

先ほど、現在の天気を取得する際は、
http://api.openweathermap.org/data/2.5/weather
というURLだったのに対し、天気予報を取得する際は、 http://api.openweathermap.org/data/2.5/forecast
というURLになっています。

実際にAPIを叩くと、以下のような結果が返ってきます。
かなり省略していますが、3時間ごとの天気予報が取得できています。

{
  "cod": "200",
  "message": 0,
  "cnt": 40,
  "list": [
    {
      //省略, 
      "dt_txt": "2019-11-17 12:00:00"
    },
    {
      //省略,
      "dt_txt": "2019-11-17 15:00:00"
    },
    {
      //省略,
      "dt_txt": "2019-11-17 18:00:00"
    },
    // ・・・
    // 省略
    // ・・・
    {
      //省略,
      "dt_txt": "2019-11-22 03:00:00"
    },
    {
      //省略,
      "dt_txt": "2019-11-22 06:00:00"
    },
    {
      //省略,
      "dt_txt": "2019-11-22 09:00:00"
    }
  ],
  "city": {
    "id": 1850147,
    "name": "Tokyo",
    "coord": {
      "lat": 35.6828,
      "lon": 139.759
    },
    "country": "JP",
    "population": 8336599,
    "timezone": 32400,
    "sunrise": 1573939087,
    "sunset": 1573976022
  }
}

さいごに

今回は、特定の場所の現在の天気や、天気予報を取得しました。
この他にも、OpenWeatherMapには、天気の情報を地図上に色を塗って表した結果を取得できるAPIのように、様々なAPIが用意されています。
再掲になりますが、APIの一覧を載せておきます。