Amazonのアソシエイトとして、ラズパイダ(raspida.com)は適格販売により収入を得ています。詳しくは当サイトの プライバシーポリシーをご覧ください。

プログラミングは見様見真似しかできない非エンジニアのラズパイダです。しかし、ネットにはたくさんのコードがアップされています。

今回、気象庁の天気APIを使うのにとても良いプログラミングコードがありましたので、習作として利用させてもらいました。

Raspberry Pi OSならPythonがそのまま動く環境が整っています。pyファイルを作成してコピペし実行するだけです。今回は表示するのにGUIのウィンドウを簡単に表示できるguizeroを使ってみました。

私と同じようにプログラムをイチから書けない人でも分かりやすく、実行した結果も実用的なプログラミングです。Raspberry Pi をお持ちなら、習うより慣れろでトライしてみてください。

天気予報のAPI

天気・気象関係のAPIはたくさんあります。多くは商用向けであり、無料で使える範囲は制限がある場合がほとんどです。 個人で利用するには無料範囲でも充分なので、どの天気APIサービスでも良いでしょう。

例えば、「OpenWeatherのLocationIDを調べる方法」でお伝えしたように、OpenWeatherは良かったですね。

APIでデータを取得するとjson形式で返答があります。これを好きなように表示すればいい。

プログラミング初心者でもAPI利用であれば、それなりに楽しめると思っています。少なくても、私は非エンジニアですけど、そこまで難しくは感じませんでした。

プログラミング言語はいくつもありますが、Raspberry Pi OSならPython環境が整っているのでPythonがオススメです。

APIの使用例でもPythonコードがたくさんネットで見つかるでしょう。

気象庁のAPIは非公開?

検索していて知ったのは、気象庁のAPIが使えることです。日本人なら助かりますよね。

公式には公開をリリースしているわけではないとのことで、気象庁のページでもそれらしい記述は見つかりませんでした。

実際に呼び出せるわけで、個人で試す分には問題無さそうですね。

Rグリーン Rグリーン
詳しい情報があれば教えてください。

気象庁のJSONファイル

利用したいデータは、json形式のファイルを読むと分かります。

ブラウザでURLを叩いても表示されます。(ブラウザによっては文字化けする場合もあります)

https://www.jma.go.jp/bosai/forecast/data/forecast/130000.json

気象庁のJSONファイルでは、この130000.jsonというのが地域コードです。6桁の数字「130000」は東京都です。

ザックリ言うと、〜地方、都道府県、地域、市町村、観測所などのコードが割り当てられていますね。

jsonデータは、VSCodeやVSCodiumで表示させて、フォーマット(整形)させると読みやすく表示してくれます。(右クリックして「ドキュメントのフォーマット」など)

VSCodium(VSCode)画面

もし、jsonをローカルで読みたいなら、wgetコマンドでダウンロードしてみましょう。

Raspberry Pi OSなら、jsonファイルはデフォルトでGeanyで開きます。

wget https://www.jma.go.jp/bosai/forecast/data/forecast/130000.json

Geanyでも少しは入れ子の構造は分かりやすいと思います。

Geanyで表示したjsonファイル

同じく気象庁の気象エリアの一覧。

wget https://www.jma.go.jp/bosai/common/const/area.json

APIを利用するのにダウンロードは必要ありません。 番号を知りたい、json形式を確認したい場合にダウンロードしてみましょう。

■Pi 5は8GBモデルがオススメ

実際に試してみる

これを参考にというか、そのまま利用させてもらいました。プログラミングコードもシンプルで分かりやすいです。助かります。ありがとうございます。

Qiita

【Python】気象庁API から天気予報を取得してみた - Qiita 初めに ダッシュボード作成のために、天気予報をAPIにて取得する。 1年くらい前の気象庁のHPが大幅リニューアルし、非公式ながらAPIが発見された。そのAPIを用い「天気予報…

そのままだとエラーが出ます。Line12と18。恐らくjsonのデータ構造が少し変わったのでしょう。取りあえず、コメントアウトして実行してみます。(降水確率は恐らくpops)

# -*- coding:utf-8 -*-
import requests
import json

# 気象庁データの取得
jma_url = "https://www.jma.go.jp/bosai/forecast/data/forecast/130000.json"
jma_json = requests.get(jma_url).json()

# 取得したいデータを選ぶ
jma_date = jma_json[0]["timeSeries"][0]["timeDefines"][0]
jma_weather = jma_json[0]["timeSeries"][0]["areas"][0]["weathers"][0]
#jma_rainfall = jma_json["Feature"][0]["Property"]["WeatherList"]["Weather"][0]["Rainfall"]
# 全角スペースの削除
jma_weather = jma_weather.replace(' ', '')

print(jma_date)
print(jma_weather)
#print(jma_rainfall)

実行すると、発表時刻と天気予報がターミナルに出力されますね。

データを指定している[“timeSeries”][0][“areas”][0][“weathers”][0]の部分は、階層の入れ子になっていて、任意のデータを指定すればOKです。

例えば、VSCodeならクリックした位置が上部にアドレスみたいに表示されます。これは分かりやすいです。

画像では、東京地方の一番の天気データは、下線を引いたものと分かります。

VSCode画面でデータの順番を知る

データ取得で、ご自身の都道府県にするには、エリアコードを知らないなりません。

先程のエリアコード.jsonファイルで検索してみてください。6桁の数字で、130000みたいに都道府県は最後が000になっているかと思います。

表示をウィンドウにするためguizeroをインストール

最後に、Print文ではなく、guizeroを使ってウィンドウに表示させるだけでそれらしくなります。

guizeroは、aptパッケージにもあるのですけど、バージョンが新しいpip版をインストールして使いました。(pip版1.4.0 apt版1.1.1)

sudo pip3 install guizero

guizeroで表示する基本コードは、次のような感じ。

from guizero import App, Text, PushButton

app =App(title="天気予報", width=400, height=100)
A_msg = Text(app, text="")
B_msg = Text(app, text="")

app.display()

app = App()でウインドウを定義して、app.display()で表示する形です。

習作にguizeroを付け足した

guizeroのAppとTextを読み込んで、コードの最後に追記しただけです。

天気ウィジェット

# -*- coding:utf-8 -*-
import requests
import json
from guizero import App, Text

# 気象庁データの取得
jma_url = "https://www.jma.go.jp/bosai/forecast/data/forecast/130000.json"
jma_json = requests.get(jma_url).json()

# 取得したいデータを選ぶ
jma_date = jma_json[0]["timeSeries"][0]["timeDefines"][0]
jma_weather = jma_json[0]["timeSeries"][0]["areas"][0]["weathers"][0]
#jma_rainfall = jma_json["Feature"][0]["Property"]["WeatherList"]["Weather"][0]["Rainfall"]
# 全角スペースの削除
jma_weather = jma_weather.replace(' ', '')

print(jma_date)
print(jma_weather)
#print(jma_rainfall)

# guizeroで表示
app =App(title="天気ウィジェット", width=400, height=100)
hinichi_msg = Text(app, text = jma_date + "の気象データ")
yoho_msg = Text(app, text = "本日の天気は、" + jma_weather + "です。")

app.display()

シンプルですが、これでデータを取得できウィジェット表示することができました。

返されるjsonデータを上手く指定すれば、自分専用のお天気予報ウィジェットが作れます。色々と試してみてください。

APIを叩くのをコールと言います。通常はコールに制限があります。非公開とはいえ、5分毎、1日3回としった常識的な範囲で利用しましょう。

参考書片手にレッツトライ!

Pythonのプログラムは比較的に簡単な部類といっても、非エンジニアなら難しく感じるものです。

プログラミングの参考書は自分が読みやすいと感じるのがベターです。

ロジック以前に、基本の書き方や書式を学びたいと痛感しますね。

各種公開データで遊ぶ

APIの他にも、気象庁をはじめ各種データを公開していることもあるので、個人で利用できるデータなら試してみたいですね。 特に地震のデータとか興味あります!

参考

気象庁 Japan Meteorological Agency App - guizero