@suzu6

主にWEBと解析の技術について書きます。

広く浅くも続ければ深くなるはず。

【Python】OpenWeatherMapで都市名から気象情報を取得する

OpenWeatherMapは無料で気象情報を取得できる便利なAPIです。 緯度経度と郵便番号からも取得できますが登録している箇所は多くないため、 個人的には都市名で指定することをお勧めします。

OpenWeatherMapの概要とPythonで現在の気象情報を取得するまでの方法についてまとめました。

OpenWeatherMapについて

owm

https://openweathermap.org/

OpenWeatherMapは世界中の気象情報を取得できるAPIを公開しています。 2014年に設立したOpenweather Ltd.が運営しています。 気象・予報データと衛星画像の配信をしており、機械学習のAPIも公開予定だそうです。

無料で使えるAPI

呼び出し回数が60回/分までなら以下のAPIが利用できます。

API 概要 取得できる形式
Current weather API 現在の気象情報を取得 JSON, XML, HTML
5 days/3 hour forecast API 3時間毎5日分の予報をまとめて取得 JSON, XML
Weather maps 1.0 降水量、雲、気圧、気温など、さまざまな種類の天気図を取得 PNG
UV index 過去、現在、予報の紫外線指数を取得 JSON
Weather alerts 気象条件にトリガーを設け、アラートか確認できる JSON

Price(2019年01月現在)

補足

  • Current weather APIでは都市IDをまとめて20箇所取得できたりします。3回分のAPI呼び出しとしてカウントされるのでお得。
  • Weather maps 1.0は、Open Layers, Leaflet, GoogleMapへの適用方法も載っている。

それぞれ詳細はAPIのドキュメントをご確認下さい。

登録されている観測点

登録されている観測点はこちらの地図から確認できます。 日本近郊を表示するようクエリパラメータを設定してあります。

map-JP

基本的にここにあるマーカーの都市の気象情報を取得できます。 全ての観測点を知りたい方は、http://bulk.openweathermap.org/sample/city.list.json.gzを解凍して確認できます。

APIのクエリパラメータに都市名(name)、都市ID(id)、緯度経度(coord)、郵便番号と国コード(zip)のどれかを渡してGETすると、その観測点の情報を取得できます。 緯度経度と郵便番号で該当しない場合は、近くの観測点の情報が得られるそうですが、 地図で位置を確認してから都市名を使って取得することをお勧めします。

日本には1403の観測点がある。

アカウントの登録

メニューのSign Upからアカウントを登録してAPIキーを取得する。 登録後すぐにAPIキーが出るのでそれを保存しておく。

現在の気象情報を取得する

Current weather APIを利用して気象情報を取得してみます。

http://api.openweathermap.org/data/2.5/weather?units=metric&q={city}&APPID={key}

上記のURLの{city}に都市名、{key}にAPIキーを置き換えて確かめてみます。 units=metricは温度の単位を摂氏にしています(デフォルトはケルビン温度)。

api-test

ブラウザで確認ました。 Sapporoの現在の気象情報が返ってきました。

プログラムで取得する

ここまで確認できたので、Pythonを使って現在の気象情報を取得するプログラムを作成します。

環境の用意

  • 環境:Python3.7
  • モジュール:json, requests

HTTPライブラリのrequestsを利用します。 jsonは標準モジュールですが、requestsは(ない場合)インストールが必要です。 以下のコマンドでインストールしてください。

pip install requests

ソースコード

以下のようなソースコードで気象情報を取得できます。

"""
OpenWeatherMapから現在の気象データを取得して表示する。
"""

import requests
import json

def get_current_weather(city_name):
    API_KEY = "xxxxxxxxxxxxxxxxxxxxxxxxx"  # xxxに自分のAPI Keyを入力。
    api = "http://api.openweathermap.org/data/2.5/weather?units=metric&q={city}&APPID={key}"

    url = api.format(city=city_name, key=API_KEY)

    # 気象情報を取得
    response = requests.get(url).json()
    # APIレスポンスの表示
    jsonText = json.dumps(response, indent=2)
    print(jsonText)

    return response


if __name__ == "__main__":
    # 都市を指定する。
    city_name = 'Sapporo'
    response = get_current_weather(city_name)

取得したデータ。 // コメントは項目の説明として追加しています。

{
  "coord": {  // 緯度経度
    "lon": 141.34,
    "lat": 43.04
  },
  "weather": [
    {
      "id": 803,
      "main": "Clouds",
      "description": "broken clouds",
      "icon": "04n"
    }
  ],
  "base": "stations",
  "main": {
    "temp": -2.48,   // 温度
    "pressure": 1022, // 気圧
    "humidity": 63,   // 湿度
    "temp_min": -3,
    "temp_max": -2
  },
  "visibility": 10000,
  "wind": {
    "speed": 7.2,    // 風速
    "deg": 320       // 風向
  },
  "clouds": {
    "all": 75       // 雲の割合 %
  },
  "dt": 1548756000, // unix時間
  "sys": {
    "type": 1,
    "id": 7980,
    "message": 0.0063,
    "country": "JP",
    "sunrise": 1548712392, // 日の出時刻
    "sunset": 1548747762   // 日の入時刻
  },
  "id": 2130404,
  "name": "Sapporo",
  "cod": 200
}

おわりに

今回、作ってみたいサービスが浮かんだので、気象情報を簡単に取得できるOpenWeatherMapを試してみました。

このように気象情報を取得すれば、例えば整形してデータベースに貯めたり、Slackに投げたりと応用できると思います。 ビッグデータやAIなど叫ばれていますが気象データを分析に活用している企業は1.3%(平成27年度)と まだまだ伸び代が大きな分野です。 OpenWeatherMapを使って気象データの活用をどんどん試してみて下さい。