この記事は公開されてから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サイトをご覧ください。