TREM 観測点のリアルタイムデータ
trem.rts.v1 は、ExpTech の TREM-net(TREM 地震観測網)のリアルタイムスナップショットです。0.5 秒に 1 件(2 Hz)で、直近 5 秒以内にデータを送った各観測点の連続震度、加速度のピーク(PGA)、地震への参加を並べ、直近 240 秒以内の震源を付けます。リアルタイムの震度地図や、今揺れている観測点の表示に向いています。
接続方法、復号、再接続の規則は SSE 接続 を参照してください。
TREM データ利用上の注意
TREM データは、ExpTech が独自に運用する観測網(TREM-net)による自動・リアルタイムの観測結果であり、公式の地震情報ではありません。台湾の地震情報における権威ある機関は交通部中央気象署(CWA)であり、すべて中央気象署の発表内容が優先されます。本注意事項でいう TREM データとは、TREM-net の観測・検知情報を指します。TREM EEW は ExpTech が個別に同意した、または契約した特定の利用者にのみ提供し、その利用は利用規約第四条の一に従います。
TREM データを利用する際は、次を守ってください。
- 中央気象署の発表を優先する。地震情報、強震即時警報、震度、津波情報は、中央気象署の発表に従ってください。TREM データと公式情報が異なる場合は、公式情報に従ってください。
- 非公式であることを明示する。TREM データを表示・利用する際は、必ず出典とあわせて「非公式情報。中央気象署の発表が優先されます」と明示してください。
- 気象法を遵守する。台湾の気象法第 17 条第 1 項により、地震の予報・警報は中央気象主管機関が一元的に発表します。第 18 条は、ほかの機関・学校・団体・個人が不特定多数に向けて地震予報や警報を発表することを認めていません。特定の利用者への提供は制限されません。違反した場合は同法第 24 条第 2 項により新台湾ドル 20 万元以上 100 万元以下の過料が科され、違反ごとに繰り返し科されることがあります。
- 違法な目的に使わない。TREM データを使って地震を予測したり、地震・津波警報を発表したりすることは禁止です。未確認の地震情報の拡散も禁止です。災害に関するデマや虚偽情報を流布し、公衆または他人に損害を生じさせた場合は、災害防救法第 53 条第 3 項により 3 年以下の有期懲役、拘留または新台湾ドル 100 万元以下の罰金が、公共の安寧に影響するデマを流布した場合は、社会秩序維護法第 63 条第 1 項第 5 号により 3 日以下の拘留または新台湾ドル 3 万元以下の過料が科されます。
- データの限界を理解する。TREM は自動観測で、人による確認を経ていません。ノイズ、機器の異常、ネットワーク遅延により、誤検知・見逃し・遅延が生じることがあります。避難、休業・休校など安全に関わる判断の唯一の根拠にしないでください。
データライセンス
Section titled “データライセンス”推奨表記データ出典:ExpTech Studio TREM(exptech.dev)・非商用利用・非公式情報。中央気象署の発表が優先されます
表記の場所、例、商用利用の申請はデータの利用条件と出典表記をご覧ください。
token は不要です(公開 topic)。有効な token を付けると、利用量は権限 trem.rts に記録され、クォータを超えても中断されません。詳細は SSE 接続:認証 を参照してください。
- 多重化の入口:
/api/v1/trem/sse?topics=trem.rts.v1。イベント名はtrem.rts.v1。 - 単一 topic のパス:
modesleep:alert の付いた観測点が 1 つ以上あるスナップショットだけを送ります。live:0.5 秒ごとのスナップショットをすべて送ります。
tokenAPI Token(任意)。Authorization: Bearer header の使用を推奨します。
curl -N --compressed "https://api.lb.exptech.dev/api/v1/trem/sse/rts"curl -N --compressed "https://api.lb-tpe1.exptech.dev/api/v1/trem/sse/rts"curl -N --compressed "https://api.lb-khh1.exptech.dev/api/v1/trem/sse/rts"const res = await fetch("https://api.lb.exptech.dev/api/v1/trem/sse/rts");if (!res.ok) throw new Error(`HTTP ${res.status}`);
// text/event-stream:逐段讀取const reader = res.body.pipeThrough(new TextDecoderStream()).getReader();for (;;) { const { value, done } = await reader.read(); if (done) break; console.log(value);}const res = await fetch("https://api.lb-tpe1.exptech.dev/api/v1/trem/sse/rts");if (!res.ok) throw new Error(`HTTP ${res.status}`);
// text/event-stream:逐段讀取const reader = res.body.pipeThrough(new TextDecoderStream()).getReader();for (;;) { const { value, done } = await reader.read(); if (done) break; console.log(value);}const res = await fetch("https://api.lb-khh1.exptech.dev/api/v1/trem/sse/rts");if (!res.ok) throw new Error(`HTTP ${res.status}`);
// text/event-stream:逐段讀取const reader = res.body.pipeThrough(new TextDecoderStream()).getReader();for (;;) { const { value, done } = await reader.read(); if (done) break; console.log(value);}import requests
with requests.get( "https://api.lb.exptech.dev/api/v1/trem/sse/rts", stream=True, timeout=30,) as res: res.raise_for_status() for line in res.iter_lines(decode_unicode=True): if line: print(line)import requests
with requests.get( "https://api.lb-tpe1.exptech.dev/api/v1/trem/sse/rts", stream=True, timeout=30,) as res: res.raise_for_status() for line in res.iter_lines(decode_unicode=True): if line: print(line)import requests
with requests.get( "https://api.lb-khh1.exptech.dev/api/v1/trem/sse/rts", stream=True, timeout=30,) as res: res.raise_for_status() for line in res.iter_lines(decode_unicode=True): if line: print(line)text/event-stream。data は base64(gzip(JSON))
retry: 3000
event: infodata: {"location":"lb-tpe1"}
data: H4sIAAAAAAAC/02OywrDIBRE...token が無効、期限切れ、または取り消し済み
invalid tokenメッセージ形式
Section titled “メッセージ形式”各 data を復号すると、1 つの JSON オブジェクトです。
{ "source": "core-tnn1", "ts": 1790619680000, "stations": { "117825C": { "i": 0.0, "pga": 0.61 }, "11DFDBC": { "i": 0.4, "pga": 0.87, "alert": 1 }, "1A50B18": { "i": 3.3, "pga": 4.05, "alert": 1 }, "1C086D8": { "i": -3.0 } }, "eq": [[23.94, 121.52, 32, 1790619645]]}| フィールド | 型 | 説明 |
|---|---|---|
source | string | このスナップショットを出したノード名。例:core-tnn1。ノードが切り替わると変わります。 |
ts | int | スナップショットの時刻。Unix ミリ秒(サーバー時刻。NTP で補正済み)。 |
stations | object | 観測点のスナップショット。key は観測点のデバイス ID(例:11DFDBC)。直近 5 秒以内にデータを送った観測点だけを含みます。 |
<裝置 ID>.i | number | 連続震度(計測震度)。小数第 1 位。負の値になることがあります。信号がないときは常に -3.0 です。震度階級への換算は下の表を参照してください。 |
<裝置 ID>.pga | number | この 0.5 秒の加速度のピーク。単位は gal(cm/s²)。3 軸の合成。小数第 2 位。まだ測れていないときはフィールド自体がありません。 |
<裝置 ID>.alert | int | 常に 1。この観測点が進行中の地震に参加していることを示します。参加していないときはフィールド自体がなく、0 は出ません。 |
eq | array | 直近 240 秒以内の震源。各要素は [緯度, 経度, 深さ(キロメートル), 地震発生時刻(Unix 秒)] です。常に存在し、地震がないときは [] です。 |
i を震度階級にする境界:
i |
< 0.5 | 0.5–1.5 | 1.5–2.5 | 2.5–3.5 | 3.5–4.5 | 4.5–5.0 | 5.0–5.5 | 5.5–6.0 | 6.0–6.5 | ≥ 6.5 |
|---|---|---|---|---|---|---|---|---|---|---|
| 震度 | 0 | 1 | 2 | 3 | 4 | 5弱 | 5強 | 6弱 | 6強 | 7 |
各区間は下限を含み、上限を含みません。pga を震度の式に入れて震度を換算しないでください。震度は i を読んでください。
観測点の座標
Section titled “観測点の座標”stations の key は観測点のデバイス ID です。デバイス ID に対応する経緯度と郷鎮コードは、ExpTech が公開している観測点一覧 station.csv を使ってください(フィールド id がデバイス ID、lat と lon が座標、code が郷鎮コードです)。
ブラウザで単一 topic のパスから live モードのスナップショットを受けます。データイベントに名前はないので、onmessage で受けて復号し、i を震度階級に換算します。
async function decodeData(b64) { const bytes = Uint8Array.from(atob(b64), (c) => c.charCodeAt(0)); const stream = new Blob([bytes]).stream().pipeThrough(new DecompressionStream("gzip")); return await new Response(stream).text();}
function toLevel(i) { const labels = ["0", "1", "2", "3", "4", "5弱", "5強", "6弱", "6強", "7"]; if (i < 4.5) return labels[Math.max(0, Math.round(i))]; return labels[Math.min(9, 5 + Math.floor((i - 4.5) / 0.5))];}
const es = new EventSource("https://api.lb.exptech.dev/api/v1/trem/sse/rts?mode=live");es.onmessage = async (e) => { const rts = JSON.parse(await decodeData(e.data)); for (const [id, s] of Object.entries(rts.stations)) { if ("alert" in s) console.log(id, `震度 ${toLevel(s.i)}`, s.pga !== undefined ? `${s.pga} gal` : ""); }};alertとpgaは「フィールドがあるか」で判断してください。 地震に参加していない観測点にはalertフィールドがありません。加速度のピークをまだ測れていない観測点にはpgaフィールドがありません。0は出ません。alertは消えるのが遅れます。 観測点が参加した地震がすべて終わり、かつiが 15 秒連続で 0.5 を下回ってから、alertが消えます。iは負の値になることがあります。 観測点がとても静か(有効加速度が約 0.34 gal 未満)なとき、iは負です。-0.0は 0 として扱ってください。-3.0は「信号がない」固定値で、測定結果ではありません。- 観測点は現れたり消えたりします。 直近 5 秒にデータがない観測点は
stationsに入らず、データがあれば戻ります。一覧にないことは「この数秒は受け取っていない」という意味で、震度 0 ではありません。 - 各件は完全なスナップショットです。 新しい 1 件で前の 1 件を置き換えてください。スナップショットに通し番号はなく、1 件取りこぼしたら次の件を使います。
- 補送しません。 切断して再接続したあとは、最新のスナップショットから始まります。
- 時刻の単位が違います。
tsは Unix のミリ秒、eqの地震発生時刻は Unix の秒です。 - 流量。 live モードは毎秒 2 件で、各件にすべての観測点が含まれます(展開後は 1 件あたり数 KB)。地震のあいだのデータだけが必要なときは、既定の sleep モードを使ってください。
