LoginSignup
1
1

震度データベースの地震一覧を取得する

Posted at

概要

震度データベースのAPIにリクエストを送るとデータが返ってくるのでいい感じに保存できます。

注意

HTML関係は詳しくないので間違っているところがあるかもしれません。

本編

探した過程

震度データベースのページを開発者ツールで見てみると、地震を検索ボタンにはclassしかないですがCSVダウンロードボタンにはid="outputCsvS"があったのでjavascriptを見てみます。
https://www.data.jma.go.jp/svd/eqdb/data/shindo/js/main.js にjavascriptがあります(文字化けした場合保存してvscodeで読み込むといい)。vue.jsを使用しているようです。よくわかりませんが、たどってみます。

outputCsvShypoCsv(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のパラメータに指定しても取得できます。

応答例

https://www.data.jma.go.jp/svd/eqdb/data/shindo/api/api.php?mode=search&dateTimeF[]=2024-01-01&dateTimeF[]=00:00&dateTimeT[]=2024-01-01&dateTimeT[]=11:59&mag[]=0&mag[]=9.9&dep[]=0&dep[]=999&epi[]=99&pref[]=99&city[]=99&station[]=99&obsInt=1&maxInt=1&additionalC=true&Sort=S0&Comp=C0&seisCount=false&observed=false の場合

応答例
{
    "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

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1