系列:30 天用 Google AI 打造臺灣防災速報 App(Day 24/30)
地震發生後的官方資訊之外,「我家附近以前地震多嗎」也是很常見的疑問。今天在地震頁加一個「歷史地震地圖」分頁,把臺灣周邊約 30 年的地震畫在同一張地圖上。
美國地質調查所(USGS)的地震目錄 API 不用金鑰,可以用經緯度範圍和規模門檻查詢:
import os, urllib.parse, urllib.request, json
def usgs_quakes(start, end, min_mag=4.5):
params = urllib.parse.urlencode({
"format": "geojson", "starttime": start, "endtime": end,
"minmagnitude": min_mag,
"minlatitude": 21, "maxlatitude": 26, # 臺灣周邊範圍
"minlongitude": 119, "maxlongitude": 123,
"orderby": "time-asc",
"eventtype": "earthquake", # 只要地震,排除山崩等其他事件
})
url = f"https://earthquake.usgs.gov/fdsnws/event/1/query?{params}"
with urllib.request.urlopen(url, timeout=60) as r:
return json.load(r) # 保留整份回應:最外層是物件,地震清單在 features 裡
data = usgs_quakes("1996-01-01", "2026-09-15")
print(len(data["features"])) # 2026-10-06 下載時是 2011,之後重查可能略有不同
os.makedirs("assets/data", exist_ok=True) # 在 App 專案根目錄執行
with open("assets/data/usgs_tw_1996-2026_M4.5.json", "w", encoding="utf-8") as f:
json.dump(data, f)
查詢條件是 1996-01-01 到 2026-09-15 0 時(世界協調時間,UTC)、北緯 21–26 度、東經 119–123 度、規模 4.5 以上,共 2,011 起,年均約 66 起。其中規模 5 以上 530 起、6 以上 60 起、7 以上 4 起,最大是 1999 年集集地震的 7.7(USGS 的值)。
歷史地圖用的是 2026-10-06 下載的一份快照,存成約 1.6 MB 的 GeoJSON(用 JSON 記錄地理座標和屬性的格式),直接打包進 App。這樣有三個好處:不用連線向 USGS 查詢歷史資料、不增加 Firestore 的讀取次數,網頁版和手機版也用同一份檔案。USGS 之後仍可能修正個別地震的位置或規模,要更新時重新下載、換檔、發新版。

每起地震畫一個圓,用三個規則:
上方有一個規模滾輪,從 4.5 到 7.7、每格 0.1,往上調就只留下較大的地震,旁邊顯示目前畫了幾筆。資料載入時排序一次,調滾輪時只做過濾。
畫出來可以看到幾個特徵:花蓮外海往東北延伸的密集帶,越往東北震源越深;西部的地震比較零星。這段期間的大事件也都在圖上,例如 2002 年 331 地震、2006 年恆春外海地震、2022 年池上地震、2024 年花蓮地震(依 USGS 目錄的規模,分別是 7.1、7.1、6.9、7.4)。USGS 用 UTC 記錄,所以 2024 年花蓮地震在目錄裡是 4 月 2 日,臺灣時間是 4 月 3 日。
空白的地方不代表安全。 圖上沒有點,只代表這約 30 年、這個範圍內沒有規模 4.5 以上的紀錄。規模門檻、目錄的完整度、約 30 年這個時間長度,都會影響畫面給人的印象;有活動斷層的地方,過去約 30 年沒有大地震,也不代表以後不會有。
目錄裡不只有地震。 USGS 目錄還收錄山崩、爆破等事件。如果查詢時沒加 eventtype=earthquake,這個範圍就會混進一筆規模 4.9 的山崩,被當成地震畫在地圖上。所以查詢時要加這個條件,App 載入時也再過濾一次。
規模的種類不只一種。 USGS 目錄裡混著好幾種規模:2,011 筆中 1,278 筆是體波規模(mb),656 筆是各種矩規模(Mw),68 筆是芮氏規模(ML),其餘 9 筆是表面波規模(Ms)等其他類型。中央氣象署的地震報告用的是芮氏規模。所以同一個地震,歷史地圖上的數字可能和氣象署公布的不同。App 的即時地震用氣象署資料,歷史地圖用 USGS,兩者分開顯示,地圖上方也寫明「資料來源:USGS」。
要標出處。 「設定 → 資料來源」也列了這份目錄的名稱、年份範圍和規模門檻。
明天 Day 25:重大示警推播。