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

OpenWeatherで世界中の天気予報を知ることができます。データをRaspberry Piで取得するプログラムもみたことがあるでしょう。

このLocationIDって、すべて記載されたjsonファイルから探すことになるのですが、これが大きいファイルサイズで開いて検索するのに困ってしまいます。少なくても非エンジニアの私には困ったことでした。

もっと簡単に調べる方法があるのでご紹介します。

OpenWeatherの登録とAPIキー

無料登録(フリープラン)は制限があるもののAPIを使えます。

API KEYは、Pythonなどプログラミングで利用したり、MagicMirrorのモジュール等で設定することでお天気を表示できます。

登録はメールアドレスがあればOK。

API Keysとして文字列を取得できます。コピペして使ってください。

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

OpenweatherのLocationIDを知る2つの方法

都市名とともにLocationnIDを指定する箇所があります。このとき、公式サイトFAQにあるように、city.list.json.gzをダウンロードして解凍すると出てくるjsonファイルから、該当の都市とLocationnIDを探せます。

ダウンロード先

http://bulk.openweathermap.org/sample/city.list.json.gz

しかし、このjsonファイルがデカい! 41.7MBもある。

ファイルサイズが大きくて、テキストエディタで開いても、そこそこのPCでは検索がままなりません。超ストレスです。

そこで、2つの方法でLocationIDを調べてみました。

ターミナルでgrep検索

先ずは王道のテキスト検索です。

Raspberry Pi やMacならターミナルでgrepもできます。Windowsだとgrepは使えません。Findコマンド?になると思うので書式が異なります。ここでは触れません。

grepコマンドにオプションを付けて検索してみましょう。

実際のjsonデータは次のような書式になっています。

[
    {
        "id": 833,
        "name": "Ḩeşār-e Sefīd",
        "state": "",
        "country": "IR",
        "coord": {
            "lon": 47.159401,
            "lat": 34.330502
        }
    }

この中のnameが欲しい都市名で、その上にIDがあります。検索する文字列を"country": "JP"として探してみます。

"country": "JP"の前3行分が欲しいので、-B 3オプションを入れます。BはBeforeで数字は行数です。(ちなみにAfterもあって、その場合はAオプション)

grep -B 3 '"country": "JP"' city.list.json

これでターミナルに出力されたデータから見て探せます。

ただ、それでも行数がめちゃくちゃ多い。

別のテキストへ書き出しておきましょう。あとはテキストエディタで開くだけです。

grep -B 3 '"country": "JP"' city.list.json > city_list.txt

日本の都市は1,402箇所も登録されていました。これだけでも140KBです。

でも、このサイズならテキストファイルを開いて検索しても、アプリケーションの速度が遅くなることはないと思います。

この例で書き出したのは必要な部分だけですから、jsonファイルとしては使えません。

もしも都市名が正確に分かっていれば、例えば検索文字列の部分を'"name": "Hakodate"'等にすれば函館市がヒットします。

OpenweatherのAPIで知る

grep検索が王道かも知れませんけど、APIを呼び出す書式例の1つに都市名を指定するやり方があります。この方法を使ってIDも知ってしまおうという非エンジニア的なやり方です。

どうせOpenweatherに登録したのですから、早速使ってみよう!

http://api.openweathermap.org/data/2.5/weather?q=都市名&appid=キー&lang=ja&units=metric

この中の都市名クエリに探したい都市名を入れ、appidに登録したOpenweatherのMY API KEYを入れて、ブラウザのURL欄で実行してみてください。

例えば、先程の函館市なら都市名に「Hakodate」として実行します。appidも忘れずに入れます。

すると、次のように表示されます。

{"coord":{"lon":140.7367,"lat":41.7758},"weather":[{"id":801,"main":"Clouds","description":"薄い雲","icon":"02n"}],"base":"stations","main":{"temp":3.96,"feels_like":-0.17,"temp_min":3.96,"temp_max":3.96,"pressure":1015,"humidity":69,"sea_level":1015,"grnd_level":1015},"visibility":10000,"wind":{"speed":5.43,"deg":271,"gust":11.41},"clouds":{"all":11},"dt":1679235725,"sys":{"country":"JP","sunrise":1679172215,"sunset":1679215593},"timezone":32400,"id":2130188,"name":"函館市","cod":200}

最後の行に"id":2130188"とあるのが分かります。

どういった都市名で定義されているのか分からない場合、OpenWeatherのHPにあるMAPSから探すと良いですよ。(全部がjsonファイル同様に載っていない様子)

このようにして取得したjsonファイルから希望する値を表示できます。API利用の練習にもなります。

LocationIDが分からなかった

私のように非エンジニアなのにjsonファイルにあるからと言われてもねー。全部の都市、それも世界中なのでとても大きなjsonファイルで非力なマシンでは検索できなかった。

OpenWeatherで使う都市名のLocationIDが分からない人って、意外と結構いるのではないでしょうか。

少なくても私はサイズの大きなjsonファイルを開いても検索が出来なくて困りました。

grep検索はシンプルで速くて便利ですよ。


LINKS

https://openweathermap.org/weathermap