天気予報の取得

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

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

#### 取得URL
[https://www.jma.go.jp/bosai/common/const/area.json](https://www.jma.go.jp/bosai/common/const/area.json)
#### 実行結果
~~~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子要素に、中国地方に所属する県のエリアコードが記載されている。
1. offices要素：県単位でのエリア定義。children子要素で、更に北部地区や南部地区、場合によっては地区の区分けが無いパターンもある。このoffices要素のコード、広島県であれば「340000」というエリアコードで天気情報を取得する
## Step2．指定エリアの天気情報を取得
#### 取得URL（広島県の例）
[https://www.jma.go.jp/bosai/forecast/data/forecast/340000.json](https://www.jma.go.jp/bosai/forecast/data/forecast/340000.json)
#### 実行結果
長くなるため、南部地方、広島市内のデータをピックアップ
なお取得値は、気象庁の[天気予報（広島県）](https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=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":[
               "０．５メートル"
              ,"０．５メートル　後　１メートル"
            ]
          }
            :（中略）
      }
      ,{
         "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"
        }
            :（中略）
    }
  }
]
~~~~
#### 解説
|階層１|階層２|階層３|階層４|階層５|概要|
|---|---|---|---|---|---|
|１要素目|publishingOffice||||観測した気象台名|
||reportDatetime||||観測日時|
||timeSeries||||天気情報（今日明日）|
|||timeDefines|||今日・明日天気の予想日時<br>取得時間によっては、今日、明日、明後日の3日分|
|||areas|||予測エリア群|
||||areas||予測エリア（地区単位）|
|||||name|予測エリア名称|
|||||code|エリアコード|
||||weatherCodes||天気コード<br>[100(晴)][200(曇り)]などをコード体系化|
||||weathers||天気情報の説明|
||||winds||風情報の説明|
||||waves||波情報の説明|
|||timeDefines|||日時毎の降水確率|
|||areas|||予測エリア群|
||||area||予測エリア（地区単位）|
|||||name|予測エリア名称|
|||||code|エリアコード|
||||pops||降水確率（％）|
|||timeDefines|||日時毎の気温|
|||areas|||予測エリア群|
||||area||予測エリア（地区単位）|
|||||name|予測エリア名称|
|||||code|エリアコード|
||||temps||予想気温（℃）|
|２要素目|publishingOffice||||観測した気象台名|
||reportDatetime||||観測日時|
||timeSeries||||天気情報（週間）|
|||timeDefines|||日時毎の降水確率|
|||areas|||予測エリア群|
||||area||予測エリア（地区単位）|
|||||name|予測エリア名称|
|||||code|エリアコード|
||||weatherCodes||天気コード|
||||pops||降水確率（％）<br>今日・明日の情報が欠損する場合もあるため、補完が必要|
||||reliabilities||信頼度|
|||timeDefines|||日時毎の気温|
|||areas|||予測エリア群|
||||area||予測エリア（地区単位）|
|||||name|予測エリア名称|
|||||code|エリアコード|
||||tempsMin||最低気温（平均）<br>降水確率と同様欠損有り|
||||tempsMinUpper||最低気温（上限）<br>tempsMinを利用でよいと思われる|
||||tempsMinLower||最低気温（下限）<br>tempsMinを利用でよいと思われる|
||||tempsMax||最高気温（平均）<br>降水確率と同様欠損有り|
||||tempsMaxUpper||最高気温（上限）<br>tempsMaxを利用でよいと思われる|
||||tempsMaxLower||最高気温（下限）<br>tempsMaxを利用でよいと思われる|
||tempAverage||||平均気温|
|||areas|||予測エリア群|
||||area||予測エリア（地区単位）|
|||||name|予測エリア名称|
|||||code|エリアコード|
||||min||最低気温（平均値）|
||||max||最高気温（平均値）|
||precipAverage||||向こう一週間（明日から７日先まで）の平年値（降水量）|
|||areas|||予測エリア群|
||||area||予測エリア（地区単位）|
|||||name|予測エリア名称|
|||||code|エリアコード|
||||min||最低降水量（平均値）|
||||max||最高降水量（平均値）|

## Step3．天気コードの一覧
気象庁の[天気予報](https://www.jma.go.jp/bosai/forecast/)を開く。
開発者ツール（ChromeならF12）を起動。
コンソールに以下のコマンドを手入力しEnterで実行する
#### 実行コマンド
~~~
Forecast.Const.TELOPS
~~~~
#### 実行結果
![telops.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468893/360969bf-091a-0eea-f7dd-43f7c354e217.gif)
#### 解説
1. 各天気コードの説明が表記される（例.［100］は晴れ）
1. 昼夜のコード対比表が表示される（例.晴れ：昼［100］、夜［500］）
1. 一部コードの置換先の天気コードが表示される（例．［103］の曇り時々雨は、［102］晴一時雨と同じ天気アイコンを使用する など

## Step4．天気アイコン（SVG）の取得
天気のアイコンまで取得ができてしまう。
気象庁は至れり尽くせるな気がする。
#### 実行URL
1個づつだが、晴［天気コード：100］を取得する場合は、以下をブラウザで実行すればSVGが表示されるので、ダウンロードを行う
[https://www.jma.go.jp/bosai/forecast/img/100.svg](https://www.jma.go.jp/bosai/forecast/img/100.svg)

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