[技術重現] map3d 開源 3D 城市地圖生成工具技術解析
map3d 開源 3D 城市地圖生成工具技術解析
技術背景
問題場景:傳統 3D 城市模型製作流程繁瑣,需要手動建模或購買付費資料源(如 ArcGIS Urban),且專有格式難以跨工具流通;既有免費方案(Google Earth 3D、Cesium OSM Buildings)存在需登入、無直接 GLB 導出、格式複雜等門檻。
目標:建構一個零門檻的 Web 工具,讓使用者在地圖上框選區域後,於數秒內生成可直接匯入主流 3D 軟體的城市模型,將原本耗時數週的工作壓縮到秒級。
專案規模:GitHub 976 stars / 140 forks,MIT 協議,上線不到一年。
核心技術方法
1. 技術架構
- 前端 3D 渲染:採用 React Three Fiber (R3F),基於 Three.js 的 React 封裝層,提供宣告式 3D 場景描述。
- 構建工具:Vite(快速 HMR、開發體驗佳)。
- 資料來源:OpenStreetMap (OSM) 眾包地理資料。
2. 3D 體塊生成流程
- 使用者於 Web 介面框選地圖區域(bbox)。
- 從 OSM 拉取該區域的建築輪廓(footprint polygon)與道路網資料。
- 讀取 OSM 標籤中的
height或building:levels欄位作為高度依據。 - 將 2D 輪廓沿垂直方向擠出(extrusion)成 3D 體塊。
- 結合道路網生成完整城市場景。
- 透過 R3F / Three.js 的 GLTFExporter 導出為 GLB(glTF Binary) 格式。
3. 輸出格式選擇
選擇 GLB(glTF 2.0 Binary) 作為唯一輸出格式,理由是它是當前 3D 領域最通用的交換格式,可直接被 Unity、Blender、AR 框架、無人機平台、3D 列印切片軟體讀取,無需額外轉換。
關鍵實現細節
OSM 資料欄位
| 欄位 | 用途 | 備註 |
|---|---|---|
height |
建築高度(米) | 優先使用 |
building:levels |
樓層數 | 備援,需推算(通常每層 ~3m) |
資料精度局限(README 警告)
- OSM 為眾包資料,建築高度標註完整度依賴在地社群。
- 歐洲城市資料品質普遍較佳,發展中地區大量缺失。
- 適用場景:概念驗證、快速原型、遊戲場景、體量分析。
- 不適用場景:需精確尺寸的工程項目。
本地部署步驟
git clone https://github.com/cartesiancs/map3d.git
cd map3d
npm install
npm run dev
啟動後訪問 localhost,MIT 協議可自由修改。
Roadmap 已完成 vs 待開發
| 功能 | 狀態 |
|---|---|
| 3D 建築生成 | ✅ |
| 道路生成 | ✅ |
| GLB 導出 | ✅ |
| 建築紋理 | ❌ |
| 高度自定義(手動覆寫 OSM 錯誤資料) | ❌ |
| 材質系統 | ❌ |
可複用的技術摘要
-
R3F + Three.js GLTFExporter 組合:是 Web 端生成可下載 3D 資產的標準方案,適用於任何需要「瀏覽器內生成模型並導出」的場景。
-
OSM Overpass API 作為免費地理資料源:透過 bbox 查詢可取得建築 footprint、道路、POI 等資料,無需 API Key、無付費牆,適合輕量級地理應用。
-
2D 輪廓擠出 (Extrusion) 是城市快速建模的最簡可行方案:以 OSM polygon + height 欄位透過 Three.js 的
ExtrudeGeometry即可實作,無需複雜的 Procedural Generation。 -
GLB 作為跨平台交換格式的首選:相較於 OBJ、FBX、3D Tiles,GLB 是單一二進位檔、自帶材質、被 Unity / Blender / WebXR / 3D 列印生態全面支援,是「導出格式」的最佳預設選擇。
-
眾包資料的可信度策略:對精度敏感的應用,應預留「手動覆寫」機制(如 map3d 規劃中的 height override 功能),允許使用者修正資料源錯誤。
-
「零門檻 + 直接導出」的產品定位:對比同類工具(需登入、專有格式、付費),免登入與標準格式直出是顯著差異點,適用於工具型開源專案的定位策略。
-
MIT 協議 + Vite + React 技術棧:對個人開發者快速產出可複製、可二次開發的 Web 工具,是當下生產力最高的組合之一。