概要
震度データベースのAPIにリクエストを送るとデータが返ってくるのでいい感じに保存できます。
注意
HTML関係は詳しくないので間違っているところがあるかもしれません。
本編
探した過程
震度データベースのページを開発者ツールで見てみると、地震を検索ボタンにはclassしかないですがCSVダウンロードボタンにはid="outputCsvS"
があったのでjavascriptを見てみます。
https://www.data.jma.go.jp/svd/eqdb/data/shindo/js/main.js にjavascriptがあります(文字化けした場合保存してvscodeで読み込むといい)。vue.jsを使用しているようです。よくわかりませんが、たどってみます。
outputCsvS
でhypoCsv(vm.seisList)
を呼び出し、vm.seisList
の中身をcsvに変換してダウンロードしてるようです。
vmはVueで、インスタンスにデータが格納されているようです。さらに見てみると、地震検索(API呼び出し)というコメントがあるsearch(query, hst)
があります。ここでAPIにPOSTリクエストを送って取得しているようです。URLはhttps://www.data.jma.go.jp/svd/eqdb/data/shindo/api/api.php です。ネットワークタブのapi.phpのペイロードには以下のようなものが確認できます。
mode: search
dateTimeF[]: 2024-01-13
dateTimeF[]: 00:00
dateTimeT[]: 2024-01-19
dateTimeT[]: 23:59
mag[]: 0.0
mag[]: 9.9
dep[]: 000
dep[]: 999
epi[]: 99
pref[]: 99
city[]: 99
station[]: 99
obsInt: 1
maxInt: 1
additionalC: false
Sort: S0
Comp: C0
seisCount: true
observed: false
これを実装すれば取得できそうです。
ちなみに、下の例URLのようにURLのパラメータに指定しても取得できます。
応答例
{
"res": [
{
"id": "20240101081503",
"ot": "2024/01/01 08:15:03.0",
"name": "青森県東方沖",
"latS": "41°29.4′N",
"lonS": "142°00.9′E",
"lat": "41.4900",
"lon": "142.0150",
"dep": "57 km",
"mag": "3.5",
"maxI": "震度1",
"maxIcls": "bg-I1",
"maxS": null,
"maxScls": null
}
],
"str": [
"地震の発生日時 : 2024/01/01 00:00 ~ 2024/01/01 11:59",
"検索結果地震数 : 1 地震 (「地震の発生日時の新しい順」で検索)"
]
}
注意
- 通常時と同じく1000個までしか取得できません。
- 震度は
1
,2
,3
,4
,A
,B
,C
,D
,7
形式である必要があります。
C#
私はC#でやったのでその時やった点を残しておきます。
-
FormUrlEncodedContent
などパラメータを指定しようとしたが同じものが2つあるものがあったり(dateTimeF[]等)、[]があってできないもの(忘れた)があったりでうまくいかなかったが、URLのパラメータに指定したらできた。 - 取得後は
Regex.Unescape
で見やすく。
例:https://github.com/Ichihai1415/JeqDB-Converter/blob/main/JeqDB-Converter/Program.cs のGetCsv()
操作性は悪いですが、画像や動画(用の画像)を作成できます。
おまけ
震度データベースjavascriptには配色の情報もあります。
const intColor = {
S1: 'rgb(242,242,255)',
S2: 'rgb(000,170,255)',
S3: 'rgb(000,065,255)',
S4: 'rgb(250,230,150)',
SA: 'rgb(255,230,000)',
SB: 'rgb(255,153,000)',
SC: 'rgb(255,040,000)',
SD: 'rgb(165,000,033)',
S7: 'rgb(180,000,104)',
SS: 'rgb(204,204,204)',
};
function getEqColorD(dep) {
let d = parseInt(dep);
let l = 50;
let h = 0;
if (d <= 10) {
l = 50 - 25*((10 - d)/10);
} else if (d <= 20) {
h = 0 + 30*((d - 10)/10);
} else if (d <= 30) {
h = 30 + 30*((d - 20)/10);
} else if (d <= 50) {
h = 60;
} else if (d <= 100) {
h = 60 + 60*((d - 50)/50);
l = 50 + 25*((50 - d)/100);
} else if (d <= 200) {
h = 120 + 90*((d - 100)/100);
l = 25 - 30*((100 - d)/100);
} else if (d <= 700) {
h = 210 + 30*((d - 200)/500);
l = 55 + 30*((200 - d)/500);
} else {
h = 240;
l = 25;
}
return 'hsl(' + h + ', 100%, ' + l + '%)';
}
また、api.phpは地震の震度分布も取得できます。
ペイロードは以下のようになります。
mode: event
id: 20240113155558
同じくhttps://www.data.jma.go.jp/svd/eqdb/data/shindo/api/api.php?mode=event&id=20240114001943 のようにできます。
{
"res": {
"hyp": [
{
"id": "20240114001943",
"ot": "2024/01/14 00:19:43.6",
"name": "北海道西方沖",
"latS": "44°17.4′N",
"lonS": "141°36.3′E",
"lat": "44.2900",
"lon": "141.6050",
"dep": "0 km",
"mag": "1.6",
"maxI": "震度1",
"maxIcls": "bg-I1",
"maxS": null,
"maxScls": null
}
],
"int": [
{
"name": "苫前町旭*",
"lat": "44.31",
"lon": "141.655",
"code": "1300031",
"int": "震度1",
"char": "1",
"mark": "S1",
"zidx": "1"
}
]
},
"str": [
{
"hyp": [
{
"id": "20240114001943",
"ot": "2024/01/14 00:19:43.6",
"name": "北海道西方沖",
"latS": "44°17.4′N",
"lonS": "141°36.3′E",
"lat": "44.2900",
"lon": "141.6050",
"dep": "0 km",
"mag": "1.6",
"maxI": "震度1",
"maxIcls": "bg-I1",
"maxS": null,
"maxScls": null
}
],
"int": [
{
"name": "苫前町旭*",
"lat": "44.31",
"lon": "141.655",
"code": "1300031",
"int": "震度1",
"char": "1",
"mark": "S1",
"zidx": "1"
}
]
}
]
}
他にもあるので見てみてください。
感謝
気象庁 震度データベース https://www.data.jma.go.jp/svd/eqdb/data/shindo/index.html