LoginSignup
2
2

やりたいこと

無料のもので天気情報を取得したい
気象庁が非公式(?)でAPIを公開しており、JSON形式のデータが取得できる
使い方の備忘録として残しておく

Step1.予報エリアの取得

気象庁の天気は、(北海道などの例外はあるが)県ごとにエリア管理されている

取得URL

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

実行結果

{
   "centers":{
        :(中略)
    ,"010700":{
       "name":"中国地方(山口県を除く)"
      ,"enName":"Chugoku (Excluding Yamaguchi)"
      ,"officeName":"広島地方気象台"
      ,"children":[
         "310000"
        ,"320000"
        ,"330000"
        ,"340000"
      ]
        :(中略)
    }
  ,"offices":{
        :(中略)
    ,"340000":{
       "name":"広島県"
      ,"enName":"Hiroshima"
      ,"officeName":"広島地方気象台"
      ,"parent":"010700"
      ,"children":[
         "340010"
        ,"340020"
      ]
    }
  }
}

解説

  1. centers要素:関東地方、中国地方という単位でのエリア定義。children子要素に、中国地方に所属する県のエリアコードが記載されている。
  2. offices要素:県単位でのエリア定義。children子要素で、更に北部地区や南部地区、場合によっては地区の区分けが無いパターンもある。このoffices要素のコード、広島県であれば「340000」というエリアコードで天気情報を取得する

Step2.指定エリアの天気情報を取得

取得URL(広島県の例)

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

実行結果

長くなるため、南部地方、広島市内のデータをピックアップ
なお取得値は、気象庁の天気予報(広島県)と原則同値となることが確認できる

[
  {
     "publishingOffice":"広島地方気象台"
    ,"reportDatetime":"2024-01-31T05:00:00+09:00"
    ,"timeSeries":[
      {
         "timeDefines":[
           "2024-01-31T05:00:00+09:00"
          ,"2024-02-01T00:00:00+09:00"
        ]
        ,"areas":[
          {
             "area":{
               "name":"南部"
              ,"code":"340010"
            }
            ,"weatherCodes":[
               "202"
              ,"218"
            ]
            ,"weathers":[
               "くもり 昼過ぎ 一時 雨"
              ,"くもり 夜遅く 雨か雪"
            ]
            ,"winds":[
               "北の風 日中 南西の風"
              ,"北の風 後 北東の風 海上 では 後 北東の風 やや強く"
            ]
            ,"waves":[
               "0.5メートル"
              ,"0.5メートル 後 1メートル"
            ]
          }
            :(中略)
      }
      ,{
         "timeDefines":[
           "2024-01-31T06:00:00+09:00"
          ,"2024-01-31T12:00:00+09:00"
          ,"2024-01-31T18:00:00+09:00"
          ,"2024-02-01T00:00:00+09:00"
          ,"2024-02-01T06:00:00+09:00"
          ,"2024-02-01T12:00:00+09:00"
          ,"2024-02-01T18:00:00+09:00"
        ]
        ,"areas":[
          {
             "area":{
               "name":"南部"
              ,"code":"340010"
            }
            ,"pops":[
               "30"
              ,"50"
              ,"20"
              ,"20"
              ,"20"
              ,"20"
              ,"50"
            ]
          }
            :(中略)
          }
        ]
      }
      ,{
         "timeDefines":[
           "2024-01-31T09:00:00+09:00"
          ,"2024-01-31T00:00:00+09:00"
          ,"2024-02-01T00:00:00+09:00"
          ,"2024-02-01T09:00:00+09:00"
        ]
        ,"areas":[
          {
             "area":{
               "name":"広島"
              ,"code":"67437"
            }
            ,"temps":[
               "12"
              ,"12"
              ,"7"
              ,"13"
            ]
          }
            :(中略)
          }
        ]
      }
    ]
  }
  ,{
     "publishingOffice":"広島地方気象台"
    ,"reportDatetime":"2024-01-30T17:00:00+09:00"
    ,"timeSeries":[
      {
         "timeDefines":[
           "2024-01-31T00:00:00+09:00"
          ,"2024-02-01T00:00:00+09:00"
          ,"2024-02-02T00:00:00+09:00"
          ,"2024-02-03T00:00:00+09:00"
          ,"2024-02-04T00:00:00+09:00"
          ,"2024-02-05T00:00:00+09:00"
          ,"2024-02-06T00:00:00+09:00"
        ]
        ,"areas":[
          {
             "area":{
               "name":"南部"
              ,"code":"340010"
            }
            ,"weatherCodes":[
               "212"
              ,"203"
              ,"201"
              ,"201"
              ,"200"
              ,"203"
              ,"200"
            ]
            ,"pops":[
               ""
              ,"80"
              ,"20"
              ,"20"
              ,"40"
              ,"80"
              ,"30"
            ]
            ,"reliabilities":[
               ""
              ,""
              ,"A"
              ,"A"
              ,"C"
              ,"B"
              ,"B"
            ]
          }
            :(中略)
        ]
      }
      ,{
         "timeDefines":[
           "2024-01-31T00:00:00+09:00"
          ,"2024-02-01T00:00:00+09:00"
          ,"2024-02-02T00:00:00+09:00"
          ,"2024-02-03T00:00:00+09:00"
          ,"2024-02-04T00:00:00+09:00"
          ,"2024-02-05T00:00:00+09:00"
          ,"2024-02-06T00:00:00+09:00"
        ]
        ,"areas":[
          {
             "area":{
               "name":"広島"
              ,"code":"67437"
            }
            ,"tempsMin":[
               ""
              ,"5"
              ,"3"
              ,"1"
              ,"2"
              ,"4"
              ,"6"
            ]
            ,"tempsMinUpper":[
               ""
              ,"8"
              ,"6"
              ,"5"
              ,"5"
              ,"6"
              ,"9"
            ]
            ,"tempsMinLower":[
               ""
              ,"4"
              ,"2"
              ,"0"
              ,"1"
              ,"2"
              ,"2"
            ]
            ,"tempsMax":[
               ""
              ,"12"
              ,"11"
              ,"11"
              ,"9"
              ,"12"
              ,"14"
            ]
            ,"tempsMaxUpper":[
               ""
              ,"15"
              ,"13"
              ,"12"
              ,"13"
              ,"16"
              ,"16"
            ]
            ,"tempsMaxLower":[
               ""
              ,"11"
              ,"9"
              ,"8"
              ,"6"
              ,"8"
              ,"11"
            ]
          }
            :(中略)
        ]
      }
    ]
    ,"tempAverage":{
       "areas":[
        {
           "area":{
             "name":"広島"
            ,"code":"67437"
          }
          ,"min":"1.6"
          ,"max":"9.8"
        }
            :(中略)
      ]
    }

    ,"precipAverage":{
       "areas":[
        {
           "area":{
             "name":"広島"
            ,"code":"67437"
          }
          ,"min":"2.6"
          ,"max":"14.0"
        }
            :(中略)
    }
  }
]

解説

階層1 階層2 階層3 階層4 階層5 概要
1要素目 publishingOffice 観測した気象台名
reportDatetime 観測日時
timeSeries 天気情報(今日明日)
timeDefines 今日・明日天気の予想日時
取得時間によっては、今日、明日、明後日の3日分
areas 予測エリア群
areas 予測エリア(地区単位)
name 予測エリア名称
code エリアコード
weatherCodes 天気コード
[100(晴)][200(曇り)]などをコード体系化
weathers 天気情報の説明
winds 風情報の説明
waves 波情報の説明
timeDefines 日時毎の降水確率
areas 予測エリア群
area 予測エリア(地区単位)
name 予測エリア名称
code エリアコード
pops 降水確率(%)
timeDefines 日時毎の気温
areas 予測エリア群
area 予測エリア(地区単位)
name 予測エリア名称
code エリアコード
temps 予想気温(℃)
2要素目 publishingOffice 観測した気象台名
reportDatetime 観測日時
timeSeries 天気情報(週間)
timeDefines 日時毎の降水確率
areas 予測エリア群
area 予測エリア(地区単位)
name 予測エリア名称
code エリアコード
weatherCodes 天気コード
pops 降水確率(%)
今日・明日の情報が欠損する場合もあるため、補完が必要
reliabilities 信頼度
timeDefines 日時毎の気温
areas 予測エリア群
area 予測エリア(地区単位)
name 予測エリア名称
code エリアコード
tempsMin 最低気温(平均)
降水確率と同様欠損有り
tempsMinUpper 最低気温(上限)
tempsMinを利用でよいと思われる
tempsMinLower 最低気温(下限)
tempsMinを利用でよいと思われる
tempsMax 最高気温(平均)
降水確率と同様欠損有り
tempsMaxUpper 最高気温(上限)
tempsMaxを利用でよいと思われる
tempsMaxLower 最高気温(下限)
tempsMaxを利用でよいと思われる
tempAverage 平均気温
areas 予測エリア群
area 予測エリア(地区単位)
name 予測エリア名称
code エリアコード
min 最低気温(平均値)
max 最高気温(平均値)
precipAverage 向こう一週間(明日から7日先まで)の平年値(降水量)
areas 予測エリア群
area 予測エリア(地区単位)
name 予測エリア名称
code エリアコード
min 最低降水量(平均値)
max 最高降水量(平均値)

Step3.天気コードの一覧

気象庁の天気予報を開く。
開発者ツール(ChromeならF12)を起動。
コンソールに以下のコマンドを手入力しEnterで実行する

実行コマンド

Forecast.Const.TELOPS

実行結果

telops.gif

解説

  1. 各天気コードの説明が表記される(例.[100]は晴れ)
  2. 昼夜のコード対比表が表示される(例.晴れ:昼[100]、夜[500])
  3. 一部コードの置換先の天気コードが表示される(例.[103]の曇り時々雨は、[102]晴一時雨と同じ天気アイコンを使用する など

Step4.天気アイコン(SVG)の取得

天気のアイコンまで取得ができてしまう。
気象庁は至れり尽くせるな気がする。

実行URL

1個づつだが、晴[天気コード:100]を取得する場合は、以下をブラウザで実行すればSVGが表示されるので、ダウンロードを行う
https://www.jma.go.jp/bosai/forecast/img/100.svg

最後に

  • 気象庁の予報は、気象庁の予想日時によってデータ構成が異なる場合があるので、対象地区の天気予報(JSON)を1日分以上、取得した方が良いと思う
  • データ構成は原則同じだが、予想している気象台によっては異なるケースがあるっぽい(どこの地域かは忘れた…)
  • 災害時など、通常時の予想と異なるデータ構造になる可能性がある模様
2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2