Bygga
제품명을 박스에 입력하면 Bygga가 3D로 모든 조립 단계와 부품·스크류·도구를 보여주고 음성으로 안내합니다
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗以 Next.js、TypeScript 與 MapLibre GL JS 實作的 MVP。介面一次顯示一條路線,路線折線代表官方停靠點順序,不代表實際道路軌跡。
本資料為政府公布的表定資訊,並非垃圾車即時位置;實際清運狀況與座標可能不同。
專案統一使用 Node.js 24.x 與隨附的 npm。使用 nvm 時先執行以下指令;其他版本管理工具也請切換至 Node.js 24。GitHub Actions 讀取 .nvmrc,Vercel 下一次部署會採用 package.json 的 engines.node 設定,覆蓋後台的 Node 版本選項。
nvm install
nvm use
npm ci
cp .env.example .env.local
npm run dev
開啟 http://localhost:3000。專案目前附有 2026-08-02 從雙北官方端點成功同步的 Last Known Good 快照,官方來源暫時失效時仍能測試與查詢完整 UI。
自訂事件需 Vercel Pro 或 Enterprise,並啟用 Web Analytics。location_button_viewed 在按鈕至少 50% 進入可視區域時送出,每次元件掛載最多一次;location_button_clicked 在每次有效點擊時送出,不以授權或定位成功為條件。點擊若早於曝光回呼,會先補記曝光。兩者只附帶 source,不傳送座標或搜尋文字。 搜尋面板改為下拉選單後,source 仍為 route_search:曝光指選單至少 50% 可見,點擊僅在選取「使用/改用目前位置」時記錄;開啟選單或選「地圖選點」不計為定位點擊。另以 location_method_selected 的 method=map/device 區分選擇方式。由於入口外觀已改變,改版前後的曝光轉換率需分期比較。
地圖選點事件(不帶地址、關鍵字、座標、行政區或錯誤訊息):
| 事件 | 觸發時機/欄位 |
|---|---|
map_picker_opened | 開啟地圖選點 |
map_picker_cancelled | 使用者按取消 |
map_area_search_clicked | 有效送出關鍵字縮小範圍 |
map_area_search_result | status=success/empty/error |
map_picker_confirm_clicked | 確認參考點、送出附近站點查詢 |
map_picker_result | status=success/empty/error;空結果包含服務範圍外或範圍內無站點 |
取消或改字造成的中止不記為失敗;每次重試是新的點擊與結果。可用選點開啟 → 確認 → 成功結果評估使用流程,但事件次數含重試,不等於不重複使用者。保留原本定位事件,兩套分開分析。
入口:route_search(路線查詢區)、district_search(行政區頁)、map(地圖定位/回到我的位置圖示)、map_retry(展開面板的更新/重試)。清除定位不計入。地圖圖示在已有位置時的回到位置與面板切換也算點擊;分析首次定位需求時優先查看 route_search。
nearby_sort_time(切到最快抵達)與 nearby_sort_distance(切到最近距離)在附近路線的排序實際改變時送出,附帶 from(原排序);重按已選中的選項不計。切換值會存在瀏覽器 localStorage,所以事件代表「改變偏好」而非每次進站的設定。nearby_sort_distance 的比例可視為「願意等離家最近那台車」的使用者佔比。
首頁/路線頁預設路線清單列的「錯過垃圾車?限時收受點」入口(components/collection-entry-link.tsx)送 collection_entry_viewed(連結至少 50% 進入可視區域時送出、每次掛載最多一次,點擊早於曝光回呼時會先補記曝光)與 collection_entry_clicked(每次點擊),都附帶 source=route_list。以點擊事件的不重複訪客數除以曝光事件的不重複訪客數得到點擊率。行政區頁、依地區瀏覽頁與搜尋結果列的其他入口連結不送事件;/collection-points 的頁面瀏覽數會另外包含搜尋引擎與直接進站的流量,不等於入口點擊數。
路線頁的查詢體驗問卷(components/survey-prompt.tsx)在點過站點或換過站之後再停留 20 秒才以底部抽屜跳出,搜尋面板或站點詳情開著時延後;同一次瀏覽只問一次,回答或關掉後記在 localStorage,14 天內不再出現。新版 survey_version=2 的主題提供「有,找到了」(found)、「查了,但沒找到」(not_found)、「還在查/只是看看」(in_progress)。第三種回答直接讓使用者繼續查詢,不追問原因或邀填 Tally。沒找到時追問主要原因,單選點擊立即送出,毋須再按送出;可在下一步改選。原因為 no_route(找不到附近的路線或站點)、unreadable_schedule(看不懂時間或清運日)、hard_to_use(不知道怎麼操作)、time_mismatch(時間跟實際到站不同)、other(其他/不確定);略過為 skipped。自由文字維持在選填 Tally 表單。
| 問卷 Vercel 事件 | 觸發時機/額外欄位 | 寫入 Sheet |
|---|---|---|
survey_shown | 問卷出現;trigger=stop_dwell/stop_nav、visit=first/return | 否 |
survey_answered | 首次主答案;outcome=found/not_found/in_progress、visit | 是 |
survey_reasons | 首次點選原因或略過;reasons、outcome=not_found、reason_revision=1 | 是 |
survey_reasons_changed | 原因改選;reasons、outcome=not_found、遞增 reason_revision | 是,以 survey_reasons 更新同一列 |
survey_form_opened | 點擊開啟 Tally;outcome,不代表完成表單 | 否 |
survey_form_declined | 不填表單、完成或繼續查詢;outcome | 否 |
survey_dismissed | 關閉問卷;step=question/reasons/invite | 否 |
所有問卷事件都附帶 route_id、city、district、survey_version,不含精確位置或自由文字。重選相同原因不重送;改選事件不可加進首次原因填答人數。Vercel 不附帶 feedback_id,不與 Sheet 逐筆配對。找到率計算為 found / (found + not_found),in_progress 另外呈現;有效原因填答率以 Sheet 的最終答案計算:outcome=not_found 且 reason_status=answered 的筆數/not_found 筆數。新舊版本分開比較,舊版沒有 survey_version,原因曾允許多選。Vercel 事件次數包含重試與改選等操作,不直接當作使用者人數。
survey_answered 與 survey_reasons 除了送 Vercel 事件,也會 POST 到 app/api/survey/route.ts 並轉送 Apps Script(scripts/survey-sheet-webhook.gs)。新回饋用每次詢問產生的隨機 feedback_id 合併到 quick_answers 同一列,原因先到或重送也不重複新增;新版原因請求同時包含主答案與 visit,即使第一個答案請求遺失也能保留完整情境。改選依 reason_revision 保留最新答案,較舊請求晚到不覆蓋。沒有 ID 的舊版頁面仍逐筆保存。ID 只識別這次回饋,不識別使用者。欄位包含 received_at、updated_at、outcome、reasons、route_id、city、district、visit、feedback_id、reason_status、survey_version、reason_revision。原因狀態分為 answered(有原因)、skipped(明確略過)、not_received(尚未收到,包含直接關閉或傳送失敗)、not_applicable(找到或還在查);未提供原因不可當成已回答。舊版請求在新腳本記為版本 1,既有資料不回填、不自動配對。保留既有列與人工備註,不收集精確位置或自由文字。
啟用步驟:
scripts/survey-sheet-webhook.gs 取代整份預設程式,不可包在 myFunction() 裡。SURVEY_SECRET(長隨機密鑰)、SURVEY_SPREADSHEET_ID(試算表網址 /d/ 與 /edit 中間的 ID)。/exec 網址。試算表本身保持私人。SURVEY_SHEET_WEBHOOK_URL 與 SURVEY_SHEET_SECRET;本機使用 .env.local,Vercel 正式環境設定後須重新部署。密鑰不可加 NEXT_PUBLIC_。/exec。升級問卷 v2 的部署順序:先更新 Apps Script 部署到新版本,再部署網站。 舊腳本不接受 in_progress,也不會處理改選序號;只部署網站會造成部分回答遺失。驗證三種主答案、略過、原因改選、同筆回饋合併與亂序請求後,再開始以版本 2 分析。
目前前端另存為 fire-and-forget;缺少設定時 API 回 204,寫入失敗回 502,成功回 202。前端尚未等待確認或自動重試,因此畫面上的「已記下」不能當成 Google Sheet 寫入成功的證據。Tally 站點卡入口仍由 Tally 的整合設定收件,這條管道負責原頁詢問的回答。Google 官方部署說明:https://developers.google.com/apps-script/guides/web
在 Analytics → Events 選擇相同期間與 source,以點擊事件的不重複訪客數除以曝光事件的不重複訪客數。事件次數會包含重複操作與重新進站,不可當成訪客使用率;若後台只提供事件次數,就只能比較曝光/點擊次數,不能得到不重複訪客使用率。此實作不建立額外訪客識別碼,訪客辨識交由 Vercel 處理。曝光依 IntersectionObserver 判斷幾何可見範圍,不代表使用者確實注意到按鈕;攔截追蹤的瀏覽器不會完整計入。
components/ad-slot.tsx 是固定尺寸的廣告位元件(手機 320×100、桌機 728×90),目前掛在路線頁站點列表下方(route_stops)、行政區頁路線列表下方(district_list)與限時收受點頁查詢結果下方(collection_points)。地圖工作區與搜尋結果列表刻意不放。NEXT_PUBLIC_ADS_MODE 決定行為,預設關閉:
| 值 | 畫面 | 事件 | 用途 |
|---|---|---|---|
| 留空/其他 | 不渲染 | 不送 | 預設 |
placeholder | 灰色虛線預覽框 | 送 | 本機看版面 |
measure | 零高度、看不見的觀測點 | 送 | 正式站量到達率 |
ad_slot_viewed 在框至少 50% 可見(measure 模式為觀測點進入可視範圍)時送出,每次掛載最多一次,附帶 slot 與 mode。以該事件的不重複訪客數除以同頁面的不重複訪客數,就是該位置的到達率;到達率低的位置掛真廣告也沒有收益。零高度觀測點量的是「有沒有捲到那個位置」,真廣告會把下方內容再推 90 到 100px,兩者略有差距。尚未實作任何廣告網路程式碼;接 AdSense 前需先補隱私權政策頁與 public/ads.txt。
網站已提供頁首「意見回饋」、停靠點卡片「回報此站資訊」及查無路線時的回饋入口。點擊後才載入 Tally 表單,關閉視窗可繼續原本的查詢;若嵌入無法顯示,可另開分頁。未設定有效網址時不顯示入口。
在 Tally 建立一份表單,標題可用「清運地圖使用回饋」。建議題目:
輸入 /hidden,建立下列同名隱藏欄位。不同入口只傳送相關欄位:
| 欄位 | 內容 |
|---|---|
entry | general、stop、empty_search 或 stop_outcome |
outcome | 站點查詢回饋:found(有找到)或 not_found(還沒找到) |
city | 城市代碼 |
district | 行政區 |
route_id | 路線 ID |
stop_id | 停靠點 ID |
source_synced_at | 回報時顯示的資料同步時間 |
query | 查無結果的搜尋關鍵字 |
設定送出成功訊息:「已收到,謝謝你協助改善清運資訊。回報將供資料核對參考,不會立即變更官方時刻。」不要設定送出後自動跳離網站。
發布表單,將 Share 中的 https://tally.so/r/表單ID 填入 .env.local 的 NEXT_PUBLIC_TALLY_FORM_URL。正式環境也要設定此變數並重新建置部署;本機需重新啟動開發伺服器。此網址是公開設定,不是 API 密鑰。
在 Tally 的 Integrations → Google Sheets → Connect 連接自己的 Google 帳號與試算表。可新增「處理狀態」「處理備註」欄位,初期使用待確認/處理中/已完成。
分別從三個入口提交測試回饋,確認 Tally 與試算表都有收到,站點 ID、搜尋關鍵字及來源入口正確;測試手機開關視窗、鍵盤操作和另開分頁。
手機完整站點卡另提供「有找到/還沒找到」。兩種選擇皆開啟 Tally,只有使用者送出表單才會產生回覆;按鈕點擊不代表提交成功。必須在現有 Tally 表單新增 outcome 隱藏欄位並重新發布。建議使用條件邏輯:entry = stop_outcome 且 outcome = found 時隱藏必填的問題類型,讓使用者能直接送出;not_found 時提供地點不符、資訊不足、操作問題等選項。保留一般回報原有題目。分別提交兩種測試回覆,確認 entry、outcome、stop_id 正確;關閉未送出的表單不應新增回覆。這只能分析自願送出者的回答,不能當成全體訪客成功率。
隱藏欄位只提供問題情境,不是身分驗證,也不能直接用來修改官方資料。一般回饋不會自動附上搜尋歷史或定位;查無結果入口僅傳送當次關鍵字。網站目前不代建 Tally 表單,也不代授權 Google 帳號;必須完成以上設定才可實際收件。
參考:Tally 隱藏欄位、嵌入表單、Google Sheets 串接。
npm run sync:data
同步程式會下載兩市完整 CSV、正規化時間與座標、依官方規則分組排序,品質檢查通過後才原子性更新應用資料;失敗時保留現有 Last Known Good。來源網址可由 .env 覆寫。
同步結果會寫入:
data/routes.json:完整正規化路線、停靠點、地址、座標與時間。data/manifest.json:Schema 版本、同步時間、來源 checksum、ETag、路線/站點/行政區數量。每次執行都會下載檢查兩市官方檔案;若來源網址與 checksum 都沒有變化,沿用既有路線及座標品質報告,只更新 manifest.json 的 lastCheckedAt。路線頁分別顯示「官方更新」「資料同步」「最後成功檢查」,不會把檢查日期當成來源資料更新日期。下載或資料品質檢查失敗時,不更新成功檢查時間。
每條路線在地圖及站點時間軸下方,直接輸出所有站點的地址、抵達/離開時間、一般垃圾/資源回收/廚餘清運星期及備註。這些文字包含在初始 HTML,無須點選站點或載入地圖。沒有提供的欄位會標示未提供,不推測清運日;表定時間仍可能因假日或臨時公告調整。
.github/workflows/sync-data.yml 每週一 台北時間 05:23(週日 UTC 21:23) 排程執行,也支援 GitHub Actions 的 Run workflow 手動執行。GitHub 排程可能延遲,並非準點保證。官方資料異動會在下次成功同步後反映;需要提前更新時可手動執行。
流程:下載兩市資料 → 品質檢查 → 測試與 lint → 正式建置 → 提交資料與檢查時間 → 呼叫 Vercel Deploy Hook。任一步驟失敗都會停止,下載或品質檢查失敗不會提交資料或觸發部署。來源內容沒變時仍會部署,讓網站顯示最新的成功檢查時間;sitemap 的路線 lastModified 仍使用資料同步時間。
啟用一次即可:
weekly-data-sync,選擇正式分支 main。既有的 daily-data-sync Hook 可繼續使用,名稱不影響排程,不需重建。VERCEL_DEPLOY_HOOK,值為剛產生的完整 Hook URL。不要把 URL 寫進程式碼或公開日誌。main)。Vercel 正式分支與 Hook 分支必須和它一致;分支規則須允許此工作流程提交 data/ 更新。未設定 secret 時,工作流程會在修改資料前明確失敗。若同步期間有人推送新提交,資料 push 會安全失敗而不覆蓋遠端;重新執行即可。若 Hook 或部署失敗,修正後重新執行 workflow。Git 整合也可能因資料提交觸發部署,請以 Vercel 最新的 Ready 部署為準。
GitHub 公開 repository 長期沒有活動時可能停用排程;請定期確認 Actions 紀錄及失敗通知。排程/建置不會自動讀取本機 .env;若要改用其他官方來源 URL,可在 workflow 的同步步驟設定對應環境變數。
參考:Vercel Deploy Hooks、GitHub scheduled workflows。
npm run audit:coordinates
掃描器會找出「同時遠離前後站、但前後站彼此接近」的孤立座標,以及超過 10 公里的相鄰站區段,並將待人工確認項目寫入 data/suspicious-coordinates.json。已知但未達自動門檻的項目可加入 data/coordinate-flags.json,重新掃描與同步時會一併保留。清單只標示可疑資料,不會自行修改官方座標;一般地圖會以黃色問號標記相關站點,並以橘色虛線保留可疑的原始連線。
預設底圖使用免 API Key 的 OpenFreeMap Liberty 向量樣式,資料來自 OpenStreetMap;可透過 NEXT_PUBLIC_MAP_STYLE_URL 替換成 MapTiler、Stadia Maps 或自架 MapLibre 樣式。正式上線前仍應依預估流量重新確認圖磚服務條款與可用性需求。
參考位置:從「選擇參考位置」下拉選單選「地圖選點(免定位)」;選單中的「使用目前位置」才會啟動裝置定位流程。距離為參考點到停靠站的直線距離,並非步行路線。參考點在本次頁面瀏覽期間保留,切換路線不會消失,重新整理後清除。
選點面板的「用關鍵字縮小範圍」透過 /api/v1/search-area 查詢所選行政區的本地站點資料,依符合文字且座標可信的站點縮放地圖,不呼叫外部地理編碼服務。支援路名、巷弄及地址回退搜尋;多個班次的同座標站點會去重,路線上其他未符合的站點不納入範圍。這是輔助選點的分布範圍,不代表查到確切門牌,仍須手動確認十字位置。
目前介面已移除外部地址查詢入口,不會送出 Photon 查詢。以下為保留的 /api/v1/places 端點設定:PHOTON_API_URL 可替換為自架或代管的 Photon 相容端點。預設公共 demo 僅用於低流量試用:Photon 使用說明 要求合理用量、不保證可用性。此功能僅按鈕送出,沒有逐字自動完成;伺服器每個執行個體限制每秒一個上游請求,並設有最多 100 筆、5 分鐘的記憶體快取與 8 秒逾時。多執行個體上線須另設全站限流或改用可承受流量的服務。地址不寫入持久儲存或應用程式日誌,但會送給查詢供應商。查無結果、逾時或街道層級結果均可改用地圖確認選點,不將概略座標當成門牌。
/collection-points 提供錯過垃圾車後的替代查詢。首頁定位區、附近班次已過提示、行政區定位區與地區瀏覽頁均有入口。路線與行政區入口透過 city/district 查詢參數保留原本地區(優先使用目前選中的路線,其次為定位/搜尋地區),例如 /collection-points?city=TPE&district=松山區。篩選變更同步取代目前網址,重新整理、分享及返回時維持範圍,不額外增加返回步數。無效或跨城市的行政區不套用;有效但沒有收受點資料的行政區保留空結果,並提供查看全市的操作。
桌機同時顯示列表與地圖;手機可切換兩種模式。列表的「在地圖查看」會選取並對準地點;地圖標記會同步選取列表卡片,手機顯示官方時段、導航及返回列表詳情。兩種模式共用地區、排序與選取狀態;篩選排除原選點時不顯示舊詳情。地圖沿用 MapLibre 底圖與 worker,按需載入,離頁時釋放地圖與監聽;底圖失敗時仍可使用列表並重試地圖。沒有可靠座標的收受點保留於列表、採地址導航,不繪製標記。標記不代表目前開放。
臺北市:於請求時讀取官方限時收受點 CSV,以嚴格 UTF-8 解碼、失敗時改用 Big5,避免官方 Big5 檔案的中文欄位變成亂碼;不依賴 HTTP 編碼宣告。成功回應快取一小時,保留備註原文,不解析為「現在開放」。提供行政區篩選、使用者主動定位後的直線距離排序,以及 Google 地圖目的地導航。位置只在頁面記憶體計算,不儲存或傳送至本站伺服器。來源不可用、欄位變動或缺少地址時顯示官方查詢入口;異常座標不參與排序,導航改用地址搜尋。資料來源未提供可可靠判讀的逐日結構化時段,故不推測當日開放狀態與收受種類。
新北市:目前提供官方地圖「全市定點」入口與操作提示,尚未匯入定點資料,不提供距離排序,也不把一般垃圾車停靠點當成固定收受站。部署後應確認台北資料載入、原文時段與導航目的地;本機無法連線官方來源時可驗證錯誤備援,但不等於已完成真實資料驗證。
收受點頁採頁內問卷,不開啟詢問彈窗、不自動移動焦點。臺北列表的任一張卡片至少一半可見時累計閱讀 20 秒;地圖需先選點,再讓詳情(桌機為對應卡片)至少一半可見 20 秒。行政區有效但無結果時,空結果區至少一半可見 8 秒後直接詢問未找到的原因。切到背景、卡片離開視窗、開啟回饋對話框時暫停計時;更換城市、行政區或列表/地圖模式重新計時,地圖改選另一點也重新計時。單一列表內捲動不同卡片可延續累計時間。官方來源失敗與尚未整合列表的新北官方入口不觸發自動問卷。沒有 IntersectionObserver 時保留手動回饋入口。
一般主題為「這頁有幫助你找到收受地點與時間嗎?」,選項為 found/not_found/in_progress。沒找到時單選 no_points(本區沒有收受點)、unsuitable_hours(時段不適合)、unreadable_hours(看不懂時間或規定)、other,也可明確略過。空結果只在使用者選原因時才記錄 not_found,關閉不產生主答案。原因可以改選,以遞增 reason_revision 更新同一筆回饋;同一原因重選不重送。
兩頁共用既有 survey-prompt-shown(同分頁瀏覽期間一次)與 survey-prompt-done(回答/關閉後 14 天)的限制,舊版已設定的冷卻繼續有效;儲存被封鎖時另有記憶體限制。離開路線會取消其尚未顯示的問卷,避免跳到收受點時出現路線題目。主動開啟表單不受冷卻限制:保留頁首「意見回饋」,收受點頁另有帶情境的「提供收受點建議」。
Vercel 事件為 collection_survey_shown、collection_survey_answered、collection_survey_reasons、collection_survey_reasons_changed、collection_survey_dismissed、collection_survey_form_opened。附帶 page_type=collection_points、survey_version=1、city、district(全市可為空)、view_mode、trigger、visit,有站點時包含 point_id;不含定位座標或自由文字。shown 代表符合閱讀條件後插入頁面,不保證使用者注意到問卷。分析時依頁面/版本與列表/地圖模式分開;in_progress 獨立呈現,導航點擊不視為查詢成功。
快速答案同樣 POST /api/survey,由更新後的 scripts/survey-sheet-webhook.gs 寫入原試算表的 collection_answers 分頁;路線回覆繼續寫入 quick_answers。同一 feedback_id 合併主答案與原因,重送不新增列、亂序原因保留最新序號,並保留人工欄位。沿用既有兩個伺服器環境變數;未設定時 API 回 204,不表示已另存成功。前端傳送仍為 fire-and-forget,沒有確認與自動重試。
部署順序:先將 Apps Script 程式更新並部署成新版本,再部署網站。 舊腳本不接受收受點格式。部署後分別驗證三個主答案、空結果、原因改選/略過、兩個分頁分流及同筆合併;完成前不可宣稱 Google Sheet 已開始收到收受點回答。
三種主答案都可選擇「補充建議(選填)」,沿用 NEXT_PUBLIC_TALLY_FORM_URL 的既有表單、嵌入與另開分頁備援,不在本站儲存自由文字。Tally 網址帶入 entry=collection_points、page_type、city、district、point_id(若有)、view_mode、outcome;若要在 Tally 回覆/其 Google Sheets 整合中保存新情境,需在既有表單加入同名隱藏欄位並重新發布。只開啟表單不代表已提交。未設定有效 Tally 網址時,不顯示無法使用的補充建議入口。
GET /api/v1/citiesGET /api/v1/districts?city=TPEGET /api/v1/routes?city=TPE&district=士林區&q=天母GET /api/v1/routes/:routeIdnpm test
npm run lint
npm run build
本專案自行撰寫的程式碼採 MIT License 開源。政府路線資料、OpenStreetMap 地圖資料及第三方服務維持各自的原始授權,不包含在 MIT 授權範圍內。
完整顯名、來源與免責說明請參閱 NOTICE.md。