気象庁から気象データをシステマチック（API）に取得してみようとした話

初記事ですのでお手柔らかにお願いします。

# 背景
<p>現在私が開発中のAndroidアプリにて、気圧差を用いた高度計を実装することとなりました。</p>
<p>開発と調査を並行して進めていたところ、Androidスマートフォンにて気圧から高度を算出するためには0.1hpa精度での海面気圧の取得が必要なことが判明したため、最終的に気象庁から気象データを取得したほうが早いという結論にいたり、取得方法の調査に着手しました。</p>

# 結論
1年前の気象庁HPのリニューアルですでに話題になっていました。浅はかながら知りませんでした・・・。

https://qiita.com/e_toyoda/items/7a293313a725c4d306c0

https://qiita.com/michan06/items/48503631dd30275288f7

https://mindtech.jp/?p=1754

https://anko.education/apps/weather_api

https://qiita.com/ehjivh/items/e60d8cf15978e975f0d2#%E5%8F%82%E8%80%83%E3%82%B5%E3%82%A4%E3%83%88


# 注意事項
* このJSONファイルは外部公開の上APIに利用することは想定されていませんので、仕様等が突然変更される可能性があります。
* ファイルの利用にあたっては[気象庁利用規約](https://www.jma.go.jp/jma/kishou/info/coment.html "気象庁ホームページについて")及び[CC BY 4.0（政府標準利用規約互換）](https://creativecommons.org/licenses/by/4.0/deed.ja "CC BY 4.0")への準拠が必要です
（政府標準利用規約とCC BY 4.0の関係について：https://www.digital.go.jp/copyright-policy/ ）
* 但し書きがない限り以下すべてのJSONデータは気象庁ホームページより取得させていただいたものとなります


# 実際にデータをどうとるか考える
<p>先見の明があるギークで遊び心がある方へ基本的な解説はお任せして、気圧を題材にしてデータを取得する流れを考えてみます。</p>
<p>まずは実データであるアメダス地点データのJSONデータを見てみましょう。</p>
<p>例：2022/5/10 15:00～18:00の東京のアメダス地点系JSONデータ</p>

~~~json:https://www.jma.go.jp/bosai/amedas/data/point/44132/20220510_15.json
{
    "20220510150000": {
        "prefNumber": 44,
        "observationNumber": 132,
        "pressure": [
            1016,
            0
        ],
        "normalPressure": [
            1018.8,
            0
        ],
        "temp": [
            22.1,
            0
        ],
        "humidity": [
            37,
            0
        ],
        "snow": [
            null,
            5
        ],
        "snow1h": [
            0,
            6
        ],
        "snow6h": [
            0,
            6
        ],
        "snow12h": [
            0,
            6
        ],
        "snow24h": [
            0,
            6
        ],
        "sun10m": [
            10,
            0
        ],
        "sun1h": [
            1,
            0
        ],
        "precipitation10m": [
            0,
            0
        ],
        "precipitation1h": [
            0,
            0
        ],
        "precipitation3h": [
            0,
            0
        ],
        "precipitation24h": [
            8,
            0
        ],
        "windDirection": [
            2,
            0
        ],
        "wind": [
            2.7,
            0
        ],
        "maxTempTime": {
            "hour": 5,
            "minute": 43
        },
        "maxTemp": [
            23,
            0
        ],
        "minTempTime": {
            "hour": 15,
            "minute": 6
        },
        "minTemp": [
            11.2,
            0
        ],
        "gustTime": {
            "hour": 3,
            "minute": 20
        },
        "gustDirection": [
            1,
            0
        ],
        "gust": [
            8.4,
            0
        ]
    },
    "20220510151000": {
        ～同一キーのデータにつき中略～
    },
    ～中略～,
    "20220510175000": {
　　　　 ～同一キーのデータにつき中略～
    }
}
~~~

以上のJSONと以下リンク先の内容を踏まえると、個別地点のアメダスデータの取得にはアメダスの観測所番号と、3時間ごとの日時指定が必要なことが分かります。

https://qiita.com/e_toyoda/items/7a293313a725c4d306c0#%E3%82%A2%E3%83%A1%E3%83%80%E3%82%B9%E5%9C%B0%E7%82%B9%E7%B3%BB

また、JSONオブジェクト内にはページに表示されていないものも含めて多くのデータが含まれますが、気圧に関連するものらしきデータとして「pressure」と「normalPressure」が存在していることが見て取れます。

データを踏まえ、実際に2022/5/10 15:00の観測値を見に行くと、海面気圧として1018.8hpaが記載されており、
海面気圧を取得するにあたってはnormalPressureを取得すれば良い物と推察できます。
![スクリーンショット 2022-05-10 204302.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2246911/50f15ecb-0d31-d1d9-74ee-60792054b716.png)

そして、観測所番号を取得するにあたっては、amedastable.jsonから取得すべしと記載があります。
予備知識もなくアメダスに関する情報提供のトップページで開発者ツールを漁っていたところ、ありました。

~~~json:https://www.jma.go.jp/bosai/amedas/const/amedastable.json
{
    "11001": {
        "type": "C",
        "elems": "11112010",
        "lat": [
            45,
            31.2
        ],
        "lon": [
            141,
            56.1
        ],
        "alt": 26,
        "kjName": "宗谷岬",
        "knName": "ソウヤミサキ",
        "enName": "Cape Soya"
    }, 
  　 ～中略～
    "44132": {
            "type": "A",
            "elems": "11111111",
            "lat": [
                35,
                41.5
            ],
            "lon": [
                139,
                45
            ],
            "alt": 25,
            "kjName": "東京",
            "knName": "トウキョウ",
            "enName": "Tokyo"
    },
　　～中略～
    "94116": {
        "type": "C",
        "elems": "11112000",
        "lat": [
            24,
            3.3
        ],
        "lon": [
            123,
            46
        ],
        "alt": 38,
        "kjName": "波照間",
        "knName": "ハテルマ",
        "enName": "Hateruma"
    }
}
~~~

それぞれのオブジェクトは観測所番号をキーとしており、オブジェクトのキー「kjName」を見に行くことで、名前と観測所番号を突合できるのではないかと推測できます。
また、オブジェクトの最初のキー「type」に何やら「A」やら「C」やら書いてあります。

これも恐らくですが、気象庁のアメダスはすべての気象要素を観測する高機能なアメダスから、雨量または積雪深のみを観測する簡素なアメダスまで、何種類かアメダスが存在します。
参考：
https://www.jma.go.jp/jma/kishou/know/amedas/ame_master.pdf
https://www.jma.go.jp/jma/kishou/know/amedas/kaisetsu.html

データを確認したところ、以下のように区分されているものと推測されます。
* A: 気象官署に設置されたアメダス
* B: 現存しない気象官署があった場所に設置されたアメダス（特別地域気象観測所等）
* C: その他（D～Fの特殊な地点を除く）のアメダス
* D: 父島
* E: 南鳥島
* F: 富士山

全国の気圧データを取得する場合は、TypeがA,B,D,Eの観測点からであれば網羅的にデータをとれそうです。

後は用途に応じフィルタにかけた地域または全国のアメダス観測所一覧を作ってデータを取得するなり、
最初にアメダスデータをとってきて気圧があるデータだけフィルタをかけ、
観測所一覧と突合して名前と場所を抜き出すなりすれば良さそうです。

# 実はそんなことしなくていい場合も結構ある
最新のデータは仕様書付きでCSVで提供されているため、確実性を担保する場合はこちらを利用されたほうが良いかと思います。

https://www.data.jma.go.jp/stats/data/mdrr/docs/csv_dl_readme.html

また、慶応大学の学生さんが善意のAPIサービスを構築されています。

https://jjwd.info

ただ、今回の気圧のようにCSVでデータが提供されていない場合、どうしてもJSONデータが欲しい場合、大量のアクセスに対応するため生データを保有する必要がある場合はJSONと向き合いましょう。
また、商用利用される方や、仕様書付きで確実に管理されたデータを受け取りたい場合はしかるべきところにお金を払ってデータをもらうのが本来正しい道筋です。

http://www.jmbsc.or.jp/jp/index.html

# その他使えそうなJSON
https://www.jma.go.jp/bosai/common/const/area.json
気象庁が定めた地域、県域、
また自治体や地域（同じ自治体でも東部と西部等で分割されている場合がある）ごとに付番された番号等のデータを取得できます。
各地域や自治体に発表された警報・注意報や天気予報を取得する際に使うと良いでしょう。