颱風
這組端點整理中央氣象署發布的四種颱風資料:路徑(track)、路徑潛勢(potential)、暴風圈侵襲機率(probability)與颱風警報(warning),另有進行中熱帶氣旋索引與疊圖用 GeoJSON。伺服器每分鐘檢查一次來源,歷史快照保留 7 天。適合做颱風動態頁、路徑地圖與警報提示。共通格式見氣象 API 概要。
建議標示資料來源:中央氣象署、ExpTech Studio(exptech.dev)
- 中央氣象署:另須遵守中央氣象署的資料使用規範(例如政府資料開放授權條款);氣象與地震資訊以中央氣象署發布的內容為準。
標示位置、範例與商業使用申請見資料授權與來源標示。
目前不需要 API Token。
- 所有端點都回
{ updated, cyclones: [...] }(GeoJSON 端點除外)。同時有多個熱帶氣旋時,cyclones有多筆。 tdNo是熱帶氣旋的唯一識別(中央氣象署的熱帶性低氣壓編號),同一個快照內不重複;四種資料用tdNo互相對應。尚未命名的熱帶性低氣壓也有tdNo,此時name、cwaName、tyNo為""。- 時間是 Unix 秒。沒有資料時
updated為0。 - 缺值是
null。 - 座標:索引、路徑、警報用
lat、lon兩個欄位;路徑潛勢、侵襲機率與 GeoJSON 用[經度, 緯度]陣列。小數 4 位。 - 單位:風速、陣風 m/s;氣壓 hPa;移速 km/h;半徑 km。移向是 16 方位英文縮寫,例如
NNW。 - 沒有活動中的熱帶氣旋時,索引、
track、potential、probability的cyclones為[];warning通常保留最近一筆「解除」警報(msgType為Cancel)。
kind |
內容 | 用途 |
|---|---|---|
track |
颱風路徑:過去與目前定位、目前移動、象限暴風半徑、未來各時距的預報定位 | 數值最完整,判斷暴風範圍請用這份的四象限半徑 |
potential |
路徑潛勢預報:過去路徑、預測路徑、潛勢範圍(不確定性錐)、七級風暴風圈、各預報時間點 | 畫路徑潛勢圖 |
probability |
暴風圈侵襲機率:20%、40%、60%、80%、100% 的巢狀等值線 | 畫機率圖,或判斷某個座標落在哪個機率區 |
warning |
颱風警報:發布、更新或解除,警報內文、颱風資訊與影響縣市 | 顯示目前的海上/陸上颱風警報 |
取得進行中的熱帶氣旋
Section titled “取得進行中的熱帶氣旋”每個熱帶氣旋一筆最新定位與強度,取自 track。
curl "https://api.core-tnn1.exptech.dev/api/v5/meteor/typhoon"const res = await fetch("https://api.core-tnn1.exptech.dev/api/v5/meteor/typhoon");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/v5/meteor/typhoon", timeout=10,)res.raise_for_status()print(res.json())成功
{ "updated": 1794614400, "cyclones": [ { "tdNo": "27", "name": "DOLPHIN", "cwaName": "白海豚", "year": 2026, "tyNo": "26", "t": 1794614400, "lat": 18.3, "lon": 128.9, "wind": 33, "gust": 43, "pres": 970, "speed": 22, "dir": "WNW" } ]}資料未變更(If-None-Match 相符),沒有 body沒有回應本文
試試看
| 欄位 | 類型 | 說明 |
|---|---|---|
updated | number | 最新定位時間,Unix 秒;沒有資料為 0 |
cyclones[].tdNo | string | 熱帶性低氣壓編號,唯一識別 |
cyclones[].name | string | 國際英文名;未命名為空字串 |
cyclones[].cwaName | string | 中文名;未命名為空字串 |
cyclones[].year | number | 年份 |
cyclones[].tyNo | string | 颱風編號;仍是熱帶性低氣壓時為空字串 |
cyclones[].t | number | 這筆定位時間,Unix 秒 |
cyclones[].lat | number | 中心緯度 |
cyclones[].lon | number | 中心經度 |
cyclones[].wind | number | null | 近中心最大風速(m/s) |
cyclones[].gust | number | null | 最大陣風(m/s) |
cyclones[].pres | number | null | 中心氣壓(hPa) |
cyclones[].speed | number | null | 移速(km/h) |
cyclones[].dir | string | null | 移向,16 方位英文縮寫 |
取得颱風資料
Section titled “取得颱風資料”依 kind 取得四種資料的最新一份。各自的結構見下方小節。
kind路徑參數。track、potential、probability 或 warning
curl "https://api.core-tnn1.exptech.dev/api/v5/meteor/typhoon/<kind>"const res = await fetch("https://api.core-tnn1.exptech.dev/api/v5/meteor/typhoon/<kind>");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/v5/meteor/typhoon/<kind>", timeout=10,)res.raise_for_status()print(res.json())成功(以 track 為例)
{ "updated": 1794614400, "cyclones": [ { "tdNo": "27", "name": "DOLPHIN", "cwaName": "白海豚", "year": 2026, "tyNo": "26", "analysis": [ { "t": 1794528000, "lat": 16.9, "lon": 131.2, "wind": 28, "gust": 38, "pres": 980 }, { "t": 1794614400, "lat": 18.3, "lon": 128.9, "wind": 33, "gust": 43, "pres": 970 } ], "now": { "speed": 22, "dir": "WNW", "move": [ "以每小時22公里速度,向西北西進行", "WNW 22 KM/HR" ], "c15": { "avg": 180, "ne": 200, "se": 180, "sw": 160, "nw": 180 }, "c25": null }, "forecast": [ { "tau": 6, "t": 1794636000, "lat": 18.8, "lon": 127.9, "wind": 35, "gust": 45, "pres": 965, "speed": 20, "dir": "WNW", "r15": 180, "r70": 80, "state": null } ] } ]}資料未變更(If-None-Match 相符),沒有 body沒有回應本文
試試看
路徑 track
Section titled “路徑 track”| 欄位 | 類型 | 說明 |
|---|---|---|
updated | number | 最新定位時間,Unix 秒;沒有資料為 0 |
cyclones[].tdNo、name、cwaName、year、tyNo | string / number | 同「進行中的熱帶氣旋」 |
cyclones[].analysis[] | object[] | 過去與目前的定位,時間由舊到新 |
t | number | 定位時間,Unix 秒 |
lat、lon | number | 中心座標 |
wind、gust、pres | number | null | 近中心最大風速、最大陣風(m/s)、中心氣壓(hPa) |
cyclones[].now.speed | number | null | 目前移速(km/h) |
cyclones[].now.dir | string | null | 目前移向 |
cyclones[].now.move | string[] | null | 移動描述 [中文, 英文] |
cyclones[].now.c15 | object | null | 七級風暴風半徑(km):avg 平均,ne、se、sw、nw 四象限;太弱時為 null |
cyclones[].now.c25 | object | null | 十級風暴風半徑(km),結構同 c15 |
cyclones[].forecast[].tau | number | 預報時距(小時) |
cyclones[].forecast[].t | number | 預報時間,Unix 秒 |
cyclones[].forecast[].lat、lon | number | 預報中心座標 |
cyclones[].forecast[].wind、gust、pres | number | null | 預報強度 |
cyclones[].forecast[].speed、dir | number | null / string | null | 預報移速(km/h)與移向 |
cyclones[].forecast[].r15 | number | null | 七級風暴風半徑(km) |
cyclones[].forecast[].r70 | number | null | 70% 機率半徑(km) |
cyclones[].forecast[].state | string[] | null | 減弱或變性描述 [中文, 英文] |
判斷某地是否在暴風範圍內時,請用 now.c15 / now.c25 的四象限半徑;potential 的暴風圈是對稱圓,只適合示意。
路徑潛勢 potential
Section titled “路徑潛勢 potential”{ "updated": 1794614400, "cyclones": [ { "tdNo": "27", "name": "白海豚", "past": [[131.2, 16.9], [128.9, 18.3]], "forecast": [[128.9, 18.3], [127.9, 18.8], [125.6, 19.9]], "cone": [[128.4, 18.0], [127.3, 18.4], [124.8, 19.3], [126.1, 20.6], [128.9, 18.3], [128.4, 18.0]], "circle": [[130.6, 18.3], [128.9, 20.0], [127.2, 18.3], [128.9, 16.6], [130.6, 18.3]], "current": [128.9, 18.3], "points": [ { "label": "11月14日14時", "lng": 127.9, "lat": 18.8 }, { "label": "11月15日08時", "lng": 125.6, "lat": 19.9 } ] } ]}| 欄位 | 類型 | 說明 |
|---|---|---|
updated | number | 資料時間,Unix 秒;沒有資料為 0 |
cyclones[].tdNo | string | 熱帶性低氣壓編號;對應不到時為空字串 |
cyclones[].name | string | 來源資料的名稱,例如中文名或 TD27 |
cyclones[].past | number[][] | 過去路徑 [[經度, 緯度], ...] |
cyclones[].forecast | number[][] | 預測路徑 |
cyclones[].cone | number[][] | 路徑潛勢範圍(不確定性錐)的外框 |
cyclones[].circle | number[][] | null | 七級風暴風圈(對稱圓,示意用);較弱時為 null |
cyclones[].current | number[] | null | 目前中心 [經度, 緯度] |
cyclones[].points[] | object[] | 各預報時間點:label 時間文字、lng、lat |
暴風圈侵襲機率 probability
Section titled “暴風圈侵襲機率 probability”{ "updated": 1794614400, "cyclones": [ { "tdNo": "27", "levels": [ { "p": 100, "coords": [[128.6, 18.0], [129.2, 18.4], [128.9, 18.9], [128.6, 18.0]] }, { "p": 20, "coords": [[126.0, 17.2], [130.4, 17.6], [129.8, 21.0], [125.1, 20.5], [126.0, 17.2]] } ] } ]}| 欄位 | 類型 | 說明 |
|---|---|---|
updated | number | 資料時間,Unix 秒;沒有資料為 0 |
cyclones[].tdNo | string | 熱帶性低氣壓編號 |
cyclones[].levels[].p | number | 侵襲機率(%):20、40、60、80、100 |
cyclones[].levels[].coords | number[][] | 該機率的封閉等值線 [[經度, 緯度], ...] |
levels 依機率由高到低排列(100 在最內圈)。判斷座標所在機率時,從 p 最高的等值線開始做點在多邊形內的判斷。
颱風警報 warning
Section titled “颱風警報 warning”中央氣象署通常一次只有一份颱風警報,cyclones 長度為 0 或 1。
{ "updated": 1794615000, "cyclones": [ { "tdNo": "27", "active": true, "id": "CWA-Weather_typhoon-warning_202611140830000000", "sent": 1794615000, "status": "Actual", "msgType": "Cancel", "scope": "Public", "event": "颱風", "urgency": "Past", "severity": "Minor", "certainty": "Observed", "effective": 1794615000, "onset": 1794615000, "expires": 1794618600, "headline": "解除颱風警報", "senderName": "中央氣象署", "typhoon": { "no": "26", "name": "DOLPHIN", "cwaName": "白海豚", "reportNo": "12", "category": "END", "analysis": { "t": 1794614400, "lat": 18.3, "lon": 128.9, "wind": 33, "gust": 43, "pres": 970, "r15": 180, "scale": ["中度颱風", "TYPHOON"] }, "prediction": { "t": 1794700800, "lat": 20.1, "lon": 125.0, "wind": 30, "gust": 40, "pres": 975, "r15": 160, "scale": null } }, "sections": [ { "title": "命名與位置", "text": "中度颱風白海豚(國際命名 DOLPHIN)……" } ], "areas": [ { "name": "臺北市", "code": "63000000" } ] } ]}| 欄位 | 類型 | 說明 |
|---|---|---|
updated | number | 最新警報的發布時間,Unix 秒;沒有資料為 0 |
cyclones[].tdNo | string | 熱帶性低氣壓編號;對應不到目前的熱帶氣旋時為空字串(常見於舊的解除警報) |
cyclones[].active | boolean | 是否解析到警報內容 |
cyclones[].id | string | 警報識別碼 |
cyclones[].sent | number | null | 發布時間,Unix 秒 |
cyclones[].status | string | 例如 Actual |
cyclones[].msgType | string | Alert 發布、Update 更新、Cancel 解除 |
cyclones[].scope、event、urgency、severity、certainty | string | 警報的範圍、事件、緊急程度、嚴重程度、確定程度,沿用來源原文 |
cyclones[].effective、onset、expires | number | null | 生效、開始、失效時間,Unix 秒 |
cyclones[].headline | string | 標題,例如「海上颱風警報」「解除颱風警報」 |
cyclones[].senderName | string | 發布單位 |
cyclones[].typhoon.no | string | 颱風編號(等於 tyNo,不是 tdNo) |
cyclones[].typhoon.name、cwaName | string | 英文名、中文名 |
cyclones[].typhoon.reportNo | string | 警報報數 |
cyclones[].typhoon.category | string | 警報類別,沿用來源原文,例如解除時為 END |
cyclones[].typhoon.analysis | object | null | 目前定位:t、lat、lon、wind、gust、pres、r15(七級風暴風半徑 km)、scale(強度 [中文, 英文]) |
cyclones[].typhoon.prediction | object | null | 預測定位,結構同 analysis |
cyclones[].sections[] | object[] | 警報內文各段:title、text |
cyclones[].areas[] | object[] | 影響縣市:name 名稱、code 縣市代碼 |
取得歷史時間列表
Section titled “取得歷史時間列表”某種資料的歷史快照時間,差量編碼的 Unix 秒,由舊到新。還原方式見差量時間列表。
kind路徑參數。track、potential、probability 或 warning
curl "https://api.core-tnn1.exptech.dev/api/v5/meteor/typhoon/<kind>/list"const res = await fetch("https://api.core-tnn1.exptech.dev/api/v5/meteor/typhoon/<kind>/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/v5/meteor/typhoon/<kind>/list", timeout=10,)res.raise_for_status()print(res.json())成功
[ 1794528000, 21600, 21600, 21600, 21600]資料未變更(If-None-Match 相符),沒有 body沒有回應本文
試試看
| 欄位 | 類型 | 說明 |
|---|---|---|
[0] | number | 最舊一筆快照的時間,Unix 秒 |
[i](i ≥ 1) | number | 與前一筆的時間差(秒) |
快照時間是資料本身的時間:track 是最新定位時間,potential、probability 是來源資料時間,warning 是警報發布時間(sent)。沒有快照時回 []。
取得指定時刻的颱風資料
Section titled “取得指定時刻的颱風資料”某種資料在指定時刻的快照,結構與對應的最新資料相同。只在 static.core 提供,api.core 對這個路徑回 404。
kind路徑參數。track、potential、probability 或 warning
time路徑參數。10 位 Unix 秒,必須是 /{kind}/list 裡出現過的值
curl "https://static.core-tnn1.exptech.dev/api/v5/meteor/typhoon/<kind>/<time>"const res = await fetch("https://static.core-tnn1.exptech.dev/api/v5/meteor/typhoon/<kind>/<time>");if (!res.ok) throw new Error(`HTTP ${res.status}`);const data = await res.json();console.log(data);import requests
res = requests.get( "https://static.core-tnn1.exptech.dev/api/v5/meteor/typhoon/<kind>/<time>", timeout=10,)res.raise_for_status()print(res.json())成功(以 probability 為例)
{ "updated": 1794614400, "cyclones": [ { "tdNo": "27", "levels": [ { "p": 100, "coords": [ [ 128.6, 18 ], [ 129.2, 18.4 ], [ 128.9, 18.9 ], [ 128.6, 18 ] ] } ] } ]}資料未變更(If-None-Match 相符),沒有 body沒有回應本文
time 不是整數,或該時刻沒有快照(超過保留期限也是)。沒有 body沒有回應本文
試試看
同取得颱風資料中對應 kind 的欄位。
取得疊圖用 GeoJSON
Section titled “取得疊圖用 GeoJSON”由最新的 potential 與 probability 組成的 GeoJSON FeatureCollection,可直接加到 MapLibre、Leaflet 等地圖。
curl "https://api.core-tnn1.exptech.dev/api/v5/meteor/typhoon/geojson"const res = await fetch("https://api.core-tnn1.exptech.dev/api/v5/meteor/typhoon/geojson");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/v5/meteor/typhoon/geojson", timeout=10,)res.raise_for_status()print(res.json())成功
{ "type": "FeatureCollection", "features": [ { "type": "Feature", "geometry": { "type": "LineString", "coordinates": [ [ 128.9, 18.3 ], [ 127.9, 18.8 ], [ 125.6, 19.9 ] ] }, "properties": { "kind": "forecast", "tdNo": "27" } }, { "type": "Feature", "geometry": { "type": "Point", "coordinates": [ 127.9, 18.8 ] }, "properties": { "kind": "forecastPoint", "label": "11月14日14時", "tdNo": "27" } }, { "type": "Feature", "geometry": { "type": "Polygon", "coordinates": [ [ [ 128.6, 18 ], [ 129.2, 18.4 ], [ 128.9, 18.9 ], [ 128.6, 18 ] ] ] }, "properties": { "kind": "probability", "p": 100, "tdNo": "27" } } ]}資料未變更(If-None-Match 相符),沒有 body沒有回應本文
試試看
每個 Feature 的 properties.kind 決定它是什麼,並都帶 properties.tdNo。
properties.kind |
幾何 | 內容 |
|---|---|---|
past |
LineString | 過去路徑 |
forecast |
LineString | 預測路徑 |
cone |
Polygon | 路徑潛勢範圍 |
circle15 |
Polygon | 七級風暴風圈(對稱圓) |
current |
Point | 目前中心 |
forecastPoint |
Point | 預報時間點,properties.label 為時間文字 |
probability |
Polygon | 侵襲機率等值線,properties.p 為機率(%) |
沒有颱風時 features 為 []。
把疊圖用 GeoJSON 直接當作 MapLibre GL JS 的 source,再用 kind 篩出要畫的圖形,例如潛勢範圍:
map.addSource("typhoon", { type: "geojson", data: "https://api.core-tnn1.exptech.dev/api/v5/meteor/typhoon/geojson",});map.addLayer({ id: "typhoon-cone", type: "fill", source: "typhoon", filter: ["==", ["get", "kind"], "cone"], paint: { "fill-color": "#f97316", "fill-opacity": 0.2 },});- 時間都是 Unix 秒,缺值是
null。 - 歷史快照保留 7 天,但每種資料至少保留最新一筆,所以颱風季結束後仍查得到最後一份(通常是解除警報)。
potential、probability、warning的tdNo是伺服器依名稱、編號或位置對應到track得出的,對應不到時為空字串。- 資料來源:中央氣象署開放資料的颱風資料。
- 伺服器選擇見氣象 API 概要:時間戳快照走
static.core,其他走api.core,建議直接用 TNN-1 的網址。
