HeritageMap Studio 文化資產地圖工作室
以 Qt6 + OpenGL 打造的原生桌面文化資產地圖與時間軸視覺化工作站
一套以 C++17、Qt6 Widgets 與 OpenGL 3.3 開發的 Linux 原生桌面應用,專為文化資產地圖、metadata 探索與歷史時間軸視覺化而設計。採 QOpenGLWidget 自繪地圖畫布,搭配 SQLite 資料庫、CSV 匯入管線、地理座標投影、圖層管理、時間軸播放與分面搜尋,並以分層架構(model / repository / service / ui)逐階段擴充功能。
已驗證 Demo 錄影 1
由 portfolio quality pass 從既有專案 demo 素材複製。
媒體總覽
快速瀏覽這個專案的截圖與錄影展示。
專案連結與 Demo 狀態
專案概覽
## 專案概述 HeritageMap Studio 是一套以 **C++17 + Qt6 Widgets + OpenGL 3.3** 開發的 Linux 原生桌面應用,定位為文化資產的地圖工作站。它把散落的文化地點資料整合到單一視窗中,讓使用者能同時瀏覽空間分布、歷史年代與詳細 metadata,並進行互動式探索。 ## 架構設計 專案採清楚的分層架構:`models`(純資料模型如 HeritageSite)、`repositories`(資料存取)、`database`(DatabaseManager 與版本化 MigrationManager)、`services`(CsvReader、ImportService)、`utils`(GeoCoordinateTransformer)、`opengl`(MapCanvas 渲染)與 `ui`(MainWindow 及各 Dock 面板)。各層職責分明,model 不碰 UI 與 database,渲染層也不需知道 MainWindow 細節,全靠 Qt signal/slot 串接。 ## 渲染與互動 central map canvas 以 QOpenGLWidget 搭配自寫 GLSL shader 管線繪製自適應格線與依文化類型著色的地點;實作了 2D 相機、screen↔world 座標換算、滑鼠平移/滾輪縮放與點擊命中測試。GeoCoordinateTransformer 負責把經緯度投影為本地公尺座標,並對無座標資料保留 fallback。 ## 資料與篩選 後端使用 SQLite,透過 schema_migrations 表進行版本化遷移,並以 repository 模式存取資料。CSV 匯入管線可載入文化資產樣本資料(含台北文資範例)。三套統一的篩選狀態 —— 圖層、時間軸與分面搜尋 —— 共同驅動地圖即時重繪。 ## 進度與展望 專案已歷經 8 個開發階段,從純應用程式骨架逐步擴充為具資料庫、匯入、投影、metadata 編輯、圖層、時間軸播放與進階搜尋的完整工作站。後續規劃包含地圖底圖圖磚、路線編輯與更完整的 GIS 投影。
我的角色
獨立開發者(架構設計、OpenGL 渲染、資料層與 UI 全棧實作)
問題背景
文化資產資料往往散落於試算表,缺乏一個能同時呈現空間分布、歷史年代與詳細 metadata,並支援互動探索的本地工具;通用 GIS 軟體又過於笨重且不貼合文化資產的資料模型。
解決方案
以 Qt6 Widgets 建立可停靠面板式工作站,central canvas 使用 QOpenGLWidget + 自寫 GLSL shader 管線繪製格線與地點;後端以 SQLite 加上版本化 migration 管理 schema,透過 repository 模式存取 HeritageSite,並由 CSV 匯入服務與地理座標投影器把經緯度轉為本地公尺座標,再疊加圖層、時間軸與分面搜尋等互動篩選。
目前成果
已完成 8 個開發階段,從應用程式骨架演進為具備資料庫、匯入、投影、metadata 編輯、圖層、時間軸與進階搜尋的可運作工作站;架構清晰分層,便於後續加入地圖底圖與路線編輯。
作品亮點
- 自寫 OpenGL 3.3 Core Profile shader 管線,繪製自適應格線與依文化類型著色的地點,支援滑鼠平移、滾輪縮放與點擊選取
- 版本化 SQLite migration(schema_migrations 表)搭配 repository 模式,資料存取與 UI、渲染徹底解耦
- GeoCoordinateTransformer 將經緯度投影為本地公尺座標,並保留無座標資料的 fallback 與投影摘要資訊
- 完整分層架構:model / repository / service / ui / opengl / utils 各司其職,避免 MainWindow 變成義大利麵
- 互動式圖層、時間軸播放與分面搜尋三套篩選狀態統一驅動地圖重繪
- CMake 特別隔離 conda 工具鏈,強制以系統 c++ 解析 Qt/OpenGL,解決開發環境衝突
技術挑戰
- 在 conda 環境中 Qt6 與桌面 OpenGL 連結容易誤用 conda sysroot,需在 CMake 清空 CFLAGS/LDFLAGS 等變數並指定系統編譯器
- 以原生 OpenGL 從零實作 2D 相機、座標換算與點擊命中測試,需自行處理 screen↔world 投影與自適應格線間距
目標使用者
- 作品集審閱者與面試官
- 需要快速理解專案目的、技術棧與成熟度的技術讀者
技術亮點
- 偵測到的主要技術線索:C++17, Qt6 Widgets, OpenGL 3.3 Core, GLSL Shaders, SQLite, Qt SQL, CMake, QSS, CSV Import
- 已有 README 作為後續補齊案例研究的依據
- 尚未確認公開 GitHub repository,作品集會先標示 GitHub 待補
系統架構
此專案目前由 portfolio catalog pipeline 依 README、Git metadata、package/build 設定與素材線索建立案例頁。正式架構說明仍需依實際 source code 補齊;目前可確認的技術線索包含:C++17, Qt6 Widgets, OpenGL 3.3 Core, GLSL Shaders, SQLite, Qt SQL, CMake, QSS, CSV Import。
資料流程
目前尚未完成可公開的資料流程說明。若此專案含資料處理、AI pipeline 或後端 API,後續應補上 input、processing、storage、UI/output 的端到端流程。
專案結構
HeritageMapStudio/ README.md # project documentation, when available source files # implementation reviewed by local audit package/build config # detected capability signals
安裝與執行
This project does not expose a verified runnable web command yet. Review the README/source tree and add exact install, run, test, and build commands before interview use. No verified build command was detected. Treat the current portfolio page as a case-study placeholder until build steps are reviewed.
後續改進
- 補齊正式 README、截圖與 demo recording
- 補上架構圖、資料流程與關鍵技術決策
- 確認 build/test 狀態並更新 portfolio release report
面試說明重點
- 先說明此專案目前的成熟度與可展示範圍
- 聚焦在可驗證的技術棧、程式結構與已完成部分
- 不要宣稱尚未部署、尚未錄影或尚未測試的能力已完成
後續規劃
- 加入地圖底圖圖磚(map tile background)以提供地理脈絡
- 實作路線/路徑編輯功能
- 導入正式 GIS 投影與更完整的 metadata 來源管理