OpenWeatherのAPIを使ってみる

2022.03.15

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

データアナリティクス事業本部のkobayashiです。

天気情報を取得できるOpenWeatherMapのサービスでは全世界の気象データを取得できます。OpenWeatherMapはiOSやAndroidアプリもありますが、OpenWeatherMapにはAPIがあるためプログラムからデータを取得することができます。今回、このAPIを使ってみましたのでまとめます。

環境

  • macOS 10.15.7
  • Python 3.7.12

OpenWeatherMapとは

OpenWeatherMapは20万都市を超える全世界の気温、降水量、降水確率、湿度、気分、気圧といった気象データを取得できるサービスです。無償版とサブスクリプション版がありますが、無償版でも現在の天気や天気予測のデータも扱えます。サブスクリプション版との違いは取得できるデータの期間やAPIのコール数の違いがありますが、無償版でもAPIの呼び出しが100万コール/月(60コール/分)使えるので個人ユースでしたら無料の範囲内で扱えると思います。(Pricing - OpenWeatherMap )

OpenWeatherMapのサインアップもメールアドレスがあればすぐ可能です。(Members - OpenWeatherMap )

また今回は扱いませんが過去の気象データも1979年1月1日から40年分以上のデータを1時間毎に取得できます。(History Bulk weather data - OpenWeatherMap

OpenWeatherMapのAPI

OpenWeatherMapには様々なAPIがあります。

主に使うのは「Current weather data 」と「One Call API 」になります。無償版で使えるAPIもこの2つだけなので必要十分だと思います。

では早速使ってみます。

OpenWeatherMapのAPIを使ってみる

APIキーの取得

OpenWeatherMapのAPIを使うにはAPIキーが必要になるのではじめにサインアップする必要があります。サインアップはMembers - OpenWeatherMapユーザー名,メールアドレス,パスワードを入力して確認事項をチェックすれば登録は完了です。

登録完了メールが届いてメールアドレスの存在確認を行った後にOpenWeatherMapのサイトにサインインし、API keysのページへ移動するとAPIキーが表示されますのでこれをコピーしておきます。

Current weather dataの取得

Current weather dataは20万以上の都市のデータをJSON,XML,HTMLで取得できます。

気象データを取得する場所は「緯度・軽度」か「都市名」で取得できます。コードは以下になります。

import requests
import json
import pprint

API_TOKEN = "APIキー"

if __name__ == "__main__":
    response = requests.get(
        "https://api.openweathermap.org/data/2.5/weather",
        params={
            ## 緯度・軽度を指定する場合
            # "lat": "35.68944",
            # "lon": "139.69167",

            ## 都市名で取得する場合
            "q": "tokyo",

            "appid": API_TOKEN,
            "units": "metric",
            "lang": "ja",
        },
    )
    ret = json.loads(response.text)
    pprint.pprint(ret)

実行結果

{'base': 'stations',
 'clouds': {'all': 0},
 'cod': 200,
 'coord': {'lat': 35.6895, 'lon': 139.6917},
 'dt': 1646876719,
 'id': 1850144,
 'main': {'feels_like': 9.32,
          'humidity': 43,
          'pressure': 1023,
          'temp': 11.04,
          'temp_max': 12.11,
          'temp_min': 9.75},
 'name': '東京都',
 'sys': {'country': 'JP',
         'id': 268395,
         'sunrise': 1646859599,
         'sunset': 1646901813,
         'type': 2},
 'timezone': 32400,
 'visibility': 10000,
 'weather': [{'description': '晴天', 'icon': '01d', 'id': 800, 'main': 'Clear'}],
 'wind': {'deg': 70, 'speed': 2.57}}

この様にJSON形式で簡単に気象データを取得できます。JSONなのでその後の使い勝手も良いです。

OpenWeatherMapのAPIをそのまま使ってみましたがOpenWeatherMapのドキュメントを読んでいるとOpenWeatherMapのAPIのラッパーのライブラリが見つかったのでこちらも使ってみます。

PyOWMとは

PyOWMとはOpenWeatherMapのAPIのラッパーライブラリです。OpenWeatherMapのAPIで取得できるデータをシンプルなオブジェクトモデルとして扱えます。

PyOWM is a client Python wrapper library for the OpenWeatherMap. It allows quick and easy consumption of OWM weather data (either observations and forecast) from Python applications via a simple object model.

PyOWMを使ってみる

PythonのPyPIなのでpipでインストールします。

$ pip install pyowm
$ pip list | grep pyowm
pyowm                          3.3.0

ではPyOWMを使ってPythonスクリプトを書いてみます。

from pyowm.owm import OWM
from pyowm.utils import formatting
from pyowm.utils.config import get_default_config

#  PyOWMのコンフィグ設定
config_dict = get_default_config()
config_dict["language"] = "ja" # 取得データの言語設定

# PyOWMライブラリの初期化
owm = OWM("APIキー", config_dict)
mgr = owm.weather_manager()

# 現在の気象データを取得
observation = mgr.weather_at_place("Tokyo,JP")

w = observation.weather
print("気象データの計測日次時間(unixTime): {}".format(w.ref_time))
print("気象データの計測日次時間(date): {}".format(formatting.to_date(w.ref_time)))
print("天気コード: {}".format(w.weather_code))
print("天気: {}".format(w.status))
print("天気詳細: {}".format(w.detailed_status))
print("気温(K): {}".format(w.temperature()))
print("気温(℃): {}".format(w.temperature("celsius")))
print("湿度(%): {}".format(w.humidity))
print("気圧(hPa): {}".format(w.barometric_pressure()))
print("風: {}".format(w.wind()))

print("雲量: {}".format(w.clouds))
print("雨量: {}".format(w.rain))
print("積雪量: {}".format(w.snow))

実行結果

気象データの計測日次時間(unixTime): 1646881943
気象データの計測日次時間(date): 2022-03-10 03:12:23+00:00
天気コード: 804
天気: Clouds
天気詳細: 厚い雲
気温(K): {'temp': 286.21, 'temp_max': 286.92, 'temp_min': 285.13, 'feels_like': 284.54, 'temp_kf': None}
気温(℃): {'temp': 13.06, 'temp_max': 13.77, 'temp_min': 11.98, 'feels_like': 11.39, 'temp_kf': None}
湿度(%): 37
気圧(hPa): {'press': 1022, 'sea_level': None}
風: {'speed': 0.89, 'deg': 220, 'gust': 2.68}
雲量: 100
雨量: {}
積雪量: {}

OpenWeatherMapのAPIを直接使うよりも簡単に気象データを取り扱うことができました。 緯度・軽度で気象データを取得するメソッドやOneCall dataのメソッドなど他の詳しい使い方はドキュメントに詳しく書かれていますので「PyOWM — pyowm documentation 」をご確認ください。

まとめ

OpenWeatherMapのAPIを使って気象データを取得してみました。全世界の気象データを簡単に取得できました。またPythonのラッパーライブラリのPyOWMを使うことでより簡単に気象データを取得できます。

最後まで読んで頂いてありがとうございました。