Monthly Archives: 2月 2022

2022-02-26

Emacsからアメダス観測所の計測データを取得する

前回の続き

一応任意のアメダス観測所の計測データを取得できるようにしてみました。あまり使う予定はありませんが。

misohena/el-jma: Emacs Interface for Japan Meteorological Agency Data

使い方。

まずはアメダスの観測所番号を調べます。 jma-amedas-read-amedas-code 関数で補完付きの入力ができるようになっているのでそれを使います。

(require 'jma-amedas)
(jma-amedas-read-amedas-code)

番号が分かったら jma-amedas-point-latest に渡すだけです。

(jma-amedas-point-latest ;;最新のデータを取得
 "44112");;八王子

結果は次のようになります。

(\20220226141000
 (prefNumber . 44)
 (observationNumber . 112)
 (temp .
       [12.6 0])
 (sun10m .
         [10 0])
 (sun1h .
        [1.0 0])
 (precipitation10m .
                   [0.0 0])
 (precipitation1h .
                  [0.0 0])
 (precipitation3h .
                  [0.0 0])
 (precipitation24h .
                   [0.0 0])
 (windDirection .
                [7 0])
 (wind .
       [8.8 0])
 (maxTempTime
  (hour . 4)
  (minute . 41))
 (maxTemp .
          [13.4 0])
 (minTempTime
  (hour . 20)
  (minute . 22))
 (minTemp .
          [-2.7 0])
 (gustTime
  (hour . 4)
  (minute . 58))
 (gustDirection .
                [8 0])
 (gust .
       [15.2 0]))

一応アクセッサがあるのでそれを使うと楽にデータを取り出せます。

(let* ((amedas-code "44112")
       (sample (jma-amedas-point-latest amedas-code)))
  (format "%sの%sの気温は%s℃、降水量(前1時間)は%smmです"
    (jma-amedas-point-name (jma-amedas-point amedas-code))
    (format-time-string "%Y-%m-%d %H:%M" (jma-amedas-sample-time sample))
    (or (jma-amedas-sample-temp sample) "-")
    (or (jma-amedas-sample-precipitation1h sample) "-")))
"八王子の2022-02-26 14:10の気温は12.6℃、降水量(前1時間)は0.0mmです"

取り出せる情報は設備の種類によって異なります(気象庁 | アメダスあたりを参照のこと)。

また、計測値の品質に問題がある場合はnilを返します。生データの配列(上の例だと(temp . [12.6 0])等)の二番目の要素が品質を示す値で、0のとき正常を意味します。

期間を指定して取得することも可能です。

(let* ((max-time (jma-amedas-latest-time))
       (min-time (time-add max-time (* -5 60 60))))
  (jma-amedas-point-samples-between "44112" min-time max-time))
((\20220226093000 (prefNumber . 44) (observationNumber . 112) (temp . [9.6 0]) (sun10m . [10 0]) (sun1h . [1.0 0]) (precipitation10m . [0.0 0]) (precipitation1h . [0.0 0]) (precipitation3h . [0.0 0]) (precipitation24h . [0.0 0]) (windDirection . [6 0]) (wind . [1.0 0]) (maxTempTime (hour . 0) (minute . 27)) (maxTemp . [9.7 0]) (minTempTime (hour . 20) (minute . 22)) (minTemp . [-2.7 0]) (gustTime (hour . 20) (minute . 31)) (gustDirection . [13 0]) (gust . [4.4 0]))
 (\20220226094000 (prefNumber . 44) (observationNumber . 112) (temp . [9.9 0]) (sun10m . [10 0]) (sun1h . [1.0 0]) (precipitation10m . [0.0 0]) (precipitation1h . [0.0 0]) (precipitation3h . [0.0 0]) (precipitation24h . [0.0 0]) (windDirection . [4 0]) (wind . [1.5 0]) (maxTempTime (hour . 0) (minute . 40)) (maxTemp . [9.9 0]) (minTempTime (hour . 20) (minute . 22)) (minTemp . [-2.7 0]) (gustTime (hour . 20) (minute . 31)) (gustDirection . [13 0]) (gust . [4.4 0]))
 (\20220226095000 (prefNumber . 44) (observationNumber . 112) (temp . [10.0 0]) (sun10m . [10 0]) (sun1h . [1.0 0]) (precipitation10m . [0.0 0]) (precipitation1h . [0.0 0]) (precipitation3h . [0.0 0]) (precipitation24h . [0.0 0]) (windDirection . [5 0]) (wind . [2.3 0]) (maxTempTime (hour . 0) (minute . 46)) (maxTemp . [10.3 0]) (minTempTime (hour . 20) (minute . 22)) (minTemp . [-2.7 0]) (gustTime (hour . 0) (minute . 50)) (gustDirection . [7 0]) (gust . [5.4 0]))
 (\20220226100000 (prefNumber . 44) (observationNumber . 112) (temp . [10.3 0]) (snow1h . [0 :null]) (snow6h . [0 :null]) (snow12h . [0 :null]) (snow24h . [0 :null]) (sun10m . [10 0]) (sun1h . [1.0 0]) (precipitation10m . [0.0 0]) (precipitation1h . [0.0 0]) (precipitation3h . [0.0 0]) (precipitation24h . [0.0 0]) (windDirection . [7 0]) (wind . [3.6 0]) (maxTempTime (hour . 0) (minute . 56)) (maxTemp . [10.8 0]) (minTempTime (hour . 20) (minute . 22)) (minTemp . [-2.7 0]) (gustTime (hour . 0) (minute . 58)) (gustDirection . [8 0]) (gust . [5.8 0]))
 (\20220226101000 (prefNumber . 44) (observationNumber . 112) (temp . [10.1 0]) (sun10m . [10 0]) (sun1h . [1.0 0]) (precipitation10m . [0.0 0]) (precipitation1h . [0.0 0]) (precipitation3h . [0.0 0]) (precipitation24h . [0.0 0]) (windDirection . [6 0]) (wind . [3.1 0]) (maxTempTime (hour . 0) (minute . 56)) (maxTemp . [10.8 0]) (minTempTime (hour . 20) (minute . 22)) (minTemp . [-2.7 0]) (gustTime (hour . 0) (minute . 58)) (gustDirection . [8 0]) (gust . [5.8 0]))
 (\20220226102000 (prefNumber . 44) (observationNumber . 112) (temp . [10.6 0]) (sun10m . [10 0]) (sun1h . [1.0 0]) (precipitation10m . [0.0 0]) (precipitation1h . [0.0 0]) (precipitation3h . [0.0 0]) (precipitation24h . [0.0 0]) (windDirection . [7 0]) (wind . [4.0 0]) (maxTempTime (hour . 1) (minute . 15)) (maxTemp . [10.9 0]) (minTempTime (hour . 20) (minute . 22)) (minTemp . [-2.7 0]) (gustTime (hour . 1) (minute . 13)) (gustDirection . [8 0]) (gust . [7.5 0]))
 (\20220226103000 (prefNumber . 44) (observationNumber . 112) (temp . [11.2 0]) (sun10m . [10 0]) (sun1h . [1.0 0]) (precipitation10m . [0.0 0]) (precipitation1h . [0.0 0]) (precipitation3h . [0.0 0]) (precipitation24h . [0.0 0]) (windDirection . [7 0]) (wind . [3.2 0]) (maxTempTime (hour . 1) (minute . 29)) (maxTemp . [11.4 0]) (minTempTime (hour . 20) (minute . 22)) (minTemp . [-2.7 0]) (gustTime (hour . 1) (minute . 13)) (gustDirection . [8 0]) (gust . [7.5 0]))
 (\20220226104000 (prefNumber . 44) (observationNumber . 112) (temp . [11.2 0]) (sun10m . [10 0]) (sun1h . [1.0 0]) (precipitation10m . [0.0 0]) (precipitation1h . [0.0 0]) (precipitation3h . [0.0 0]) (precipitation24h . [0.0 0]) (windDirection . [8 0]) (wind . [3.1 0]) (maxTempTime (hour . 1) (minute . 39)) (maxTemp . [11.7 0]) (minTempTime (hour . 20) (minute . 22)) (minTemp . [-2.7 0]) (gustTime (hour . 1) (minute . 13)) (gustDirection . [8 0]) (gust . [7.5 0]))
 (\20220226105000 (prefNumber . 44) (observationNumber . 112) (temp . [10.8 0]) (sun10m . [10 0]) (sun1h . [1.0 0]) (precipitation10m . [0.0 0]) (precipitation1h . [0.0 0]) (precipitation3h . [0.0 0]) (precipitation24h . [0.0 0]) (windDirection . [7 0]) (wind . [3.0 0]) (maxTempTime (hour . 1) (minute . 39)) (maxTemp . [11.7 0]) (minTempTime (hour . 20) (minute . 22)) (minTemp . [-2.7 0]) (gustTime (hour . 1) (minute . 13)) (gustDirection . [8 0]) (gust . [7.5 0]))
 (\20220226110000 (prefNumber . 44) (observationNumber . 112) (temp . [11.2 0]) (snow1h . [0 :null]) (snow6h . [0 :null]) (snow12h . [0 :null]) (snow24h . [0 :null]) (sun10m . [10 0]) (sun1h . [1.0 0]) (precipitation10m . [0.0 0]) (precipitation1h . [0.0 0]) (precipitation3h . [0.0 0]) (precipitation24h . [0.0 0]) (windDirection . [8 0]) (wind . [3.6 0]) (maxTempTime (hour . 1) (minute . 58)) (maxTemp . [11.8 0]) (minTempTime (hour . 20) (minute . 22)) (minTemp . [-2.7 0]) (gustTime (hour . 1) (minute . 13)) (gustDirection . [8 0]) (gust . [7.5 0]))
 (\20220226111000 (prefNumber . 44) (observationNumber . 112) (temp . [11.5 0]) (sun10m . [10 0]) (sun1h . [1.0 0]) (precipitation10m . [0.0 0]) (precipitation1h . [0.0 0]) (precipitation3h . [0.0 0]) (precipitation24h . [0.0 0]) (windDirection . [7 0]) (wind . [4.5 0]) (maxTempTime (hour . 1) (minute . 58)) (maxTemp . [11.8 0]) (minTempTime (hour . 20) (minute . 22)) (minTemp . [-2.7 0]) (gustTime (hour . 1) (minute . 13)) (gustDirection . [8 0]) (gust . [7.5 0]))
 (\20220226112000 (prefNumber . 44) (observationNumber . 112) (temp . [11.5 0]) (sun10m . [10 0]) (sun1h . [1.0 0]) (precipitation10m . [0.0 0]) (precipitation1h . [0.0 0]) (precipitation3h . [0.0 0]) (precipitation24h . [0.0 0]) (windDirection . [9 0]) (wind . [2.8 0]) (maxTempTime (hour . 2) (minute . 14)) (maxTemp . [12.3 0]) (minTempTime (hour . 20) (minute . 22)) (minTemp . [-2.7 0]) (gustTime (hour . 1) (minute . 13)) (gustDirection . [8 0]) (gust . [7.5 0]))
 (\20220226113000 (prefNumber . 44) (observationNumber . 112) (temp . [11.8 0]) (sun10m . [10 0]) (sun1h . [1.0 0]) (precipitation10m . [0.0 0]) (precipitation1h . [0.0 0]) (precipitation3h . [0.0 0]) (precipitation24h . [0.0 0]) (windDirection . [6 0]) (wind . [2.6 0]) (maxTempTime (hour . 2) (minute . 14)) (maxTemp . [12.3 0]) (minTempTime (hour . 20) (minute . 22)) (minTemp . [-2.7 0]) (gustTime (hour . 1) (minute . 13)) (gustDirection . [8 0]) (gust . [7.5 0]))
 (\20220226114000 (prefNumber . 44) (observationNumber . 112) (temp . [12.8 0]) (sun10m . [10 0]) (sun1h . [1.0 0]) (precipitation10m . [0.0 0]) (precipitation1h . [0.0 0]) (precipitation3h . [0.0 0]) (precipitation24h . [0.0 0]) (windDirection . [7 0]) (wind . [4.4 0]) (maxTempTime (hour . 2) (minute . 40)) (maxTemp . [12.9 0]) (minTempTime (hour . 20) (minute . 22)) (minTemp . [-2.7 0]) (gustTime (hour . 1) (minute . 13)) (gustDirection . [8 0]) (gust . [7.5 0]))
 (\20220226115000 (prefNumber . 44) (observationNumber . 112) (temp . [12.6 0]) (sun10m . [10 0]) (sun1h . [1.0 0]) (precipitation10m . [0.0 0]) (precipitation1h . [0.0 0]) (precipitation3h . [0.0 0]) (precipitation24h . [0.0 0]) (windDirection . [9 0]) (wind . [3.0 0]) (maxTempTime (hour . 2) (minute . 50)) (maxTemp . [12.9 0]) (minTempTime (hour . 20) (minute . 22)) (minTemp . [-2.7 0]) (gustTime (hour . 1) (minute . 13)) (gustDirection . [8 0]) (gust . [7.5 0]))
 (\20220226120000 (prefNumber . 44) (observationNumber . 112) (temp . [12.7 0]) (snow1h . [0 :null]) (snow6h . [0 :null]) (snow12h . [0 :null]) (snow24h . [0 :null]) (sun10m . [10 0]) (sun1h . [1.0 0]) (precipitation10m . [0.0 0]) (precipitation1h . [0.0 0]) (precipitation3h . [0.0 0]) (precipitation24h . [0.0 0]) (windDirection . [7 0]) (wind . [4.0 0]) (maxTempTime (hour . 2) (minute . 55)) (maxTemp . [13.0 0]) (minTempTime (hour . 20) (minute . 22)) (minTemp . [-2.7 0]) (gustTime (hour . 3) (minute . 0)) (gustDirection . [8 0]) (gust . [7.5 0]))
 (\20220226121000 (prefNumber . 44) (observationNumber . 112) (temp . [12.9 0]) (sun10m . [10 0]) (sun1h . [1.0 0]) (precipitation10m . [0.0 0]) (precipitation1h . [0.0 0]) (precipitation3h . [0.0 0]) (precipitation24h . [0.0 0]) (windDirection . [8 0]) (wind . [4.9 0]) (maxTempTime (hour . 3) (minute . 3)) (maxTemp . [13.1 0]) (minTempTime (hour . 20) (minute . 22)) (minTemp . [-2.7 0]) (gustTime (hour . 3) (minute . 6)) (gustDirection . [7 0]) (gust . [8.3 0]))
 (\20220226122000 (prefNumber . 44) (observationNumber . 112) (temp . [12.1 0]) (sun10m . [10 0]) (sun1h . [1.0 0]) (precipitation10m . [0.0 0]) (precipitation1h . [0.0 0]) (precipitation3h . [0.0 0]) (precipitation24h . [0.0 0]) (windDirection . [6 0]) (wind . [5.1 0]) (maxTempTime (hour . 3) (minute . 3)) (maxTemp . [13.1 0]) (minTempTime (hour . 20) (minute . 22)) (minTemp . [-2.7 0]) (gustTime (hour . 3) (minute . 6)) (gustDirection . [7 0]) (gust . [8.3 0]))
 (\20220226123000 (prefNumber . 44) (observationNumber . 112) (temp . [12.1 0]) (sun10m . [10 0]) (sun1h . [1.0 0]) (precipitation10m . [0.0 0]) (precipitation1h . [0.0 0]) (precipitation3h . [0.0 0]) (precipitation24h . [0.0 0]) (windDirection . [7 0]) (wind . [6.1 0]) (maxTempTime (hour . 3) (minute . 3)) (maxTemp . [13.1 0]) (minTempTime (hour . 20) (minute . 22)) (minTemp . [-2.7 0]) (gustTime (hour . 3) (minute . 21)) (gustDirection . [9 0]) (gust . [9.7 0]))
 (\20220226124000 (prefNumber . 44) (observationNumber . 112) (temp . [12.3 0]) (sun10m . [10 0]) (sun1h . [1.0 0]) (precipitation10m . [0.0 0]) (precipitation1h . [0.0 0]) (precipitation3h . [0.0 0]) (precipitation24h . [0.0 0]) (windDirection . [7 0]) (wind . [5.5 0]) (maxTempTime (hour . 3) (minute . 3)) (maxTemp . [13.1 0]) (minTempTime (hour . 20) (minute . 22)) (minTemp . [-2.7 0]) (gustTime (hour . 3) (minute . 21)) (gustDirection . [9 0]) (gust . [9.7 0]))
 (\20220226125000 (prefNumber . 44) (observationNumber . 112) (temp . [12.8 0]) (sun10m . [10 0]) (sun1h . [1.0 0]) (precipitation10m . [0.0 0]) (precipitation1h . [0.0 0]) (precipitation3h . [0.0 0]) (precipitation24h . [0.0 0]) (windDirection . [7 0]) (wind . [6.8 0]) (maxTempTime (hour . 3) (minute . 3)) (maxTemp . [13.1 0]) (minTempTime (hour . 20) (minute . 22)) (minTemp . [-2.7 0]) (gustTime (hour . 3) (minute . 21)) (gustDirection . [9 0]) (gust . [9.7 0]))
 (\20220226130000 (prefNumber . 44) (observationNumber . 112) (temp . [12.5 0]) (snow1h . [0 :null]) (snow6h . [0 :null]) (snow12h . [0 :null]) (snow24h . [0 :null]) (sun10m . [10 0]) (sun1h . [1.0 0]) (precipitation10m . [0.0 0]) (precipitation1h . [0.0 0]) (precipitation3h . [0.0 0]) (precipitation24h . [0.0 0]) (windDirection . [7 0]) (wind . [7.3 0]) (maxTempTime (hour . 3) (minute . 55)) (maxTemp . [13.3 0]) (minTempTime (hour . 20) (minute . 22)) (minTemp . [-2.7 0]) (gustTime (hour . 3) (minute . 58)) (gustDirection . [7 0]) (gust . [10.1 0]))
 (\20220226131000 (prefNumber . 44) (observationNumber . 112) (temp . [12.8 0]) (sun10m . [10 0]) (sun1h . [1.0 0]) (precipitation10m . [0.0 0]) (precipitation1h . [0.0 0]) (precipitation3h . [0.0 0]) (precipitation24h . [0.0 0]) (windDirection . [7 0]) (wind . [6.6 0]) (maxTempTime (hour . 3) (minute . 55)) (maxTemp . [13.3 0]) (minTempTime (hour . 20) (minute . 22)) (minTemp . [-2.7 0]) (gustTime (hour . 4) (minute . 7)) (gustDirection . [8 0]) (gust . [10.6 0]))
 (\20220226132000 (prefNumber . 44) (observationNumber . 112) (temp . [12.7 0]) (sun10m . [10 0]) (sun1h . [1.0 0]) (precipitation10m . [0.0 0]) (precipitation1h . [0.0 0]) (precipitation3h . [0.0 0]) (precipitation24h . [0.0 0]) (windDirection . [7 0]) (wind . [6.9 0]) (maxTempTime (hour . 3) (minute . 55)) (maxTemp . [13.3 0]) (minTempTime (hour . 20) (minute . 22)) (minTemp . [-2.7 0]) (gustTime (hour . 4) (minute . 20)) (gustDirection . [8 0]) (gust . [10.9 0]))
 (\20220226133000 (prefNumber . 44) (observationNumber . 112) (temp . [12.6 0]) (sun10m . [10 0]) (sun1h . [1.0 0]) (precipitation10m . [0.0 0]) (precipitation1h . [0.0 0]) (precipitation3h . [0.0 0]) (precipitation24h . [0.0 0]) (windDirection . [7 0]) (wind . [8.0 0]) (maxTempTime (hour . 3) (minute . 55)) (maxTemp . [13.3 0]) (minTempTime (hour . 20) (minute . 22)) (minTemp . [-2.7 0]) (gustTime (hour . 4) (minute . 28)) (gustDirection . [8 0]) (gust . [12.5 0]))
 (\20220226134000 (prefNumber . 44) (observationNumber . 112) (temp . [12.9 0]) (sun10m . [10 0]) (sun1h . [1.0 0]) (precipitation10m . [0.0 0]) (precipitation1h . [0.0 0]) (precipitation3h . [0.0 0]) (precipitation24h . [0.0 0]) (windDirection . [7 0]) (wind . [7.4 0]) (maxTempTime (hour . 3) (minute . 55)) (maxTemp . [13.3 0]) (minTempTime (hour . 20) (minute . 22)) (minTemp . [-2.7 0]) (gustTime (hour . 4) (minute . 28)) (gustDirection . [8 0]) (gust . [12.5 0]))
 (\20220226135000 (prefNumber . 44) (observationNumber . 112) (temp . [12.9 0]) (sun10m . [10 0]) (sun1h . [1.0 0]) (precipitation10m . [0.0 0]) (precipitation1h . [0.0 0]) (precipitation3h . [0.0 0]) (precipitation24h . [0.0 0]) (windDirection . [8 0]) (wind . [7.9 0]) (maxTempTime (hour . 4) (minute . 41)) (maxTemp . [13.4 0]) (minTempTime (hour . 20) (minute . 22)) (minTemp . [-2.7 0]) (gustTime (hour . 4) (minute . 28)) (gustDirection . [8 0]) (gust . [12.5 0]))
 (\20220226140000 (prefNumber . 44) (observationNumber . 112) (temp . [12.9 0]) (snow1h . [0 :null]) (snow6h . [0 :null]) (snow12h . [0 :null]) (snow24h . [0 :null]) (sun10m . [10 0]) (sun1h . [1.0 0]) (precipitation10m . [0.0 0]) (precipitation1h . [0.0 0]) (precipitation3h . [0.0 0]) (precipitation24h . [0.0 0]) (windDirection . [8 0]) (wind . [9.3 0]) (maxTempTime (hour . 4) (minute . 41)) (maxTemp . [13.4 0]) (minTempTime (hour . 20) (minute . 22)) (minTemp . [-2.7 0]) (gustTime (hour . 4) (minute . 58)) (gustDirection . [8 0]) (gust . [15.2 0]))
 (\20220226141000 (prefNumber . 44) (observationNumber . 112) (temp . [12.6 0]) (sun10m . [10 0]) (sun1h . [1.0 0]) (precipitation10m . [0.0 0]) (precipitation1h . [0.0 0]) (precipitation3h . [0.0 0]) (precipitation24h . [0.0 0]) (windDirection . [7 0]) (wind . [8.8 0]) (maxTempTime (hour . 4) (minute . 41)) (maxTemp . [13.4 0]) (minTempTime (hour . 20) (minute . 22)) (minTemp . [-2.7 0]) (gustTime (hour . 4) (minute . 58)) (gustDirection . [8 0]) (gust . [15.2 0]))
 (\20220226142000 (prefNumber . 44) (observationNumber . 112) (temp . [13.0 0]) (sun10m . [10 0]) (sun1h . [1.0 0]) (precipitation10m . [0.0 0]) (precipitation1h . [0.0 0]) (precipitation3h . [0.0 0]) (precipitation24h . [0.0 0]) (windDirection . [7 0]) (wind . [8.0 0]) (maxTempTime (hour . 4) (minute . 41)) (maxTemp . [13.4 0]) (minTempTime (hour . 20) (minute . 22)) (minTemp . [-2.7 0]) (gustTime (hour . 4) (minute . 58)) (gustDirection . [8 0]) (gust . [15.2 0]))
 (\20220226143000 (prefNumber . 44) (observationNumber . 112) (temp . [13.0 0]) (sun10m . [10 0]) (sun1h . [1.0 0]) (precipitation10m . [0.0 0]) (precipitation1h . [0.0 0]) (precipitation3h . [0.0 0]) (precipitation24h . [0.0 0]) (windDirection . [7 0]) (wind . [7.2 0]) (maxTempTime (hour . 5) (minute . 29)) (maxTemp . [13.4 0]) (minTempTime (hour . 20) (minute . 22)) (minTemp . [-2.7 0]) (gustTime (hour . 4) (minute . 58)) (gustDirection . [8 0]) (gust . [15.2 0])))

1度のアクセスで10分毎の計測データが3時間分まとめて取得できるので、必要なだけアクセスして結果をつなぎ合わせてから不要な部分をカットしています。サーバへのアクセス頻度が高くなりがちなのでご注意ください(とは言え気象庁の観測データ一覧ページで行っていることと同じではあります)。

過去数日程度のデータしか取得できないようです。それ以前のデータは気象庁|各種データ・資料のあたりから取得しましょう。

2022-02-23 ,

Emacsから気象庁の天気予報にアクセスする

Emacs上で気象庁の天気予報を取得するものを作りました。

misohena/el-jma: Emacs Interface for Japan Meteorological Agency Data

例によってorg-modeのagenda上にも天気を表示できます。

org-modeのAgenda Viewに表示された天気予報
図1: org-modeのAgenda Viewに表示された天気予報

気象庁の提供するデータについては次のTweetを始め色々な資料がありました。

実際に天気予報を取得するにあたって、一番理解が難しかったのが予報区に関する知識でした。東京の天気を知りたかったら東京のコードを使ってデータを取得するだけなんじゃないの? と思いきや、事情はもう少し複雑でした。

天気予報のデータは概ね都道府県単位に近い区分(府県予報区)毎に取得(ダウンロード)できるのですが、そのデータの中はさらに場所が細分化されています。東京であれば、東京地方、伊豆諸島北部、伊豆諸島南部、小笠原諸島といった具合です。このサブエリアを一次細分区域と呼びます。東京都と言ってもこれらを一緒くたにはできませんから当然な話です。

それで済むかと思いきや、気温のデータだけ別のエリアコードが使われています。調べたところ、最低気温と最高気温の予報はアメダス観測所の地点のものが発表されており、そのアメダス観測所の名前とコードが使われています。東京の場合は、東京、大島、八丈島、父島といった具合です。それぞれ一次細分区域と対応していますが、一つの一次細分区域に複数のアメダス観測所がある府県もあります。

これで終わりかと思いきや、週間天気予報はまた別なエリア分けが使われています。気象庁|週間天気予報の解説には次のような記述があります。

「府県週間天気予報」は原則として府県予報区ごとに予報していますが、東京都と鹿児島県では、常に予報区内の区域を細分して予報しています(東京都は、東京地方と伊豆諸島と小笠原諸島に、鹿児島県は、鹿児島県(奄美地方除く)と奄美地方に、それぞれ細分)。また、季節を限定して区域を細分している予報区もあります。

基本的には週間予報は府県予報区単位の荒い予報ということになっているようですが、地形的・季節的な要因で多少細分化されています。

この週間天気予報で使用する区分けは府県予報区とも一次細分区域とも異なります。府県予報区や一次細分区域と同等になる区域は同じ名前やコードが使われていますが、どちらとも一致しない区域は独自の名前やコードが使われています。この区分けには明確な用語の定義が見当たらなかったので、とりあえず「週間予報区域」と呼ぶことにしました(今から思えば「府県週間予報区」くらいだったかなとも思いますが)。JSONの中ではweekと書いてあることが多いです。

一次細分区域と異なる範囲になるのでその下の選択すべきアメダス観測所も変わってきます。ただ、この週間予報区域に対応するアメダス観測所は一つのみに限定されるようです。

というわけで、場所を指定するのに五つもコードを指定しなければならなくなっていますがお許しください。一応 jma-forecast-area-read コマンドでコードを調べられるようになってます。市区町村から調べられればより良いのですが、その辺りは今後の課題と言うことで。

天気予報の取得方法については https://github.com/misohena/el-jma/blob/main/docs/how-to-get-jma-forecast.org にもメモを残しておきました。具体的なデータ例も https://github.com/misohena/el-jma/tree/main/example-data にあります。

2022-02-22

2022年春の新番組

開始日 タイトル 時刻 配信元
× 2022/01/04(火) イロドリミドリ 01:05 dアニメ
2022/01/05(水) テイコウペンギン -   -
× 2022/01/05(水) ハコヅメ~交番女子の逆襲~ 00:00 dアニメ
2022/01/05(水) リアデイルの大地にて 23:00 dアニメ
2022/01/05(水) 東京24区 12:00 dアニメ
× 2022/01/07(金) 終末のハーレム 01:30 dアニメ
2022/01/07(金) スローループ 22:30 dアニメ
2022/01/07(金) ジョジョの奇妙な冒険 第6部 ストーンオーシャン -   -
× 2022/01/07(金) ドールズフロントライン 12:00 dアニメ
2022/01/07(金) からかい上手の高木さん3 02:00 dアニメ
× 2022/01/07(金) CUE! 02:55 dアニメ
2022/01/08(土) その着せ替え人形は恋をする 00:30 dアニメ
2022/01/08(土) 明日ちゃんのセーラー服 01:00 dアニメ
2022/01/08(土) 現実主義勇者の王国再建記 第2期 -   -
× 2022/01/08(土) 怪人開発部の黒井津さん 02:30 dアニメ
2022/01/08(土) 失格紋の最強賢者 23:30? ABEMA
2022/01/09(日) 時光代理人-LINK CLICK- 22:30 Amazon
× 2022/01/09(日) 錆色のアーマ-黎明- 22:30 dアニメ
× 2022/01/09(日) 薔薇王の葬列 23:00 dアニメ
× 2022/01/09(日) フットサルボーイズ!!!!! 23:30 ABEMA
2022/01/09(日) 進撃の巨人 The Final Season 第2クール -   -
2022/01/09(日) 王子の本命は悪役令嬢 01:00 dアニメ
2022/01/10(月) ガル学。Ⅱ~Lucky Stars~ -   -
2022/01/10(月) トライブナイン 22:30 dアニメ
2022/01/10(月) 範馬刃牙(バキ 続編) -   -
× 2022/01/06(木) 最遊記RELOAD -ZEROIN- 00:00 dアニメ
2022/01/10(月) プリンセスコネクト!Re:Dive Season2 -   -
× 2022/01/10(月) 幻想三國誌 天元霊心記 12:00 dアニメ
2022/01/11(火) 賢者の弟子を名乗る賢者 00:00 dアニメ
2022/01/10(月) 錆喰いビスコ 00:30 ABEMA
2022/01/11(火) 天才王子の赤字国家再生術 ? ABEMA
2022/01/11(火) 異世界美少女受肉おじさんと ? ABEMA
2022/01/12(水) オンエアできない! 00:00 dアニメ
2022/01/12(水) BABY-HAMITANG -   -
2022/01/12(水) 漢化日記 -   -
2022/01/12(水) 殺し愛 23:30 dアニメ
2022/01/12(水) 平家物語 12:00 dアニメ
× 2022/01/13(木) オリエント 01:30 ABEMA
2022/01/13(木) ありふれた職業で世界最強 2nd season -   -
2022/01/13(木) あたしゃ川尻こだまだよ 01:30? Gyao!
2022/01/14(金) ヴァニタスの手記 第2クール -   -
2022/01/14(金) ニンジャラ 12:00 dアニメ
2022/01/16(日) 佐々木と宮野 00:00 dアニメ
2022/01/20(木) お昼のショッカーさん      
2022/01/21(金) テイルズ オブ ルミナリア -The Fateful Crossroad-      
2022/01/30(日) リーマンズクラブ 12:00 dアニメ
2022/01/28(金) 地球外少年少女      
2022/01/30(日) 永遠の831      
2022/01/–(-) 闇芝居 十期      
2021/02/09(水) デリシャスパーティ♡プリキュア 00:00 dアニメ