在構建「WalkGIS —— 全台散步地圖」專案的過程中,我與 AI Agent (Antigravity) 進行了一場深度的架構辯論。核心問題在於:當我們希望 AI 能像人類一樣理解地圖時,傳統的 GIS 資料庫還是最好的選擇嗎?

這篇文章記錄了我們如何從傳統的 SpatiaLite 方案,轉向一個更輕量、更適合 LLM 的 “Text-based GIS” 架構。

1. 痛點:AI 讀不懂二進位碼 (Binary Blob)#

起初,我們理所當然地選擇了 SpatiaLite 作為 SQLite 的空間擴充。它是業界標準,功能強大。但是,當我嘗試讓 Agent 讀取資料庫時,問題出現了:

Agent: “我讀取到了 geometry 欄位,但它是 binary blob,我無法直接解析它的座標。”

SpatiaLite 為了效能,將幾何資料存為二進位格式。這對 QGIS 很好,但對 LLM 來說,就像是一本無字天書。如果要讓 Agent 理解「后里馬場在哪裡?」,我們必須寫額外的 Python 程式碼去解碼它,這增加了依賴度與複雜性。

2. 決策:擁抱 WKT (AI-First Approach)#

既然我們的目標是 “Agentic GIS”,為什麼不直接存成文字呢? 於是,我們做了一個大膽的決定:棄用 SpatiaLite,擁抱 WKT (Well-Known Text)。

我們將 DB Schema 修改如下:

CREATE TABLE walking_map_features (
    id INTEGER PRIMARY KEY,
    name TEXT NOT NULL,
    -- geometry BLOB,  <-- 傳統做法 (X)
    geometry_wkt TEXT NOT NULL  -- 新做法 (O) : POINT(120.735 24.298)
);

這個改變帶來的紅利是巨大的:

  1. AI 原生可讀:LLM 可以直接看懂 POINT(120.7 24.2),甚至能直接生成 SQL 進行空間查詢(雖然不如 PostGIS 精確,但對散步地圖足夠了)。
  2. 零依賴 (Zero-Dependency):任何支援 SQLite 的環境都能跑,不需要由複雜的 C++ GIS Libraries 支援。
  3. MCP 友善:透過 Model Context Protocol 傳輸 JSON 時,文字格式無縫接軌。

3. 創新:用 Mermaid 畫地圖#

解決了「幾何 (Geometry)」問題,下一個挑戰是「拓樸 (Topology)」。 散步地圖往往不是單純的點,而是有順序的「路線」。傳統 GIS 用 LineString 來畫線,但它無法表達 “流程”“邏輯”

我們引入了 Mermaid Flowchart 作為地圖的邏輯描述語言,存放在 meta_data 中:

graph LR;
    %% 子圖:后豐鐵馬道
    subgraph Houfeng ["后豐鐵馬道 (4.5km)"]
        direction TB
        H1(1. 后里馬場) --> HA(樟樹平台);
        HA --> H2(2. 夫妻樹);
        H2 --> H3(3. 九號隧道);
        H3 --> H4(4. 花樑鋼橋);
        H4 --> HB(鐵道之鄉酒莊);
        HB -.-> HC(榮町雜貨店);
    end

    %% 子圖:東豐綠廊 (前段)
    subgraph Dongfeng_Start ["東豐綠廊-起點段"]
        D7(7. 豐原大道) --> Junction{綠廊交接處};
        HB --> Junction;
        Junction --> D5(5. 朴口車站);
        D5 --> HE(200days冰店);
        HE --> D6(6. 豐榮水利碑);
    end

    %% 子圖:石岡精華段與東勢段 (簡略)
    subgraph Shigang ["石岡精華..."]
        D6 --> D9(9. 石岡水壩);
        D9 --> D14(14. 情人木橋);
        D14 --> D19(19. 東勢客家園區);
    end

    classDef highlight fill:#fcf,stroke:#f00;
    class H1,H3,H4,D9,D19 highlight;

這讓 WalkGIS 不僅能告訴你東西在哪 (Where),還能告訴你怎麼走 (How)。

4. 實戰:24 個景點的自動化匯入#

有了架構,我們利用一張「后豐鐵馬道導覽圖」進行了壓力測試。 透過一個 Python 腳本,結合 AI 的視覺辨識與網路搜尋能力,我們在幾分鐘內就建立了包含 24 個景點、一條 Y 字型複雜路線的完整資料庫。

5. 結語#

WalkGIS V0.1 的誕生證明了,在 AI 時代,「可讀性 (Readability)」可能比「儲存效率 (Efficiency)」更重要。透過 WKT 與 Mermaid,我們打破了 GIS 與 LLM 之間的隔閡,讓地圖資料庫成為了一個 AI 隨時可以閱讀、理解並協作的故事書。

為了驗證架構的可行性,我們實際匯入了 24 個景點並建立了第一張地圖。以下是目前的系統狀態快照:

6.1 QGIS 視覺化成果#

透過 Virtual Layer 連接 walkgis.db,我們成功在 QGIS 地圖上渲染出所有景點 (Point) 與其屬性。

QGIS 視覺化截圖

6.2 真實地圖對照#

我們使用的底圖來源,與數位化後的資料呈現高度一致。

原始導覽地圖

6.3 資料庫實體預覽#

walkgis.db 目前的檔案狀態與 Schema 結構。

DB 檔案與 Schema 狀態

Feature 範例 (Row Data)#

這是 “后里馬場” 在資料庫中的真實樣貌。注意到 geometry_wkt 是人類可讀的文字,且 meta_data 指向了外部的 Markdown 文件。

{
  "feature_id": "20251229_houli_ranch",
  "name": "后里馬場",
  "description": "后豐鐵馬道起點,歷史悠久的馬場。",
  "geometry_type": "Point",
  "geometry_wkt": "POINT(120.73582 24.298637)",
  "meta_data": {
    "ref_doc": "features/20251229_houli_ranch.md",
    "generated_by": "batch_import"
  }
}

Map 範例 (Row Data)#

這是 “后豐東豐大環線” 的地圖定義。最精彩的部分在於 routes 欄位中儲存了完整的 Mermaid 拓樸邏輯。

{
  "map_id": "2025_houfeng_dongfeng_loop",
  "name": "后豐鐵馬道 & 東豐綠廊精華遊",
  "meta_data": {
    "difficulty": "Easy",
    "total_distance": "18km",
    "routes": {
      "main_route": "graph LR; subgraph Houfeng [\"后豐鐵馬道\"]; H1(1. 后里馬場) --> HA(樟樹平台); HA --> H2(2. 夫妻樹); H2 --> H3(3. 九號隧道); H3 --> H4(4. 花樑鋼橋); end; subgraph Dongfeng [\"東豐綠廊\"]; H4 --> Junction{交會點}; Junction --> D5(5. 朴口車站); D5 --> D9(9. 石岡水壩); D9 --> D14(14. 情人木橋); D14 --> D19(19. 東勢客家園區); end; class H1,H3,H4,D9,D19 highlight;"
    }
  }
}

AI 協作宣告 (AI Collaboration Disclosure)#

AI Generated Human Reviewed

本文內容由 AI 協作生成

  1. 素材來源:WalkGIS 專案實作與資料。
  2. 文章生成:Antigravity 協助撰寫技術筆記與釋出公告。
  3. 文章落地:Antigravity 協助排版與發布。