プログラミング雑記

天気のAPI - Weather Forecast APIを使えば大抵のことはできる

goke

個人開発から世界を変えるようなプロダクトづくりを目指しています

はじめに

Webサービスを作るときに天気情報を取ってきたいことがたまにあります。
僕が作った天気を教えてくれない天気サイト「ナニキテコ」も天気情報を扱っているのですが、どこからどうやって情報を持ってくればいいか少し悩みました。
結論としては今回紹介するWeather Forecast APIがとても便利です。

ところでAPIってなぜ提供しているのか?

急に横道にそれますが、各社が提供しているAPIってなんのために提供しているんでしょうね?
例えばxxxウォレットAPIとかの場合はそのウォレットを普及させるために必要不可欠なAPIだと思うのですが、gooが提供しているキーワード抽出APIなどはとても便利ですが、これを提供してgooになんのメリットがあるのだろう?と疑問に思います。
(Googleの場合はネットが盛り上がってくれればプラットフォーマーとして嬉しい、という特殊な思想の元提供していると思いますが)

何かご意見やご存じのことがある方はコメント欄で教えていただけるととても嬉しいです。

Weather Forecast API

このAPIは説明不要なほどシンプルなデータAPIで、パラメータを指定すればJSONで値を返してくれます。
パラメータに必須な要素としては緯度経度ですが、緯度経度はgeocoding.jpなどから取得することができます。ユーザーの位置を使いたい時はブラウザの位置情報を取得する方法もあります。

geocoding.jpで「東京駅」を検索した結果

ちなみに、緯度経度の表記方法には日本測地系と世界測地系があり、世界的に使われており現在日本でも使われているのは世界測地系なのでご注意ください。

緯度経度がわかれば、あとはどんなパラメータが欲しいかを指定するだけです。下記のURLでリクエストすると、

https://api.open-meteo.com/v1/forecast?latitude=38&longitude=139&hourly=apparent_temperature,weathercode&timeformat=unixtime&timezone=Asia%2FTokyo

下記のような結果を返却してくれます。

{"latitude":38.0,"longitude":139.0,"generationtime_ms":0.7700920104980469,"utc_offset_seconds":32400,"timezone":"Asia/Tokyo","timezone_abbreviation":"JST","elevation":0.0,"hourly_units":{"time":"unixtime","apparent_temperature":"°C","weathercode":"wmo code"},"hourly":{"time":[1668870000,1668873600,1668877200,1668880800,1668884400,1668888000,1668891600,1668895200,1668898800,1668902400,1668906000,1668909600,1668913200,1668916800,1668920400,1668924000,1668927600,1668931200,1668934800,1668938400,1668942000,1668945600,1668949200,1668952800,1668956400,1668960000,1668963600,1668967200,1668970800,1668974400,1668978000,1668981600,1668985200,1668988800,1668992400,1668996000,1668999600,1669003200,1669006800,1669010400,1669014000,1669017600,1669021200,1669024800,1669028400,1669032000,1669035600,1669039200,1669042800,1669046400,1669050000,1669053600,1669057200,1669060800,1669064400,1669068000,1669071600,1669075200,1669078800,1669082400,1669086000,1669089600,1669093200,1669096800,1669100400,1669104000,1669107600,1669111200,1669114800,1669118400,1669122000,1669125600,1669129200,1669132800,1669136400,1669140000,1669143600,1669147200,1669150800,1669154400,1669158000,1669161600,1669165200,1669168800,1669172400,1669176000,1669179600,1669183200,1669186800,1669190400,1669194000,1669197600,1669201200,1669204800,1669208400,1669212000,1669215600,1669219200,1669222800,1669226400,1669230000,1669233600,1669237200,1669240800,1669244400,1669248000,1669251600,1669255200,1669258800,1669262400,1669266000,1669269600,1669273200,1669276800,1669280400,1669284000,1669287600,1669291200,1669294800,1669298400,1669302000,1669305600,1669309200,1669312800,1669316400,1669320000,1669323600,1669327200,1669330800,1669334400,1669338000,1669341600,1669345200,1669348800,1669352400,1669356000,1669359600,1669363200,1669366800,1669370400,1669374000,1669377600,1669381200,1669384800,1669388400,1669392000,1669395600,1669399200,1669402800,1669406400,1669410000,1669413600,1669417200,1669420800,1669424400,1669428000,1669431600,1669435200,1669438800,1669442400,1669446000,1669449600,1669453200,1669456800,1669460400,1669464000,1669467600,1669471200],"apparent_temperature":[7.5,6.4,6.4,6.6,6.4,5.8,5.6,5.2,5.5,5.9,7.4,8.5,10.0,11.7,13.2,13.1,11.7,10.7,9.8,9.7,9.8,10.3,10.2,10.3,10.2,10.1,10.7,10.4,10.2,11.0,11.8,12.6,12.2,11.9,12.3,13.9,14.0,14.1,14.4,14.8,15.9,15.9,15.9,15.9,16.0,15.1,14.8,14.9,14.9,14.7,13.5,12.7,12.2,12.6,9.6,8.5,7.9,7.7,7.5,7.6,7.7,7.9,7.8,7.7,7.7,7.7,7.8,7.8,7.6,7.8,7.3,6.8,7.1,6.6,6.1,5.5,7.1,7.5,7.4,7.7,8.1,8.4,9.1,9.9,10.7,11.0,11.0,10.6,10.1,9.4,8.3,7.4,6.4,5.7,5.7,6.1,6.5,6.8,7.0,7.3,7.7,8.2,8.9,9.5,9.9,10.5,11.4,12.2,12.4,12.3,12.1,11.8,11.7,11.6,11.4,11.4,11.5,11.5,11.3,11.1,10.9,10.7,10.6,10.4,9.7,8.6,7.7,7.9,8.6,9.7,10.8,11.7,12.7,13.3,13.9,14.3,13.8,12.5,10.8,9.6,8.5,7.3,6.8,6.5,6.2,5.8,5.5,5.1,4.6,4.1,4.4,5.6,7.4,10.0,11.8,13.5,15.2,16.1,16.7,16.9,16.1,14.6,13.1,12.6,12.3,12.2,12.1,12.2],"weathercode":[3,3,3,2,3,3,3,3,2,3,3,3,2,3,2,2,2,3,3,3,61,61,61,61,61,61,61,61,61,3,3,45,2,1,1,1,2,1,1,1,1,1,1,1,1,1,2,2,2,3,2,1,3,3,45,2,2,3,61,80,80,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,61,3,3,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,61,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,45,45,45,1,1,1,2,2,2,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,3,3,3,2,2,2,2,2]}}

ユーザー登録等も必要ないのでめちゃめちゃお手軽ですね。

上のリクエストは指定した緯度経度の「体感温度」と「天気コード」を「時間ごと」に返してくれというリクエストです。
これらのパラメータはこちらのページで欲しいパラメータをポチポチ選ぶとURLを発行してくれます。

weather forecast apiのパラメータ指定方法

あとは例えばPHPであれば

$json = file_get_contents('https://api.open-meteo.com/v1/forecast?latitude=38&longitude=139&hourly=apparent_temperature,precipitation,weathercode,windspeed_10m&daily=apparent_temperature_max,apparent_temperature_min&windspeed_unit=ms&timeformat=unixtime&timezone=Asia%2FTokyo');
$data = json_decode($json, true);

などとやれば希望したパラメータを取得することができます。

  • この記事を書いた人

goke

個人開発から世界を変えるようなプロダクトづくりを目指しています

-プログラミング雑記