iT邦幫忙

2026 iThome 鐵人賽

DAY 12
0
Build on Google AI

30 天用 Google AI 打造台灣防災速報 App系列 第 24 篇

Day 24|把 30 年、2,011 起地震畫在地圖上:空白的地方不代表安全

  • 分享至 

  • xImage
  •  

系列:30 天用 Google AI 打造臺灣防災速報 App(Day 24/30)

地震發生後的官方資訊之外,「我家附近以前地震多嗎」也是很常見的疑問。今天在地震頁加一個「歷史地震地圖」分頁,把臺灣周邊約 30 年的地震畫在同一張地圖上。

資料:USGS 地震目錄

美國地質調查所(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 的值)。

打包進 App,不走後端

歷史地圖用的是 2026-10-06 下載的一份快照,存成約 1.6 MB 的 GeoJSON(用 JSON 記錄地理座標和屬性的格式),直接打包進 App。這樣有三個好處:不用連線向 USGS 查詢歷史資料、不增加 Firestore 的讀取次數,網頁版和手機版也用同一份檔案。USGS 之後仍可能修正個別地震的位置或規模,要更新時重新下載、換檔、發新版。

地圖怎麼畫

歷史地震地圖:依規模畫圓、依深度上色

每起地震畫一個圓,用三個規則:

  • 大小看規模。 半徑是 2.5+(規模 − 4.5)× 3,單位是螢幕像素,所以地圖放大縮小時圓點大小不變。規模 4.5 的半徑 2.5,7.7 的半徑約 12。
  • 顏色看深度。 淺於 30 公里紅色、30–70 公里橘色、深於 70 公里藍色,下方附圖例。
  • 小圓疊在大圓上面。 圖層順序依半徑決定,半徑越大越往下放。大地震的圓很大,如果放在上面,周圍的小地震會整片被蓋住。

上方有一個規模滾輪,從 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」。

要標出處。 「設定 → 資料來源」也列了這份目錄的名稱、年份範圍和規模門檻。

今日小結

  • 用 USGS 目錄 API 下載 1996–2026 年臺灣周邊規模 4.5 以上的 2,011 起地震,打包進 App。
  • 圓的大小看規模、顏色看深度,小圓疊在大圓上面,小地震才不會被蓋住;規模滾輪只做過濾。
  • 圖上的空白不代表安全;USGS 的規模和氣象署的規模不一定相同,兩份資料分開顯示。

明天 Day 25:重大示警推播。


上一篇
Day 23|AI 能預測地震嗎?從電離層前兆研究看現況(科普下)
下一篇
Day 25|重大示警推播:只推最嚴重的,用更新鏈控制重複
系列文
30 天用 Google AI 打造台灣防災速報 App 共 25 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言