防災イベント API
DPIP の防災イベント API は、中央気象署、国家災害防救科技センター(NCDR)、経済部水利署、行政院人事行政総処などが発表する防災情報を集め、同じイベント形式に整えます。ExpTech はこれらの情報を転送するだけで、自ら警報を発表することはありません。全国、または単一の市区町村について、現在有効なイベント、直近 3 日のイベント、単一イベントの影響範囲(GeoJSON)を照会できます。見出しと本文は、lang パラメータで簡体字中国語、英語、日本語などの言語を取得できます。
データライセンス
Section titled “データライセンス”推奨表記データ出典:中央気象署などの発表機関、ExpTech Studio(exptech.dev)
- 中央気象署、国家災害防救科技センター、経済部水利署、行政院人事行政総処などの発表機関:各発表機関の利用規約も適用されます。各イベントの発表元は
authorフィールドにあり、単独で表示する場合は発表元も明記してください。
表記の場所、例、商用利用の申請はデータの利用条件と出典表記をご覧ください。
現在は API Token は不要です。
region パスパラメータと、イベントの area フィールドは、どちらも郷鎮市区の 3 桁の郵便番号です。たとえば 105 は台北市松山区、970 は花蓮県花蓮市です。市区町村の 1 時間ごとの予報の市区町村コードと同じです。
- 市区町村のエンドポイントは、
areaにそのコードを含むイベントだけを返すので、自分で絞り込む必要はありません。 areaが[]のイベント(たとえば範囲を多角形で表す大雷雨、道路通行止め)は、全国のエンドポイントにだけ現れます。この種のイベントは、hasPolygonと/event/{id}で範囲を取得し、自分で判断してください。
5 つのエンドポイントはすべて、クエリパラメータ lang を受けます。一度に 1 言語です。付けない、空白、または判別できないときは zh とみなし、400 にはしません。
lang |
言語 | 変換のしかた |
|---|---|---|
zh |
繁体字中国語(台湾) | 原文のまま |
zh_Hant_HK |
繁体字中国語(香港) | リクエスト時に変換 |
zh_Hans |
简体中文 | リクエスト時に変換 |
en |
English | バックグラウンドで翻訳 |
ja |
日本語 | バックグラウンドで翻訳 |
ko |
한국어 | バックグラウンドで翻訳 |
vi |
Tiếng Việt | バックグラウンドで翻訳 |
th |
ไทย | バックグラウンドで翻訳 |
id |
Bahasa Indonesia | バックグラウンドで翻訳 |
fil |
Filipino | バックグラウンドで翻訳 |
解釈の規則:
- 値が複数あるときは最初の 1 つだけを取ります。カンマがあるときは最初の区間だけを取ります(
en,jaはen)。 - 前後の空白を除き、
-を_にします(zh-TWはzh_TWと同じです)。 - 上の表と完全に同じなら、それを採用します。
- 別名(大文字小文字は区別しません):
zh_TW、zh_Hant、zh_Hant_TW→zh。yue、zh_HK、yue_Hant、zh_Hant_MO→zh_Hant_HK。zh_CN、zh_SG、zh_Hans_CN→zh_Hans。 - それ以外は、最初の
_より前の主言語を取り、上の表にあれば採用します(en_US→en、ja_JP→ja)。 - 残りはすべて
zhです。
変換または翻訳されるのは title、subtitle、description だけです。raw は常に台湾の正字の原文です。バックグラウンド翻訳の言語で、3 フィールドのいずれかの訳が欠けているときは、その 1 件全体が zh に戻ります(lang フィールドが zh)。中国語と訳文が混ざることはありません。少しあとで同じ URL をリクエストすると訳文が返り、ETag も変わります。訳が揃ったかは、各件の lang とリクエストした言語を比べてください。
全国で有効なイベントを取得
Section titled “全国で有効なイベントを取得”全国で、まだ期限が切れていない(expires が現在より大きい)イベントです。多角形の範囲は含みません。
langクエリパラメータ。言語。「言語」の節を参照
curl "https://api.core-tnn1.exptech.dev/api/v2/dpip/realtime/list"const res = await fetch("https://api.core-tnn1.exptech.dev/api/v2/dpip/realtime/list");if (!res.ok) throw new Error(`HTTP ${res.status}`);const data = await res.json();console.log(data);import requests
res = requests.get( "https://api.core-tnn1.exptech.dev/api/v2/dpip/realtime/list", timeout=10,)res.raise_for_status()print(res.json())成功。イベントがないときは []
[ { "id": "1794632460", "status": 1, "type": "thunderstorm", "author": "cwa", "send": 1794632400000, "expires": 1794636000000, "title": "大雷雨即時訊息", "subtitle": "雷雨即時訊息", "description": "氣象署發布大雷雨即時訊息,持續時間至 14 時。", "lang": "zh", "area": [], "hasPolygon": true }]データは変わっていません(If-None-Match が一致)。body なしレスポンスボディなし
試してみる
レスポンスのフィールド
Section titled “レスポンスのフィールド”レスポンスはイベントの配列です。4 つのリストエンドポイントの各件は、すべてこの形です。
| フィールド | 型 | 説明 |
|---|---|---|
[].id | string | イベントの識別子。数字だけの文字列(書き込んだ瞬間の Unix 秒)で、全体で一意です。単位は send と違うので、時刻として使わないでください |
[].status | number | 1:出典が正式発表と示したもの。0:それ以外(訓練、テストなど) |
[].type | string | イベントの種類。「イベントの種類」を参照 |
[].author | string | 発表元の識別子。例:cwa、ncdr、wra、dgpa。一部の種類は出典データからそのまま取るため、形式は一定ではありません |
[].send | number | 発表時刻。Unix ミリ秒 |
[].expires | number | 期限。Unix ミリ秒 |
[].title | string | 見出し |
[].subtitle | string | 副見出し |
[].description | string | 本文。市区町村のエンドポイントでは、その市区町村の要約であることがあります。「description と raw」を参照 |
[].raw | string | 任意。全国の原文。市区町村のエンドポイントで、description にその市区町村の要約を使ったときだけ現れます。翻訳しません |
[].lang | string | この 1 件が実際に採用した言語。訳が揃っていないときは zh |
[].area | number[] | 影響する市区町村の地域コード(3 桁の郵便番号)。[] のこともあります |
[].hasPolygon | boolean | true なら /event/{id} で多角形の範囲を取得できます |
[].addition | object | 任意。種類に応じた追加データ。「付加データ addition」を参照 |
指定した市区町村の有効なイベントを取得
Section titled “指定した市区町村の有効なイベントを取得”area に指定した市区町村を含み、かつその市区町村でまだ期限が切れていないイベントです。
regionパスパラメータ。3 桁の郵便番号。例:105
langクエリパラメータ。言語
curl "https://api.core-tnn1.exptech.dev/api/v2/dpip/realtime/<region>"const res = await fetch("https://api.core-tnn1.exptech.dev/api/v2/dpip/realtime/<region>");if (!res.ok) throw new Error(`HTTP ${res.status}`);const data = await res.json();console.log(data);import requests
res = requests.get( "https://api.core-tnn1.exptech.dev/api/v2/dpip/realtime/<region>", timeout=10,)res.raise_for_status()print(res.json())成功。イベントがないときは []
[ { "id": "1794626412", "status": 1, "type": "heavy-rain", "author": "cwa", "send": 1794626400000, "expires": 1794662400000, "title": "大雨特報", "subtitle": "大雨特報", "description": "臺北市松山區今晚有局部大雨,請注意。", "raw": "東北風影響,今(14)日基隆北海岸、臺北市山區及新北市山區有局部大雨發生的機率。", "lang": "zh", "area": [ 105, 106, 110 ], "hasPolygon": false }]データは変わっていません(If-None-Match が一致)。body なしレスポンスボディなし
region が数値ではない
{ "error": "Invalid region"}試してみる
レスポンスのフィールド
Section titled “レスポンスのフィールド”全国で有効なイベントを取得と同じです。違うのは description と raw です。description と rawを参照してください。
全国の直近 3 日のイベントを取得
Section titled “全国の直近 3 日のイベントを取得”全国で、send が直近 3 日以内のイベントです。期限が切れたものも含みます。
langクエリパラメータ。言語
curl "https://api.core-tnn1.exptech.dev/api/v2/dpip/history/list"const res = await fetch("https://api.core-tnn1.exptech.dev/api/v2/dpip/history/list");if (!res.ok) throw new Error(`HTTP ${res.status}`);const data = await res.json();console.log(data);import requests
res = requests.get( "https://api.core-tnn1.exptech.dev/api/v2/dpip/history/list", timeout=10,)res.raise_for_status()print(res.json())成功。イベントがないときは []
[ { "id": "1794630005", "status": 1, "type": "earthquake", "author": "cwa", "send": 1794630005000, "expires": 1794716405000, "title": "地震報告", "subtitle": "地震報告 [115071]", "description": "11/14 12:16左右,花蓮縣近海發生地震。震源深度15公里,地震規模M5.1,花蓮縣觀測到最大震度4級。", "lang": "zh", "area": [ 970, 971, 972 ], "hasPolygon": false, "addition": { "id": "115071-2026-1114-121630" } }]データは変わっていません(If-None-Match が一致)。body なしレスポンスボディなし
試してみる
レスポンスのフィールド
Section titled “レスポンスのフィールド”全国で有効なイベントを取得と同じです。
指定した市区町村の直近 3 日のイベントを取得
Section titled “指定した市区町村の直近 3 日のイベントを取得”area に指定した市区町村を含み、send が直近 3 日以内のイベントです。期限が切れたものも含みます。
regionパスパラメータ。3 桁の郵便番号。例:105
langクエリパラメータ。言語
curl "https://api.core-tnn1.exptech.dev/api/v2/dpip/history/<region>"const res = await fetch("https://api.core-tnn1.exptech.dev/api/v2/dpip/history/<region>");if (!res.ok) throw new Error(`HTTP ${res.status}`);const data = await res.json();console.log(data);import requests
res = requests.get( "https://api.core-tnn1.exptech.dev/api/v2/dpip/history/<region>", timeout=10,)res.raise_for_status()print(res.json())成功。イベントがないときは []
[ { "id": "1794626412", "status": 1, "type": "heavy-rain", "author": "cwa", "send": 1794626400000, "expires": 1794662400000, "title": "Heavy Rain Advisory", "subtitle": "Heavy Rain Advisory", "description": "Localized heavy rain is expected in Songshan District, Taipei tonight.", "raw": "東北風影響,今(14)日基隆北海岸、臺北市山區及新北市山區有局部大雨發生的機率。", "lang": "en", "area": [ 105, 106, 110 ], "hasPolygon": false }]データは変わっていません(If-None-Match が一致)。body なしレスポンスボディなし
region が数値ではない
{ "error": "Invalid region"}試してみる
レスポンスのフィールド
Section titled “レスポンスのフィールド”全国で有効なイベントを取得と同じです。上の例は ?lang=en です。raw は中国語の原文のままです。
単一イベントを取得
Section titled “単一イベントを取得”id で 1 件のイベントを取得します。範囲があるときは polygon(GeoJSON)が 1 つ加わります。リストに polygon はなく、hasPolygon が true のときにこのエンドポイントで取得します。
idパスパラメータ。イベントの id
langクエリパラメータ。言語
curl "https://api.core-tnn1.exptech.dev/api/v2/dpip/event/<id>"const res = await fetch("https://api.core-tnn1.exptech.dev/api/v2/dpip/event/<id>");if (!res.ok) throw new Error(`HTTP ${res.status}`);const data = await res.json();console.log(data);import requests
res = requests.get( "https://api.core-tnn1.exptech.dev/api/v2/dpip/event/<id>", timeout=10,)res.raise_for_status()print(res.json())成功。この id がないときは []
[ { "id": "1794632460", "status": 1, "type": "thunderstorm", "author": "cwa", "send": 1794632400000, "expires": 1794636000000, "title": "大雷雨即時訊息", "subtitle": "雷雨即時訊息", "description": "氣象署發布大雷雨即時訊息,持續時間至 14 時。", "lang": "zh", "area": [], "hasPolygon": true, "polygon": { "type": "FeatureCollection", "features": [ { "type": "Feature", "properties": {}, "geometry": { "type": "Polygon", "coordinates": [ [ [ 121.56, 25.03 ], [ 121.57, 25.04 ], [ 121.58, 25.02 ], [ 121.56, 25.03 ] ] ] } } ] } }]データは変わっていません(If-None-Match が一致)。body なしレスポンスボディなし
試してみる
レスポンスのフィールド
Section titled “レスポンスのフィールド”レスポンスは配列です。通常は 1 件で、見つからないときは [](200)です。フィールドは全国で有効なイベントを取得と同じで、さらに次があります。
| フィールド | 型 | 説明 |
|---|---|---|
[].polygon | object | 任意。GeoJSON の FeatureCollection。geometry は Polygon、座標は [経度, 緯度]。hasPolygon が true のときだけ現れます。幾何は簡略化済みです(誤差は約 22 m) |
description の選び方は全国のエンドポイントと同じです(全国の原文。raw は付きません)。
イベントの種類
Section titled “イベントの種類”現在、イベントとして書き込まれる種類は次のとおりです。表にない種類も、そのまま表示してください(汎用のアイコンで)。その 1 件を捨てないでください。
type |
名称 | author |
area |
範囲 polygon |
addition |
備考 |
|---|---|---|---|---|---|---|
heavy-rain |
大雨情報 | cwa |
市区町村コード | なし | なし | 地域ごとの要約あり |
extremely-heavy-rain |
豪雨情報 | cwa |
市区町村コード | なし | なし | 地域ごとの要約あり |
torrential-rain |
大豪雨情報 | cwa |
市区町村コード | なし | なし | 地域ごとの要約あり |
extremely-torrential-rain |
超大豪雨情報 | cwa |
市区町村コード | なし | なし | 地域ごとの要約あり |
thunderstorm |
大雷雨の即時情報、竜巻注意情報 | cwa |
[] |
あり | なし | 見出しは「大雷雨即時訊息」または「龍捲風注意」 |
earthquake |
地震情報 | cwa |
震度を観測した県・市の全市区町村 | なし | 地震情報の番号 | 期限は発表から 24 時間 |
tsunami_note |
若干の海面変動 | cwa |
沿岸の市区町村 | なし | 地震情報の番号 | 規模 6 以上、深さ 30 km 以内、震央が海域のときに発表。期限は発表から 24 時間 |
debrisFlowLandSlide |
土石流・大規模崩壊の警戒 | 出典の発表機関 | [] |
あり | なし | |
barrierLake |
堰止湖の警戒 | 出典の発表機関 | [] |
あり | なし | |
roadClose |
道路通行止め | 出典の発表機関 | [] |
あり | 通行止めの位置 | |
floodSensor |
浸水検知 | wra |
[] |
あり | 検知点 | |
seawave |
波浪観測(高波) | ncdr |
[] |
あり | なし | 沿岸観測点の波高が 6 m 以上のときに発表。期限は観測から 3 時間 |
workSchlClos |
休業・休校 | dgpa |
市区町村コード | なし | なし | |
reservoirDischarge |
ダム放流 | wra |
市区町村コード | なし | なし | 現在は無効で、現れません |
降雨情報は軽い順に、heavy-rain、extremely-heavy-rain、torrential-rain、extremely-torrential-rain です。
付加データ addition
Section titled “付加データ addition”addition を持つのは一部の種類だけです。フィールドはいずれも省かれることがあります。
| 種類 | 形 |
|---|---|
earthquake、tsunami_note |
{ "id": "地震情報の番号" }。地震情報に使えます |
roadClose |
areaDesc(範囲の説明)、county、town、roadName、location、geocode、ならびに出典原文の polygon と circle の文字列 |
floodSensor |
areaDesc、county、town、waterLevelStation(水位観測所)、waterLevel(水位)、geocode、ならびに出典原文の polygon と circle の文字列 |
addition の polygon と circle は、出典の元の文字列です。地図を描くときは /event/{id} の GeoJSON polygon を使ってください。
description と raw
Section titled “description と raw”4 種の降雨情報(heavy-rain、extremely-heavy-rain、torrential-rain、extremely-torrential-rain)には、全国の原文のほかに、自動で作った地域ごとの要約があります。
| エンドポイント | 通常のイベント | 降雨情報 |
|---|---|---|
全国のリスト、/event/{id} |
description は原文。raw はない |
description は全国の原文。raw はない |
| 市区町村のリストで、その市区町村に地域ごとの要約がある | 起きない | description はその市区町村の要約。raw は全国の原文 |
| 市区町村のリストで、その市区町村に地域ごとの要約がない | description は原文。raw はない |
description は全国の原文。raw はない |
降雨情報は、まず原文で現れ、地域ごとの要約はあとから(通常は数分以内)補われます。同じ id の description が変わることがあります。最新のレスポンスを正としてください。id で本文をキャッシュしないでください。外国語のリクエストで、その市区町村の要約の訳がまだないときは、description は先に全国の原文の訳を使います。
MapLibre GL JS に、全国で有効なイベントの範囲を描きます。リストに polygon はなく、hasPolygon が true のイベントは単一イベントを再度照会して GeoJSON を取得します。
const API = "https://api.core-tnn1.exptech.dev";
// 1. 全国で有効なイベント。発表時刻の新しい順に並べます(レスポンスの順序は保証されません)const events = await fetch(`${API}/api/v2/dpip/realtime/list`).then((r) => r.json());events.sort((a, b) => b.send - a.send);
// 2. 範囲があるイベントは単一イベントを再取得し、polygon を GeoJSON source に追加しますfor (const e of events.filter((e) => e.hasPolygon)) { const [event] = await fetch(`${API}/api/v2/dpip/event/${e.id}`).then((r) => r.json()); if (!event?.polygon) continue; // 該当イベントがないときは [] map.addSource(`dpip-${event.id}`, { type: "geojson", data: event.polygon }); map.addLayer({ id: `dpip-${event.id}`, type: "fill", source: `dpip-${event.id}`, paint: { "fill-color": "#ef4444", "fill-opacity": 0.25 }, });}- 時刻の単位:
sendとexpiresは Unix ミリ秒です。idも時刻の数字ですが、Unix 秒であり、識別子にすぎません。 - レスポンスの順序は保証されないので、
sendの新しい順に自分で並べてください。 - データがないときは必ず
[](200)です。404 ではありません。regionが数値でないときだけ 400 です。 - 有効と直近 3 日の条件は違います。期限は切れたが 3 日以内に発表されたものは history だけにあります。まだ期限が切れていないが 3 日より前に発表されたものは realtime だけにあります。
- イベントは最大 7 日保持します。過ぎると
/event/{id}でも見つかりません。 - レスポンスには
ETag(引用符なしの MD5)が付きます。If-None-Matchは引用符があってもなくてもよく、一致すると 304 で body はありません。ETagはレスポンス全体をカバーし、言語とその時点の訳を含むため、キャッシュキーには完全な URL(langを含む)を入れてください。サーバーはCache-Controlを送りません。 - レスポンスは gzip に対応しています(curl は
--compressed)。クロスオリジンの呼び出しを許可します。 - データ出典:中央気象署、国家災害防救科技センター(NCDR)、経済部水利署、行政院人事行政総処などの公開防災情報です。
