気象庁防災情報 XML（地震分野）を処理する際のメモ

この記事は、[地震情報アプリ界隈 Advent Calendar 2021](https://adventar.org/calendars/6729) 20 日目の記事です。

# はじめに
気象庁が発表する気象情報や地震情報をプログラムで処理したくなったときに便利なのが、気象庁防災情報 XML（以下、気象庁 XML）です。
ありがたいことに [Atom フィード](http://xml.kishou.go.jp/xmlpull.html)[^1] が提供されており手軽に利用させていただくことができます。

気象庁 XML ではどのような情報が提供されているのか、XML のフォーマットはどうなっているのかといった気象庁 XML を取り扱う際に必要な情報は、気象庁の [気象庁防災情報XMLフォーマット 技術資料](http://xml.kishou.go.jp/tec_material.html) のページで網羅されており必要な情報はすべて手に入ると思います。

XML の仕様を十分に理解せず機械処理すると、普段は問題なく動いていても ある日突然プログラムが止まったり意図しない出力になることがあります（実話）。
私は気象庁 XML を活用した Twitter Bot（[@jmx_sv](https://twitter.com/jmx_sv)）を運営しています[^2]。
この記事では、そこで得た知見を盛り込みつつ気象庁 XML のうち地震分野に関する情報を取り扱う際のポイントをメモ程度に記載しています。
当然、この記事だけでは気象庁 XML を取り扱う上で必要な情報を網羅することはできませんので、正しく処理を行うために [気象庁防災情報XMLフォーマット 技術資料](http://xml.kishou.go.jp/tec_material.html) も併せてご覧いただきたいと思います。

なお、気象庁 XML は情報の運用の変更がある場合などに電文の新設や廃止、フォーマット変更が行われる可能性があります。
この記事でも最新の情報をなるべく反映させていくつもりですが、最新情報は前述の技術資料のページでご確認をお願いします。

この記事で取り扱う情報は以下の通りです。

- [震度速報](#震度速報)
- [震源に関する情報](#震源に関する情報)
- [震源・震度に関する情報](#震源震度に関する情報)
- [地震の活動状況等に関する情報](#地震の活動状況等に関する情報)
- [地震回数に関する情報](#地震回数に関する情報)
- [顕著な地震の震源要素更新のお知らせ](#顕著な地震の震源要素更新のお知らせ)
- [南海トラフ地震に関連する情報](#南海トラフ地震に関連する情報)

以下の情報については、いずれ追記しようと思います。

- 緊急地震速報（予報）
- 緊急地震速報（警報）
- 緊急地震速報（地震動予報）


# 解説

各情報の解説に入る前に重要な情報を記しておきます。
地震関連の XML 電文の場合、**`Earthquake` タグや `Intensity` などの `Body` 直下の要素は `Text` タグを除いて、ヘッダ部の「情報形態」（`Head/InfoType`）が「取消」の場合に出現しない**ため注意が必要です。拙作 Bot では、テキスト組み立てなどの処理を始める前に `Head/InfoType` を見て「取消」だった場合の処理を行うようにしています。
解説資料やスキーマを見る際にはタグの出現回数に注目し、「0 回以上」や「0 回／1 回」のような要素は特に注意して取り扱うようにしましょう。

## 震度速報
震度 3 以上が観測されたときに、地震発生の約 1 分半後に震度 3 以上を観測した地域名と地震波の検知時刻が発表されます。

#### 処理する際のポイント
- 地震波の検知時刻や震度 3 以上を観測した地域名（細分区域）だけを入手したい場合は `Head/TargetDateTime` と `Head/Headline/Information` だけで完結できる

#### 処理する際の注意点
- 同一の地震に対して複数回発表される場合があり「震源に関する情報」や「津波警報・注意報」よりも後に発表される場合がある
    - 特に「震源に関する情報」と組み合わせて使用（[後述](#eventid-について)）する場合は注意が必要
- `Earthquake` は常に出現しない


## 震源に関する情報
震度 3 以上が観測されたときに、震源要素などが発表されます。
津波警報・注意報を発表する場合は発表されない情報です。

#### 処理する際のポイント
- 震源の緯度・経度・深さ（`Coordinate`） は ISO 6709 形式で記載されているためパースする必要がある
    - `@description` に文字列表現が記載されるため、テキストとして表示する場合はそれを利用することも可能
- マグニチュード（`Magnitude`）をテキストとして表示する場合は `@description` を使用しても問題ない

#### 処理する際の注意点
- 震源の緯度・経度・深さ（`Coordinate`）はいくつかの例外事項がある
    - 全要素が不明の場合、空要素となり `@description` には「震源要素不明」が記載される
    - 震源の深さが 5 km より浅い場合、深さの値は +0 となり「ごく浅い」として取り扱う
    - 震源の深さが 700 km 以上の場合、深さの値は -700000 となり「700km以上」として取り扱う
    - 震源の深さが不明の場合、震源の緯度・経度のみが記載される
- マグニチュード（`Magnitude`）の値は以下の場合に「NaN」が記載され、`@condition` に「不明」が設定される
    - マグニチュードが不明の場合
    - マグニチュードが 8 を超える巨大地震と推定される場合
- `Intensity` は常に出現しない


## 震源・震度に関する情報
震度 1 以上が観測されたとき、または津波警報・注意報が発表されたとき、または緊急地震速報（警報）が発表されたときに震源要素と震度などが発表されます。
また、国外で発生した大きな地震の震源要素など（遠地地震に関する情報）についても本情報で発表されます。

#### 処理する際のポイント
- `Head/Title` を参照することで「震源・震度情報」か「遠地地震に関する情報」かのどちらかを識別可能
- 震源の緯度・経度・深さ（`Coordinate`） は「[震源に関する情報](#震源に関する情報)」で説明したポイントと同じ
- マグニチュード（`Magnitude`）についても「震源に関する情報」で説明したポイントと同じ
- 「遠地地震に関する情報」では `DetailedName` で震源地の詳細な位置の名称（例：チリ中部沿岸）を入手可能
- 「震源・震度情報」のうち津波警報・注意報を発表した地震については `NameFromMark` が出現して、震源地の詳細な位置を示す目印となる地名（例：御前崎の北東４０ｋｍ付近）を入手可能
    - 地名の一覧は [地震火山関連コード表](http://xml.kishou.go.jp/tec_material.html) で確認可能
- 気象庁以外の震度観測点名には末尾に「＊」が付属するため、震度観測点名だけが必要な場合は削除するか震度観測点コードを利用するなど対応が必要
- 同一の地震に対して続報（観測された震度の更新）が発表される場合がある
    - 新規に都道府県、地域、市町村が追加または更新された場合は、それぞれのタグに `Revise` が出現して「追加」または「上方修正」が設定される
    - 新規に震度が追加または更新された観測点については `Revise` が出現して「追加」、「上方修正」、「下方修正」のいずれかが設定される
- 「遠地地震に関する情報」では自由付加文（`FreeFormComment`）で観測された各国・各地の津波の高さがテキストで設定されていることがある

#### 処理する際の注意点
- **震度 1 以上が観測されない場合**[^3] や [前述](#解説) の「情報形態」が「取消」の場合は `Intensity` は出現しない
- 震源の緯度・経度・深さ（`Coordinate`）は「[震源に関する情報](#震源に関する情報)」で説明した内容に加えて、次のような事例がある
    - 国内で発生した地震の場合は `@datum` が出現して「日本測地系」と記載されるが、国外で発生した地震の震源要素は世界測地系で表現され `@datum` は出現しない
- 基準となる震度以上（現在の運用では震度 5 弱以上）と考えられるが震度の値を入手していない震度観測点（以下、震度 5 弱以上未入電）がある場合に、次のような場合がある
    - 都道府県の最大震度（`Pref/MaxInt`）または地域の最大震度（`Area/MaxInt`）は、当該の都道府県または地域内に震度 5 弱以上未入電の市町村のみしか存在しない場合に出現しない
    - 当該の市町村に震度 5 弱以上未入電の震度観測点が存在する場合は `City/Condition` が出現して「震度５弱以上未入電」が設定される
    - 市町村の最大震度（`City/MaxInt`）は、当該の市町村内に震度 5 弱以上未入電の震度観測点のみしか存在しない場合に出現しない
    - 震度観測点における震度（`IntensityStation/Int`）は、当該観測点の震度が震度 5 弱以上未入電の場合に「震度５弱以上未入電」と記載される


## 地震の活動状況等に関する情報
地震の活動状況等に関する情報や [伊豆東部の地震活動に関する情報](https://www.data.jma.go.jp/svd/eew/data/izu/izu_eq_index.html) 、南海トラフ地震に関連する情報が発表されます。
南海トラフ地震に関連する情報については、新たに「[南海トラフ地震臨時情報](#南海トラフ地震に関連する情報)」と「[南海トラフ地震関連解説情報](#南海トラフ地震に関連する情報)」という電文が新設されたため本情報は**移行措置電文**という扱いです。よって、南海トラフ地震に関連する情報を取り扱う場合は本情報を利用せずに新電文を利用するようにしましょう。

ほとんどがテキスト要素（本文は `Text` タグ）のため説明することはありません。


## 地震回数に関する情報
地震が多数発生した場合に、地震が多発している付近の「震源・震度情報」の発表条件が震度 3 以上に切り替えられ、本情報で震度 2 以下の地震の発生回数がまとめて発表されます。

#### 処理する際のポイント
- 同じ地域の「地震回数に関する情報」は一貫して同じ `Head/EventID` が使用され、続報を発表するたびに情報番号（`Head/Serial`）が更新される

#### 処理する際の注意点
- `NextAdvisory` は、本情報にかえて「震源・震度情報」で震度 1 以上の地震情報を発表する（通常の運用に戻る）場合などで出現しない


## 顕著な地震の震源要素更新のお知らせ
規模の大きな地震が発生した場合に、地震直後に発表される地震情報よりも多くの地震観測点のデータを使用して計算された、より精確な震源要素が発表されます。

#### 処理する際のポイント
- 震源の緯度・経度・深さ（`Coordinate`） は「[震源に関する情報](#震源に関する情報)」で説明したポイントと同じ
- マグニチュード（`Magnitude`）についても「震源に関する情報」で説明したポイントと同じ

#### 処理する際の注意点
- `Coordinate` は、度単位の日本測地系と度分単位の世界測地系で表現するため **2 回出現**する
    - 度単位の震源要素には `@datum` が出現して「日本測地系」と記載され、度分単位の震源要素は `@type` が出現して「震源位置（度分）」と記載される
    - 度分単位の震源要素は 1 km 単位、度単位の震源要素は 1000 m の位が四捨五入されて 10 km 単位で表現される
- マグニチュードが不明の場合、`Magnitude` の値は「NaN」が記載され、`@condition` に「不明」が設定される


## 南海トラフ地震に関連する情報
南海トラフ周辺の地震活動や地殻変動の観測データ等の説明などを取りまとめた情報です。
「南海トラフ地震臨時情報」と「南海トラフ地震関連解説情報」の2種類の情報があります。
情報の発表条件については [気象庁ページ](https://www.data.jma.go.jp/svd/eqev/data/nteq/info_criterion.html) に記載があります。
現在は月に1度の頻度で「南海トラフ沿いの地震に関する評価検討会」の定例会合における調査結果が「南海トラフ地震関連解説情報（定例）」として発表されています。

#### 処理する際のポイント
- 「南海トラフ地震臨時情報」に付与されるキーワードは「調査中」、「巨大地震警戒」、「巨大地震注意」、「調査終了」の 4 種類

#### 処理する際の注意点
- `EventID` および `Serial` の運用については複雑なので解説資料を要確認

# EventID について
地震が検知されると気象庁のシステムで自動的に処理が開始され、その開始時刻が「地震識別番号」として割り振られるようです。
地震情報の場合、EventIDには 1 つの地震識別番号が入ります。

基本的には同一の地震について「震度速報」、「震源に関する情報」、「震源・震度に関する情報」、「顕著な地震の震源要素更新のお知らせ」で EventID が一貫して揃います。
よって、震度分布図を作成する場合に「震度速報」の震度情報と「震源に関する情報」の震源情報を重ねて表示することができます。
拙作 Bot でも、「震度速報」と「震源に関する情報」を処理する際にはで入手した情報をローカルに保存、保存した同じ EventID の情報をマージして震度分布図を作成しています。

複数の地震が連続して発生した場合や処理の都合で発信官署が異なった場合は、**同じ地震であっても EventID が揃わない場合がある**ため注意が必要です。


# おわりに
気象庁 XML の地震分野に関する情報を取り扱う際のポイントを、私が実際に処理をするときに得た知見を盛り込みつつざっくり紹介しました。
肝心なときに処理に失敗して意図したとおりに動かないなんてことにならないように気を付けたいですね。


[^1]: 情報発表から更新されるまでに数分かかりますが、リクエストの頻度に気を付けたり `If-Modified-Since` を使ったりするなど、お行儀よく取得させていただきましょう
[^2]: XML のソースは [Project DM-D.S.S](https://dmdata.jp/) というサービスを利用させていただいています
[^3]: 緊急地震速報（警報）を発表したが震度 1 以上が観測されなかった場合など