QGIS 自動化進階篇:從視覺標註 (POC2) 到空間分析 (POC3) 的進化歷程

在實現 QGIS 專案「一鍵生成」的路上,我們不僅要讓圖層「開得出來」,更要讓它「具備研究價值」。 這篇文章記錄了我們從 POC2 (樣式與標籤整合) 進化到 POC3 (空間分析與 SDM 紀律) 的完整心路歷程。這兩個階段分別解決了製圖中的「美學溝通」與「科學建模」兩大核心問題。 🎨 POC2:視覺精煉與動態標籤 (Visualization & Labeling) 目的:讓地圖「會說話」,透過自動化配置解決手動製圖中最繁瑣的排版工作。 在 POC1 成功掛載圖層後,我們發現原始的點位與線條在混亂的歷史底圖(如台灣堡圖)上極難辨識。POC2 的核心目標即是透過腳本,賦予地圖專業的視覺外觀。 1. 幾何感知的自動標註 (Geometry-aware placement) 我們實現了腳本對圖層類型的自動識別與對應配置: 點位圖層 (遺址):自動採用 Centroid 配置,讓標籤精確落在遺址中心。 線段圖層 (河流):自動切換為 Around Line (平行排列),並預設帶有 0.5mm 的偏移量。這讓河名能順著水流蜿蜒,展現專業製圖感。 2. 跨平台字型與視覺消隱 (The macOS Fix) 我們在 POC2 中遭遇了字型相容性的重擊。原本預設的字型在 Mac 上會毀掉專案解析。最終,我們強制切換為 PingFang TC (萍方-繁),並自動啟用了 0.7mm 白色光暈 (Text Buffer)。這小小的光暈,是讓地圖文字從花綠底圖中「浮現」出來的關鍵。 🛡️ POC3:空間分析中樞與 SDM 紀律 (Advanced Analysis & SDM) 目的:從「資料顯示」進化為「規律開發」,在不污染原始數據的前提下,自動生成分析模型。 當地圖變漂亮後,下一步就是「看見模式」。POC3 挑戰的是自動產出具有研究深度的分析圖層(如海拔區間與熱點圖)。 1. 恪守 SDM 紀律:絕對不改動原始資料 (Data Hub Snapshot) 開發者常為了分析方便,在原始 SQLite 裡建 View。但對歷史數據來說,原始碼應該是神聖的 (Holy Source)。 我們實作了「局部資料中樞 (Local Data Hub)」:腳本在產出專案的一瞬間,自動建立一個 poc_data_hub.db 快照。所有的 JSON 萃取、高程分區計算都只存在於這份快照中。原始 HGIS 資料庫保持 100% 乾淨,專案檔則是「可打包、可重製、可拋棄」的。 ...

2026-03-07 · 1 min · 176 words · Wuulong

軟體定義地圖:從 SQLite 到一鍵生成的 QGIS 專案自動化 (SDM)

在進行 HGIS(歷史地理資訊系統)研究時,我發現最耗時的往往不是分析數據,而是「準備地圖」。每次要開啟一個新研究,總要重複掛載百年歷史底圖、設定 KML 座標、調整 SQLite 的 SQL 篩選器…。 為了打破這個瓶頸,我發起了一場實驗:能不能像寫程式一樣,用「寫」的出一份 QGIS 專案? 這就是我最近在推動的 軟體定義地圖 (Software-Defined Maps, SDM) 概念。 🏗️ 為什麼要自動化? 如果你手動配置過 QGIS,你一定遇過這些崩潰瞬間: URL 特殊字元破壞專案:WMTS 的 URL 裡一堆 &,手動貼上 XML 常報錯。 座標系統 (CRS) 位移:明明設定了 WGS84,圖層卻飄到非洲西岸海面(座標 0,0)。 重複定義的勞力:每個專案都要重新分組(底圖、水理、點位),這應該交給機器人。 透過 Python + Jinja2 模板,我們可以把地圖專案變成可程式化的零件。 🛠️ 基本作法:Jinja2 零件化 核心思路是將 .qgs 專案檔(實質是 XML)拆解為模板。 我們建立了一個 base_project.qgs.j2,裡面預留了動態注入的內容: 層級化圖層樹:自動生成的分組。 資料源設定:SQL 篩選指令與檔案路徑。 空間參考系統:自動注入對應的 AuthID、Proj4 與 SRID。 最關鍵的「零件庫」是 GIS_KNOWLEDGE.yaml。它充當了 GIS 資源的「DNS 伺服器」,記錄了所有中研院底圖、本機 KML 與資料庫的 Metadata。 🚀 第一階段 POC:曾文溪 HGIS 數位中樞 在這次的 POC 中,我們成功實現了 Zengwen_HGIS_Hub.qgs 的一鍵產出: ...

2026-03-07 · 1 min · 144 words · Wuulong

[GIS筆記] 運用 AI 助理 Antigravity 整理「流域情報開放地圖」:以濁水溪為例

最近在研究 LASS 社群維護的 「流域情報開放地圖」 QGIS 專案,這是一個集結了政府開放資料與民間調適計畫成果的龐大資料庫。 資料雖豐富,但若只想專注於特定流域(例如:濁水溪),要從全台的圖資中「萃取」並「整理」出有結構的資料,手動操作相當繁瑣。這次我嘗試透過 AI 助理 Antigravity 來協助處理,發現這是一個非常高效的工作流,特別是針對舊式 Shapefile 資料結構的梳理。 以下分享這次的實作筆記,以及一個關鍵的發現:河川代碼 CSV 的重要性。 1. 任務目標 從全台的 GIS 圖資中,提取出 濁水溪流域 的完整資料,並轉換成 Google Earth 可用的 KMZ 格式。需求包含: 流域範圍:濁水溪集水區的面資料 (Polygon)。 河道水系:包含主流與所有支流的線資料 (Line)。 層級結構:需區分主流、一級支流(如陳有蘭溪)、二級支流(如和社溪),並以不同顏色與資料夾呈現。 2. 關鍵資料解析 在專案目錄中,主要的幾何資料位於 1-流域水文地理環境 下的 RIVERL.shp(全台中央管河川)。原本以為只要用 SQL 篩選 BASIN_NAME = '濁水溪' 即可,但 AI 分析後發現了一個隱藏的寶藏檔案: 📂 檔案位置: 河川整理資料 - 河川代碼主從 這份 CSV 檔案是解析河川「拓撲關係(Topology)」的關鍵,沒有它,GIS 圖資就只是一堆沒有從屬關係的線條。所以也很容易做出下圖 為什麼這份 CSV 很重要? Shapefile 本身雖然有 RV_NO (河川代碼),但要從代碼反推「誰是誰的上游」需要複雜的解碼邏輯。而這份 CSV 直接建立了樹狀結構: 欄位 說明 範例 (陳有蘭溪) river_id 河川唯一碼 151010 river_name 中文名稱 陳有蘭溪 in_id 注入的河川 ID (Parent) 151000 (注入濁水溪) river_link 全路徑字串 0@151000@151010 AI 應用的邏輯技巧 透過 Antigravity,我們利用 river_link 欄位快速算出了河川的「層級 (Stream Order)」,邏輯出奇簡單: ...

2026-01-11 · 2 min · 237 words · Wuulong

哈爸實驗室:技術與應用生態全景圖

哈爸實驗室:技術與應用生態全景圖 這張圖展示了「哈爸筆記」作為核心技術引擎,如何支撐並孵化出「2026 台灣河流探索」這個實踐場域。 graph TD %% === 定義可視化樣式 (Styles) === %% 核心技術區 (Core) - 藍/綠色系 classDef C_Mind fill:#e1f5fe,stroke:#01579b,stroke-width:2px; classDef C_Infra fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px; classDef C_AI fill:#fff3e0,stroke:#ef6c00,stroke-width:2px; classDef C_Comm fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px; %% 應用場景區 (River) - 大地色/深色系 classDef R_Vision fill:#4285F4,stroke:#0d47a1,stroke-width:2px,color:white; classDef R_Content fill:#F9A825,stroke:#f57f17,stroke-width:2px,color:black; classDef R_Tech fill:#2E7D32,stroke:#1b5e20,stroke-width:2px,color:white; classDef R_Meta fill:#607D8B,stroke:#263238,stroke-width:2px,color:white; %% === Core Domain: 哈爸筆記技術堆疊 === subgraph CoreDomain [🛠️ Core Tech: 哈爸筆記技術堆疊] direction TB subgraph C_Phase1 [GenAI 思維模組] Expert(複製專家思維):::C_Mind V2B(Voice-to-Blog 自動化):::C_Mind Insight(GAI 年會洞察):::C_Mind Insight --> Expert --> V2B end subgraph C_Phase2 [雲端基礎建設] GCP(GCP 成本優化):::C_Infra Zeabur(Zeabur 部署 n8n):::C_Infra CloudAI(AI 雲端管理):::C_Infra CloudAI --> GCP --> Zeabur end subgraph C_Phase3 [Agentic AI 實作] BotDebug(Discord Bot):::C_AI Agent(打造 Agentic AI):::C_AI Tool_SQL(SQL 資料庫工具):::C_AI Zeabur --> |提供算力| BotDebug --> Agent --> Tool_SQL end subgraph C_Phase4 [社群擴散] HabaLab(哈爸實驗室 Discord):::C_Comm Event(機械系 50 週年):::C_Comm Agent --> |賦能| HabaLab HabaLab --> Event end end %% === Application Domain: 河流探索計畫 === subgraph AppDomain [🌊 Field App: 2026 台灣河流探索] direction TB subgraph R_Phase1 [願景與方法] Method1(數位河流學):::R_Vision Infra(個人文章網站):::R_Meta end subgraph R_Phase3 [實地探索] Trip1(大甲溪車宿攻略):::R_Content Trip2(后里/高美指南):::R_Content Trip1 --> Trip2 end subgraph R_Phase4 [GIS與數據深化] Data1(Shapefile 轉 KML):::R_Tech Data2(River Buffer 萃取):::R_Tech Schema(SQL Schema 設計):::R_Tech Data1 --> Data2 --> Schema end subgraph R_Phase5 [工具賦能] Tool_Fab(Fabric + Gemini CLI):::R_Tech end end %% === 跨域整合連接 (The Merger) === %% 1. 基礎設施共用 V2B ==> |內容發布| Infra Infra ==> |載體| Trip1 %% 2. 技術賦能 (Agentic AI -> GIS Tech) Agent -.-> |技術指導| Tool_Fab Tool_Fab -.-> |自動化處理| Data1 %% 3. 社群匯流 HabaLab ==> |探索基地| Method1 Method1 --> |指導| Trip1 %% 4. 資料庫整合 Tool_SQL -.-> |Schema 參考| Schema

2025-12-19 · 2 min · 236 words · Wuulong

大甲溪散步地圖:SQLite Schema 設計 (AI 友善 WKT 版本)

散步地圖資料庫 Schema 設計 (AI 友善版) 導言 本文件旨在闡述為「大甲溪散步地圖」專案設計的 SQLite 資料庫 Schema。此設計特別考量了 GenAI 協作 (Agentic Workflow) 的需求,選擇使用標準的 WKT (Well-Known Text) 格式來處理地理空間資料,取代依賴性較高的 SpatiaLite 二進位格式。這確保了從資料蒐集、AI 處理到 QGIS 呈現的過程中,資料具有最高的可讀性與移植性。 整體設計哲學 核心資料結構化:確保地理特徵的基本資訊(名稱、描述、類型)保持一致性,便於查詢與管理。 非核心資料彈性化:利用 JSON 格式的 meta_data 欄位,提供高度彈性來儲存多樣化且不斷演進的非核心屬性。 AI 幾何可讀性 (WKT):全面採用 WKT 字串儲存幾何資料,讓 AI 代理能直接理解、生成與驗證座標,無需複雜的 GIS 驅動程式。 圖層正規化管理:獨立的 layers 表格用於管理圖層的分類和 QGIS 呈現樣式。 AI 協作友好:結構化且彈性的 Schema 設計,極大地方便 AI 代理進行資料的自動化處理、分析與驗證。 社區 GIS 背景資訊與 Layer 分類設計架構 社區 GIS 背景資訊 「社區 GIS」強調地理資訊系統在社區層級的應用,旨在支援地方居民參與、資源管理、文化保存、社會服務及永續發展。這類專案的核心在於將多樣化的在地資訊(例如:親水點、交通、設施、風險、文化景點、生態熱點等)以地理空間的形式進行收集、組織、分析與視覺化。其資料分類通常會考量到以下幾個面向: 功能應用:資料服務於哪種社區需求(如防災、生態教育、文化導覽)。 資料類型:具體的地理實體是什麼(點、線、面,以及相關屬性)。 使用者視角:如何讓在地居民和外部使用者最直觀地理解地圖內容。 Layer 分類設計架構 為呼應社區 GIS 的精神,並支援 QGIS 等工具的靈活呈現,我們特別設計了 layers 表格來管理圖層的分類。其核心架構為 layer_type (主分類) 與 layer_subtype (次分類) 的組合,這種層次化設計有以下優點: ...

2025-12-14 · 3 min · 634 words · Wuulong

散步地圖的概念與應用:從移動軌跡看見在地紋理

什麼是「散步地圖」? 在我們進行河流探索時,地圖不僅是導航的工具,更是一種「策展」的媒介。 散步地圖的核心概念,是透過地圖串聯更多的協力與情報,並利用群眾的移動軌跡描繪出有意義的資訊。這與我們強調的公私協力、開放資料精神不謀而合。 以下整理了散步地圖的核心價值與建構方法: 1. 目的與價值:為什麼要畫地圖? 串聯協力:地圖是一個平台,能將分散的個人、店家、組織串聯起來,形成夥伴關係。 在地參與:鼓勵人們走出戶外,透過「走讀」產生對環境的直接關懷。 議題關注/績效評估: 透過地圖點出被忽視的「暗點」(如髒亂點、斷點)。 利用短網址 QRcode 追蹤使用率,評估活動成效。 商業與再生:人流即金流,散步活動能活絡在地經濟,推動地方再生。 2. 圖層解構:地圖裡該有什麼? 散步地圖就像千層蛋糕,由不同屬性的圖層 (Layers) 堆疊而成: A. 基礎骨架 點 (Points):具有意義的興趣點(POI),如古蹟、老樹、特色小店。 線 (Lines):推薦的散步路徑、自行車道。 水 (Water):重要的圳路圖資(幹線、支線),這在河流探索中尤為重要。 B. 情報層 (Information) 環境/生態: 水質監測點(清澈 vs 污染)。 生態庇護所、可下水的親水點。 維護管理: 清潔地圖:垃圾桶位置、髒亂點回報。 文史脈絡: 歷史古圳(如新竹隆恩圳、汀甫圳)的遺跡。 消失的河道。 C. 群眾層 (Crowdsourcing) 公民標記:結合 iNaturalist 或其他工具,讓參與者標記生態發現或垃圾熱點。 3. 如何開始?建構工具箱 🧰 Step 1: 資料收集 (Data Collection) 移動軌跡:利用手機 APP (如 Relive, Strava) 記錄散步路徑,匯出 GPX 格式。這是最真實的「路」。 圖像紀錄:使用開啟 GPS 定位的相機/手機拍照,確保照片帶有經緯度 (Geo-tagging),方便後續展圖。 基礎圖資:下載政府開放資料(國土測繪中心 WMTS、水利署資料)。 Step 2: 呈現與分析 (Visualization) QGIS:最強大的開源 GIS 軟體,用來疊合上述所有資料。 Google My Maps:輕量級的展示工具,適合大眾導覽。 4. 實踐發想:從大新竹到大甲溪 我們可以嘗試將我們在「流域學校」或「大新竹區域」學到的經驗複製: ...

2025-12-13 · 1 min · 84 words · Wuulong