OpenWeather使ってみた
前説
基本的な機能が無料で使える天気予報プラットフォームとしては有名どころのOpenWeather。独習のために使ってみました。
※2023年1月時点の内容です。
プランの確認
利用条件を確認しますと、
- 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.
十分と思いますので、安心してFree
のGet API key
を押してみます。
アカウントの作成
Get API key
を押すと、アカウントの作成が始まります。
下3つのチェックはよくある「お便りを受け取りますか?」というやつのようです。
I consent to receive communications from OpenWeather Group of Companies and their partners:
OpenWeather Group of Companies およびそのパートナーからの通信を受け取ることに同意します。
もろもろ入力し、ロボットではないこともチェックして証明したらCreate Account
をクリックします。
Create Account
をクリックするとAPIの利用目的を聞かれますので、選択肢から選んで回答します。
私の場合は完全に独習目的でしたので、Education/Science
としました。
Save
をクリックすると、下のようなメールが届きます。
Verify your email
をクリックしてメールを認証するとOpenWeatherの画面が開き、メールが認証された旨のメッセージが表示されます。
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
というボタンがあるので、
任意のkey名を入力してGenerate
を押してみます。
新しいkeyが追加されました。(key名にはpractice-use
と入力してみました)
APIを実行してみる - Current weather -
今回選択しているFree PlanではCurrent weather
と3-hour Forecast 5 days
が使えるはずです。
とりあえずCurrent weather
を試してみます。
- 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 Weather
APIの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