8000 GitHub - TESIIS/TESIIS: 用地圖快速查詢全臺避難收容處所,查看最近設施、搜尋條件、座標可信度 · GitHub
[go: up one dir, main page]

Skip to content
{"props":{"color_mode":"dark","logged_in":false,"marketing_page":false,"home_path":"/","login_path":"/login?return_to=https%3A%2F%2Fgithub.com%2FTESIIS%2FTESIIS","signup_path":"/signup?ref_cta=Sign+up\u0026ref_loc=header+logged+out\u0026ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E\u0026source=header-repo\u0026source_repo=TESIIS%2FTESIIS","signup_enabled":true,"is_signup_controller":false,"show_search_and_nav":true,"hide_search":false,"private_mode_enabled":false,"should_use_dotcom_links":true,"auth_hydro_click":"{\"event_type\":\"authentication.click\",\"payload\":{\"location_in_page\":\"site header menu\",\"repository_id\":null,\"auth_type\":\"SIGN_UP\",\"originating_url\":\"https://github.com/TESIIS/TESIIS\",\"user_id\":null}}","auth_hydro_click_hmac":"d5aec27e2acdb6110af379e1594cd0b6161806542b5b4dbf6b43af68ff9b876e"}}
TESIISPublic

About

用地圖快速查詢全臺避難收容處所,查看最近設施、搜尋條件、座標可信度

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

10 stars

Watchers

0 watching

Forks

Repository files navigation

TESIIS logo

TESIIS 臺灣避難收容所地圖

截圖

目前部署於 tesiis.itousouta.me

用地圖快速查詢全臺避難收容處所,查看最近設施、搜尋條件、座標可信度,並可直接交給手機上的地圖 App 導航。

本專案源自 2025 臺北程式設計節城市通微服務大黑客松團隊 30 的作品。經持續維護後現為可獨立部署的 Flutter Web,不依賴臺北通 SDK、登入狀態或 Google Maps API Key。

本系統是查詢輔助工具,並非官方災害應變系統。災害發生時,請以各地政府的即時公告與指示為準。

功能

  • 搜尋全臺避難收容處所,支援名稱、地址與分類篩選。
  • 依目前地圖視野分群載入標記,不必一次下載整份資料。
  • 取得使用者位置後顯示最近設施;搜尋半徑會隨地圖縮放調整。
  • 優先使用最近一次的位置,並在背景更新定位結果,降低首次開啟等待時間。
  • 顯示設施座標品質與資料來源,避免把概略位置誤認為精確入口。
  • 使用內政部國土測繪中心 WMTS 底圖,可切換電子、地形與正射影像底圖。
  • 可從設施詳情一鍵開啟外部地圖導航。
  • 設施詳情顯示附近公車站/台鐵/高鐵站與距離(選填功能,需設定 TDX 憑證)。
  • 收藏避難所、分組與私人備註;以連結或 QR Code 分享單一地點,開啟連結即可還原詳情。
  • 依縣市/鄉鎮與弱者安置標示查詢;長按、右鍵或「指定查詢地點」可替家人查附近設施,無須取得 GPS。
  • 下載完整行政區的離線資料包,在裝置上重新搜尋、篩選、分群與計算距離;Web 可另備妥離線啟動資源。
  • 建立家庭主要/備用集合點、緊急聯絡資訊和準備清單,分享文字或下載含 QR Code 的離線避難卡,可列印成 PDF。
  • 收藏比較、精簡清單、大字模式、淺色/深色/跟隨系統主題,以及一鍵撥號、複製地址與電話。
  • 區域災害警報:接入 NCDR 官方 Atom/CAP 公告,依縣市/鄉鎮查詢、保存關注區域、查看更新/解除與到期狀態,並跳回地圖查詢該區避難所。

從地圖上的「我的避難準備」進入收藏、家庭計畫、離 8000 線資料與設定。完整操作與離線建置方式見 生活圈避難準備。

地圖工具列的「區域災害警報」可查看官方公告;不需 API Key。警報的快取、有效時間與資料不完整狀態會分別標示,說明見 區域災害警報。

快速開始

以 Docker 執行

需要 Docker Compose。

git clone https://github.com/TESIIS/TESIIS.git
cd TESIIS
docker compose up --build

開啟 http://localhost:8080 會看到宣傳首頁;點選「進入服務」或直接開啟 http://localhost:8080/app/ 進入地圖。服務健康狀態可由 http://localhost:8080/healthz 查詢。

若 8080 已被使用:

WEB_PORT=8088 docker compose up --build

停止服務:

docker compose down

本機開發

需要 Dart SDK 與 Flutter SDK。後端與前端各開一個終端機:

cd server
dart pub get
dart run bin/server.dart
cd flutter_codefest
flutter pub get
flutter run -d chrome --dart-define=API_BASE_URL=http://localhost:8080/api

不需要設定 API Key。Flutter Web 建置正式版時,指定後端位置:

flutter build web --base-href /app/ --dart-define=API_BASE_URL=https://api.example.tw/api
dart run tool/prepare_web.dart

第二個命令會產生離線啟動資源清單;部署時發布完整的 build/web/。Docker 與 CI 已包含這一步。Service Worker 需要 HTTPS 或 localhost。

架構

Browser
  |
  v
Flutter Web + Nginx
  |                     \
  | /api/*               \ NLSC WMTS map tiles
  v
Dart Shelf API
  |
  +-- 消防署避難收容處所點位檔(執行期快取)
  |
  +-- 進版控的全國快照(上游失敗時的備援)
  |
  +-- TDX 運輸資料流通服務(選填,附近公車/台鐵/高鐵站;未設定憑證時停用)
目錄 用途
flutter_codefest/ Flutter 地圖介面、定位、搜尋與設施詳情,建置後掛在 /app/ 路徑下
flutter_codefest/landing/ 宣傳首頁(靜態頁面),部署後掛在網站根目錄 /
server/ Dart Shelf API、資料正規化、快取與座標驗證
server/data/ 全國避難收容處所快照與產生資料
e2e/ Playwright 端對端測試
.github/workflows/ CI、資料來源檢查與部署工作流程

資料與座標品質

主要資料來自內政部消防署「避難收容處所點位檔」,涵蓋全臺 22 縣市。上游約 5,973 筆,通過座標品質閘門的 5,854 筆(98.0%)進入快照,其餘 119 筆因座標落在所屬縣市範圍之外被排除,清單留在 server/data/shelters_rejected.csv。閘門依據是各縣市各自的 bounding box,用來擋掉明顯標在錯誤縣市、海上或預設位置的資料。

上游點位檔本身即帶 WGS84 經緯度,因此快照中每一筆的座標精度都是 exact;但座標指向的是地址定位,不保證是災時實際的開放入口。

上游服務可用時,API 使用近期下載並快取的資料;若上游失敗或回傳筆數異常,會退回 server/data/shelters_nationwide.csv 的已驗證快照。因此即使外部資料來源暫時不可用,地圖仍可正常提供查詢。

每筆設施都會回傳座標來源與精度。介面會在概略座標或缺少座標時明確提示;請不要把地圖上的標記視為災時唯一的現場指引。

若要更新全國快照:

cd server
dart run tool/build_nationwide_snapshot.dart --report

要忽略本機快取並重新下載上游資料:

dart run tool/build_nationwide_snapshot.dart --refresh --report

API

所有 API 都掛在 /api 下。Docker 本機環境的完整網址為 http://localhost:8080/api。

Endpoint 說明
GET /healthz 服務、資料來源與快照健康狀態
GET /api/shelters 搜尋與篩選設施
GET /api/shelters/<shelterCode> 依收容所編號取得單筆資料;編號已不存在時回 404
GET /api/shelters/package?city=&township= 下載同一資料版本的完整縣市/鄉鎮資料包;city 必填
GET /api/shelters/nearby 依座標與半徑找最近設施
GET /api/shelters/clusters 依地圖範圍與縮放層級取得分群標記
GET /api/shelters/stats 資料筆數與座標品質統計
GET /api/regions 縣市或鄉鎮的資料品質摘要
GET /api/alerts?city=&township=&history= NCDR 公告、資料取得狀態與有效時間;無可用資料時回 503
GET /api/transit/nearby 避難所附近的公車站/台鐵/高鐵站(需設定 TDX 憑證,見下)

常用請求範例:

curl 'http://localhost:8080/api/shelters/nearby?lat=25.0478&lng=121.5170&radius=800&limit=3'
curl 'http://localhost:8080/api/shelters/clusters?bbox=121.45,25.00,121.60,25.10&zoom=13'
curl 'http://localhost:8080/api/regions?city=臺北市'
curl 'http://localhost:8080/api/shelters/package?city=臺北市&township=中正區'
curl 'http://localhost:8080/api/transit/nearby?lat=25.0478&lng=121.5170&city=臺北市&radius=800'

/api/transit/nearby 沒有設定 TDX 憑證,或 TDX 本身故障時,回傳 503 {"available": false} 而不是 500——這是可降級的附加功能,不影響避難所主查詢。 公車站要靠 city(中文縣市名)才查得到:TDX 沒有全國性的公車「附近站點」端點, 只能按縣市查;沒帶 city 就只回台鐵/高鐵站點,不算失敗。半徑會 clamp 到 TDX 自己的 1000 公尺硬限制。目前不含捷運(Metro)——TDX 沒有跨系統的全國附近站點 端點,留待之後有需要再做(見 docs/nationwide-roadmap.md 的 Phase 4)。

/api/shelters 也接受 lat、lng、正數 radius,在指定起點附近搜尋並依直線距離排序後分頁。vulnerable=Y 依全國來源的「適合避難弱者安置」篩選;這個標示不代表已查證輪椅入口、電梯或無障礙廁所。既有中文欄位與 accessible 查詢參數保留相容性。

設定

後端設定可以寫在 server/.env,範本見 server/.env.example。設定優先序為:命令列 port、環境變數、.env、內建預設值。

變數 預設值 用途
PORT 8080 API 連接埠(命令列位置參數優先)
SNAPSHOT_CSV data/shelters_nationwide.csv 全國資料快照路徑
MAX_SNAPSHOT_ITEMS 8000 單次上游抓取的筆數上限(防呆用,資料約 5,900 筆)
CACHE_TTL_SECONDS 600 上游資料快取秒數;0 代表不使用快取
LOG_LEVEL info debug、info、warn 或 error
NFA_POINT_FILE_URL 消防署官方網址 覆寫點位檔來源
ALERT_FEED_URL https://alerts.ncdr.nat.gov.tw/RssAtomFeed.ashx NCDR 警報來源;一般部署直接使用預設值,覆寫供代理或測試使用
UPSTREAM_BASE_URL https://data.taipei/api/v1/dataset 僅離線工具 build_coordinates.dart 使用;可指向 proxy
TDX_CLIENT_ID / TDX_CLIENT_SECRET (空) TDX 憑證,選填。留空時 /api/transit/* 回 503,系統其餘部分不受影響
TDX_TIMEOUT_SECONDS 5 對 TDX 的單次請求逾時秒數

.env 不應提交到版本控制。避難所主資料與底圖都不需要任何金鑰;唯一用到憑證 的是選填的 TDX 交通資訊(docs/nationwide-roadmap.md 的 Phase 4),在 https://tdx.transportdata.tw/ 免費申請。 TDX_CLIENT_ID 與 TDX_CLIENT_SECRET 只能留在伺服器環境中,絕不進入 Flutter bundle 或版本控制。

用 Docker Compose 跑時,上面這張表是 server/.env(只有本機直接 dart run bin/server.dart 才會讀)——docker compose 認的是repo 根目錄的 .env(跟 compose.yaml同一層,Compose 會自動讀取來做 ${TDX_CLIENT_ID} 這類 變數代換,見 compose.yaml 的 api service)。兩個 .env 位置 不一樣、也不會互通;compose.yaml 沒明確列出的變數,就算主機上設了也不會被 帶進容器。忘記在正確位置放這個檔案,就是 TDX 功能部署了卻一直顯示不可用最常見 的原因。

測試與 CI

# 後端
cd server
dart analyze                      # 應為 0 issues
dart test                         # 應全部通過

# 前端
cd flutter_codefest
flutter analyze                   # 應為 0 issues
flutter test                      # 應全部通過

GitHub Actions 會執行後端與 Flutter 的靜態分析、格式檢查、測試、Web 建置、Docker Compose 建置、Playwright 端對端測試,以及 Git 歷史的機密掃描。master 通過後另外建置 linux/amd64 + linux/arm64 多架構映像並推送到 GHCR(ghcr.io/tesiis/server、ghcr.io/tesiis/web),部署時直接 docker pull 使用。完整設定見 ci.yml。

正式站每 15 分鐘由 monitor.yml 檢查一次 /healthz(狀態、22 縣市涵蓋、座標品質、延遲),異常時透過 GitHub 內建的排程失敗通知告警。

端對端測試需要完整服務:

docker compose up -d --build
cd e2e
npm ci
npx playwright install --with-deps chromium
npx playwright test
docker compose down

資料來源與授權

執行期使用:

僅離線工具 build_coordinates.dart 使用(臺北市時期的座標管線,執行期已不載入):

程式碼採 MIT License。資料檔與外部服務另有使用條款,重製或再散布前請閱讀 NOTICE.md。地圖畫面中的國土測繪中心來源標示是其使用規範的一部分,請勿移除。

團隊

2025 臺北程式設計節城市通微服務大黑客松 - 團隊 30「喵主餓餓女裝」

目前由伊藤蒼太與twcat0503持續維護。貢獻、開發環境與安全性通報方式請分別參閱 CONTRIBUTING.md 與 SECURITY.md。

About

用地圖快速查詢全臺避難收容處所,查看最近設施、搜尋條件、座標可信度

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

10 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

0