[GAS]気象庁防災情報XMLをパースして地震情報を取得

2022.12.14

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

  • t_o_dと申します。
  • 気象庁が公開している気象庁防災XMLを利用すれば精度の高い天気や地震といった情報を取得できます。
  • そこでGASを利用してこのXMLをパースして地震情報(震度や場所)を取得する方法を記録いたします。

環境

  • mac OS Monterey 13.0
  • Google Apps Script

手順

取得するデータ決め

  • まず気象庁防災XMLからどの情報を取得したいかを決めます。
  • 今回は地震火山(高頻度)フィードを利用して以下を取得することにします。
    • 時刻
    • 場所
    • 震度
  • ※仕様がまとまったページはこちらになります

スクリプトエディタ起動

  • Googleドライブを開き、新規で「Google Apps Script」を作成してスクリプトエディタを起動してください。

コード記述

  • 以下の内容をスクリプトエディタの任意のgsファイルに記述。
function main(){
  const quakes = getEartuQuakes()
  if(!quakes){
    return
  }
  console.log(quakes)
}

// 地震情報取得
function getEartuQuakes(){
  // ネームスペース
  const atom = XmlService.getNamespace("", 'http://www.w3.org/2005/Atom');
  const seismology1 = XmlService.getNamespace("", 'http://xml.kishou.go.jp/jmaxml1/body/seismology1/')

  // コンテンツ取得
  const res = UrlFetchApp.fetch('https://www.data.jma.go.jp/developer/xml/feed/eqvol.xml')
  const xml = XmlService.parse(res.getContentText())
  const root = xml.getRootElement()
  const entries = root.getChildren('entry', atom)
  const earthQuakeContents = entries.filter(entry => {
    const content = entry.getChildText('content', atom)
    return /震度情報/.test(content)
  })

  // 地震がない時
  if(!earthQuakeContents?.length){
    return null
  }

  const targetEarthQuakes = earthQuakeContents.map(e => {
    // 対象地震詳細情報取得
    const link = e.getChild('link', atom).getAttribute('href').getValue()
    const res = UrlFetchApp.fetch(link)
    const xml = XmlService.parse(res.getContentText())
    const root = xml.getRootElement()
    const bodies = root.getChildren('Body', seismology1)
    const earthQuake = bodies[0].getChild('Earthquake', seismology1)
    const intensity = bodies[0].getChild('Intensity', seismology1)

    // 発生時刻
    const originTime = earthQuake?.getChildText('OriginTime', seismology1)
    // 発生場所
    const areaName = earthQuake?.getChild('Hypocenter', seismology1).getChild('Area', seismology1).getChildText('Name', seismology1)
    // 震度
    const maxInt = intensity?.getChild('Observation', seismology1).getChildText('MaxInt', seismology1)

    // 「発生時刻・発生場所・震度」がなければreturn
    if(!earthQuake || !intensity){
      return null
    }

    return [
      originTime,
      areaName,
      maxInt
    ]
  }).filter(e => e)

  return targetEarthQuakes  
}

実行

  • 修正後、main関数を実行して、以下のような実行ログとなることを確認します。

  • 以上です。

まとめ

  • GASではXMLをパースする関数が標準で用意されており非常に便利です。
  • 防災情報XMLは気象に関するさまざまなデータが用意されているので適宜活用していきたいと感じました。

参考

アノテーション株式会社について

アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。