日本の気象情報を配信してるAPIを探してみた

[防災アプリ開発 Advent Calendar 2024](https://adventar.org/calendars/9939) 10日目の記事です。

昨日は いちはい さんの「[【C#】今更ながらWxBeacon2のデータをPCで受信しよう(簡易版)](https://qiita.com/Ichihai1415/items/d9a9903fae78b2193984)」でした！

ミスドの好きなメニューはエンゼルフレンチです😊
凍らせて食べるとガチ美味い。




# はじめに
はじめまして！Wagira です！

2022年くらいからプログラミングをやっている高校生です。

防災情報を通知するWindowsアプリケーションや防災情報を地図に表示するWebアプリケーションの開発経験があります。

ふと、気象情報を配信しているAPIがどれだけあるのか気になったので探してみました。




# 探してみた
## [気象情報API - Yahoo!デベロッパーネットワーク](https://developer.yahoo.co.jp/webapi/map/openlocalplatform/v1/weather.html)
- **指定した緯度経度の雨の強さ**をXML形式、もしくはJSON形式で取得できるAPI
- **現在時刻の降水強度実測値**から、**60分後までの降水強度予測値**を取得可能
- アプリケーションを登録し、アプリケーションIDを発行する必要あり



## [天気予報 API（livedoor 天気互換）](https://weather.tsukumijima.net/)
- 気象庁が配信してる**天気予報**や**天気概況情報**をJSON形式で取得できるAPI



## [気象庁防災情報XMLフォーマット](https://xml.kishou.go.jp/)
- **天気概況**や**天気予報**、**台風情報**など、[様々な気象情報](https://xml.kishou.go.jp/open_trial/xmllist.pdf)をXML形式で取得できるAPI
- 1分から5分程度の遅延あり



## 気象庁ホームページ API
- **天気予報**や**天気概況情報**、地震情報などをJSON形式で取得できるAPI
- 公に公開されているAPIではなく、気象庁ホームページで使用されているもの




# 使ってみよう
## [気象情報API - Yahoo!デベロッパーネットワーク](https://developer.yahoo.co.jp/webapi/map/openlocalplatform/v1/weather.html)
**URL**
`https://map.yahooapis.jp/weather/V1/place`


### レスポンス
- 東京駅の情報 (JSON形式)
`https://map.yahooapis.jp/weather/V1/place?appid={Client ID}&coordinates=139.7674062,35.6811438&output=json`

```json
{
  "ResultInfo": {
    "Count": 1,
    "Total": 1,
    "Start": 1,
    "Status": 200,
    "Latency": 0.031,
    "Description": ""
  },
  "Feature": [
    {
      "Id": "202412042125_139.767406_35.681144",
      "Name": "地点(139.767406,35.681144)の2024年12月04日 21時25分から60分間の天気情報",
      "Geometry": { "Type": "point", "Coordinates": "139.767406,35.681144" },
      "Property": {
        "WeatherAreaCode": 4410,
        "WeatherList": {
          "Weather": [
            { "Type": "observation", "Date": "202412042125", "Rainfall": 0 },
            { "Type": "forecast", "Date": "202412042135", "Rainfall": 0 },
            { "Type": "forecast", "Date": "202412042145", "Rainfall": 0 },
            { "Type": "forecast", "Date": "202412042155", "Rainfall": 0 },
            { "Type": "forecast", "Date": "202412042205", "Rainfall": 0 },
            { "Type": "forecast", "Date": "202412042215", "Rainfall": 0 },
            { "Type": "forecast", "Date": "202412042225", "Rainfall": 0 }
          ]
        }
      }
    }
  ]
}
```

`Feature.Property.WeatherList.Weather.Type` が `observation` のオブジェクトが実況値で、`forecast` が予測値です。

`Feature.Property.WeatherList.Weather.Rainfall` は降水強度で、単位は `mm/h` です。



## [天気予報 API（livedoor 天気互換）](https://weather.tsukumijima.net/)
**URL**
`https://weather.tsukumijima.net/api/forecast/city/{一次細分区域等コード}`


**地域コード**
https://weather.tsukumijima.net/primary_area.xml


### レスポンス
- 東京の情報
`https://weather.tsukumijima.net/api/forecast/city/130010`

```json
{
  "publicTime": "2024-12-07T11:00:00+09:00",
  "publicTimeFormatted": "2024/12/07 11:00:00",
  "publishingOffice": "気象庁",
  "title": "東京都 東京 の天気",
  "link": "https://www.jma.go.jp/bosai/forecast/#area_type=offices&area_code=130000",
  "description": {
    "publicTime": "2024-12-07T10:36:00+09:00",
    "publicTimeFormatted": "2024/12/07 10:36:00",
    "headlineText": "",
    "bodyText": "　日本付近は冬型の気圧配置となっています。\n\n　東京地方は、晴れています。\n\n　７日は、冬型の気圧配置が続く見込みです。このため、晴れますが、夕方から曇りとなるでしょう。\n\n　８日は、冬型の気圧配置が続く見込みです。このため、晴れ時々曇りとなるでしょう。伊豆諸島では、雨や雷雨となる所がある見込みです。\n\n【関東甲信地方】\n　関東甲信地方は、晴れや曇りで、長野県や関東地方北部では、雪の降っている所があります。\n\n　７日は、冬型の気圧配置が続く見込みです。このため、晴れや曇りで、雪や雨の降る所があるでしょう。\n\n　８日は、冬型の気圧配置が続く見込みです。このため、晴れや曇りで、雪や雨の降る所があり、伊豆諸島では気圧の谷の影響で雷を伴う所があるでしょう。\n\n　関東地方と伊豆諸島の海上では、７日から８日にかけて、波が高いでしょう。船舶は高波に注意してください。",
    "text": "　日本付近は冬型の気圧配置となっています。\n\n　東京地方は、晴れています。\n\n　７日は、冬型の気圧配置が続く見込みです。このため、晴れますが、夕方から曇りとなるでしょう。\n\n　８日は、冬型の気圧配置が続く見込みです。このため、晴れ時々曇りとなるでしょう。伊豆諸島では、雨や雷雨となる所がある見込みです。\n\n【関東甲信地方】\n　関東甲信地方は、晴れや曇りで、長野県や関東地方北部では、雪の降っている所があります。\n\n　７日は、冬型の気圧配置が続く見込みです。このため、晴れや曇りで、雪や雨の降る所があるでしょう。\n\n　８日は、冬型の気圧配置が続く見込みです。このため、晴れや曇りで、雪や雨の降る所があり、伊豆諸島では気圧の谷の影響で雷を伴う所があるでしょう。\n\n　関東地方と伊豆諸島の海上では、７日から８日にかけて、波が高いでしょう。船舶は高波に注意してください。"
  },
  "forecasts": [
    {
      "date": "2024-12-07",
      "dateLabel": "今日",
      "telop": "晴のち曇",
      "detail": {
        "weather": "晴れ　夕方　から　くもり",
        "wind": "北の風",
        "wave": "０．５メートル"
      },
      "temperature": {
        "min": { "celsius": null, "fahrenheit": null },
        "max": { "celsius": "13", "fahrenheit": "55.4" }
      },
      "chanceOfRain": {
        "T00_06": "--%",
        "T06_12": "--%",
        "T12_18": "10%",
        "T18_24": "10%"
      },
      "image": {
        "title": "晴のち曇",
        "url": "https://www.jma.go.jp/bosai/forecast/img/110.svg",
        "width": 80,
        "height": 60
      }
    },
    {
      "date": "2024-12-08",
      "dateLabel": "明日",
      "telop": "晴時々曇",
      "detail": {
        "weather": "晴れ　時々　くもり",
        "wind": "北の風　２３区西部　では　後　北の風　やや強く",
        "wave": "０．５メートル　後　１．５メートル"
      },
      "temperature": {
        "min": { "celsius": "4", "fahrenheit": "39.2" },
        "max": { "celsius": "13", "fahrenheit": "55.4" }
      },
      "chanceOfRain": {
        "T00_06": "0%",
        "T06_12": "0%",
        "T12_18": "20%",
        "T18_24": "0%"
      },
      "image": {
        "title": "晴時々曇",
        "url": "https://www.jma.go.jp/bosai/forecast/img/101.svg",
        "width": 80,
        "height": 60
      }
    },
    {
      "date": "2024-12-09",
      "dateLabel": "明後日",
      "telop": "晴れ",
      "detail": {
        "weather": "晴れ",
        "wind": "北西の風",
        "wave": "０．５メートル"
      },
      "temperature": {
        "min": { "celsius": "4", "fahrenheit": "39.2" },
        "max": { "celsius": "12", "fahrenheit": "53.6" }
      },
      "chanceOfRain": {
        "T00_06": "10%",
        "T06_12": "10%",
        "T12_18": "10%",
        "T18_24": "10%"
      },
      "image": {
        "title": "晴れ",
        "url": "https://www.jma.go.jp/bosai/forecast/img/100.svg",
        "width": 80,
        "height": 60
      }
    }
  ],
  "location": {
    "area": "関東",
    "prefecture": "東京都",
    "district": "東京地方",
    "city": "東京"
  },
  "copyright": {
    "title": "(C) 天気予報 API（livedoor 天気互換）",
    "link": "https://weather.tsukumijima.net/",
    "image": {
      "title": "天気予報 API（livedoor 天気互換）",
      "link": "https://weather.tsukumijima.net/",
      "url": "https://weather.tsukumijima.net/logo.png",
      "width": 120,
      "height": 120
    },
    "provider": [
      {
        "link": "https://www.jma.go.jp/jma/",
        "name": "気象庁 Japan Meteorological Agency",
        "note": "気象庁 HP にて配信されている天気予報を JSON データへ編集しています。"
      }
    ]
  }
}
```

`description.text` が天気概況情報で、`forecasts` が今日・明日・明後日の天気予報の情報です。

気象庁ホームページで配信されている情報を使いやすく加工されているので天気予報や天気概況情報だけ利用したい方はこのAPIがおすすめです！



## [気象庁防災情報XMLフォーマット](https://xml.kishou.go.jp/)
[定時フィード](https://www.data.jma.go.jp/developer/xml/feed/regular.xml) と [随時フィード](https://www.data.jma.go.jp/developer/xml/feed/extra.xml) で気象情報を取得できます。

定時フィードは気象に関する情報のうち、天気概況など定時に発表されるもので、随時フィードは気象に関する情報のうち、警報・注意報など随時発表されるものです。

天気予報に関係する情報は [定時フィード](https://www.data.jma.go.jp/developer/xml/feed/regular.xml) で取得できます。


### レスポンス
- 府県週間天気予報 (2024年12月07日 11時00分 発表)

https://www.data.jma.go.jp/developer/xml/data/20241207013955_0_VPFW50_130000.xml



- 府県天気概況 (2024年12月07日 10時36分 発表)

https://www.data.jma.go.jp/developer/xml/data/20241207013644_0_VPFG50_130000.xml


他にも様々な気象情報を取得できます。


### XML ちょっと扱いにくい (Node.js)
普段、JSONを使ってる方からしたらXMLはﾁｮｯﾄだけ扱いにくいと感じるかもしれません。
そこで登場するのが [fast-xml-parser]() です！

XMLをオブジェクトに変換したり、オブジェクトをXMLに変換できるクソ便利なライブラリです！

こんな感じのコードで変換できます！
```js
import { XMLParser } from 'fast-xml-parser';

const xp = new XMLParser({
  numberParseOptions: {
    leadingZeros: false
  },
  trimValues: false,
  ignoreDeclaration: true,
  ignoreAttributes: false
});

const parsedData = xp.parse('ここに変換したいXMLデータ');
```

- `numberParseOptions.leadingZeros`
`03` のように先頭に `0` を含む数字の処理 (`true` だと先頭の `0` が削除されます。)
地域コードで先頭に `0` が含まれることがあるので `false` にします。

- `trimValues`
前後の不要な空白の処理 (`true` だと前後の不要な空白が削除されます。)
見出し文などで先頭に空白が含まれることがあるので `false` にします。

- `ignoreAttributes`
属性を無視するかどうか
属性を使用するので `false` にします。

その他のオプションは [ドキュメント](https://github.com/NaturalIntelligence/fast-xml-parser/blob/master/docs/v4/2.XMLparseOptions.md) を確認してください！




## 気象庁ホームページ API
2021年に気象庁ホームページがリニューアルされ、気象情報や地震情報など、気象庁ホームページで公開されている情報は大抵取得できるようになりました。

- 今日・明日・明後日の天気予報
https://www.jma.go.jp/bosai/forecast/data/forecast/{府県予想区等コード}.json

- 天気概況情報
https://www.jma.go.jp/bosai/forecast/data/overview_forecast/{府県予想区等コード}.json


### レスポンス
- 名古屋の今日・明日・明後日の天気予報
https://www.jma.go.jp/bosai/forecast/data/forecast/230000.json

---

- 名古屋の天気概況情報
https://www.jma.go.jp/bosai/forecast/data/overview_forecast/230000.json

```json
{
  "publishingOffice": "名古屋地方気象台",
  "reportDatetime": "2024-12-07T16:35:00+09:00",
  "targetArea": "愛知県",
  "headlineText": "",
  "text": "　本州付近は冬型の気圧配置となっています。\n\n　東海地方は、曇りまたは晴れで、雨や雪の降っている所があります。\n\n　７日の東海地方は、冬型の気圧配置が続くため晴れる所もありますが、寒気や湿った空気の影響でおおむね曇りとなる見込みです。岐阜県では、雷を伴って雪や雨の降る所があるでしょう。\n\n　８日の東海地方は、引き続き冬型の気圧配置となるためおおむね晴れますが、寒気や気圧の谷の影響で雲が広がりやすく、雨や雪の降る所がある見込みです。岐阜県では、昼過ぎにかけて雷を伴う所があるでしょう。"
}
```




# 最後に
最後まで読んでくださりありがとうございました！

次は ingen084 さんの記事です！