Skip to content

Repository files navigation

地图标绘编辑器 (Map Plotting Editor by AI)

一个基于 Vue 3 + Cesium 的地图标绘编辑器,支持各种标绘资源拖放、绘制、属性编辑。 本工程完全使用AI自行编写代码。

🎨 截图

截图1

✅ 主要功能

  • 支持地图标绘(点、线、面、模型等多类型),可在三维标绘环境中自由绘制和编辑;
  • 资源面板拖拽标绘对象到地图,自动计算地理坐标;
  • 标绘对象属性可视化编辑,支持基础属性和自定义扩展属性;
  • 集成虚拟文件系统(VFS),支持标绘资源的管理、导入导出;
  • 标绘环境管理:支持多标绘环境切换、实体添加/删除、地理坐标拾取;
  • 标绘数据采用GeoJSON标准并扩展专用属性,便于数据交换与兼容;
  • 支持地形、大气、光照等多种Cesium渲染效果;
  • 完全AI驱动开发,代码自动生成,便于快速迭代和扩展。

🚀 技术栈

  • 前端框架: Vue 3 + Vite
  • 3D引擎: Cesium
  • 构建工具: Vite
  • 样式: Sass
  • 网络请求: Fetch API
  • 工具库:
    • Element Plus - 主流UI组件库
    • Lodash - 实用工具函数库
    • Day.js - 轻量级日期时间库
    • Cesium - Cesium三维地图引擎 dc-sdk - 基于Cesium二次开发的WebGIS三维引擎(直接引用源代码)
    • turf - 空间分析与地理数据处理库,支持缓冲区、测距等空间计算
    • proj4 - 坐标投影转换库,实现不同坐标系间的转换与适配

📁 项目结构

plotting-editor-by-ai/
├── dc-sdk/                                   # dc-sdk源代码
├── src/
│   ├── components/                           # Vue 组件
│   │   ├── editor/                           # 编辑器 UI 组件
│   │   │   ├── PropertyPanel.vue             # 属性面板
│   │   │   ├── Toolbar.vue                   # 工具栏(支持新建、暂存、导出、导入标绘,集成localStorage与GeoJSON)
│   │   │   ├── EditorFooter.vue              # 编辑器底部状态栏
│   │   │   ├── ResourcePanel.vue             # 资源面板
│   │   │   ├── ResourceBrowser.vue           # 标绘资源浏览组件(点击选择资源,配合useDrawing管理绘制状态)
│   │   │   ├── VfsFileBrowser.vue            # 虚拟文件系统面板
│   │   │   ├── Inspector.vue                 # 对象检查器
│   │   ├── property/                         # 各种属性编辑组件
│   │   │   ├── PlotPropertyPane.vue          # 标绘环境属性编辑面板
│   │   │   ├── BasePropertyPane.vue          # 对象基础属性编辑面板
│   │   ├── dialog/                           # 各类对话框组件
│   │   │   ├── EditorConfigDialog.vue        # 编辑器配置对话框
│   │   ├── cesium/                           # 3D 标绘环境组件
│   │   │   ├── CesiumViewer.vue              # 地图环境主视图(初始化后自动加载localStorage暂存标绘信息)
│   ├── composables/                          # Vue Composition API 可组合函数
│   │   ├── useViewer.js                      # Cesium Viewer对象管理
│   │   ├── useObjectSelection.js             # 对象选择功能
│   │   ├── useAssets.js                      # 资源管理
│   │   ├── useEditorConfig.js                # 编辑器配置响应式状态与操作方法
│   │   ├── useDrawing.js                     # 绘制状态管理(currentDrawing,设置/清空绘制资源)
│   ├── core/                                 # 核心 Cesium 逻辑
│   │   ├── PlotManager.js                    # 标绘信息管理器
│   │   ├── ObjectManager.js                  # 对象管理器
│   ├── services/                             # 数据请求和外部接口
│   │   ├── static-drive-api.js               # 静态文件系统封装
│   │   ├── vfs-server-api.js                 # 虚拟文件系统封装
│   │   ├── vfs-service.js                    # 虚拟文件系统服务
│   ├── utils/                                # 工具函数
│   │   ├── mathUtils.js                      # 数学工具
│   │   ├── geometryUtils.js                  # 几何工具
│   │   ├── fileUtils.js                      # 文件处理工具
│   ├── constants/                            # 常量定义
│   │   ├── DEFAULT_VIEWER_OPTIONS.js         # 默认Viewer配置
│   │   ├── DEFAULT_CENTER.js                 # 默认中心点配置
│   │   ├── DEFAULT_CAMERA.js                 # 默认相机配置
│   │   ├── RESOURCES.json                    # 标绘资源定义(类型、名称、图标等)
│   ├── App.vue                               # 根组件(仅负责引入Editor.vue)
│   ├── Editor.vue                            # 主编辑器组件(包含全部业务与UI)
│   ├── main.js                               # 应用入口
│   ├── main-func.js                          # 应用入口文件相关的功能函数
│   ├── style.scss                            # 全局样式
├── public/                                   # 存放无需构建的静态资源
│   ├── images/                               # 图片资源目录
│   ├── vfs/                                  # 静态资源目录(虚拟文件系统)
├── script/                                   # 脚本
│   ├── package.json                          # 脚本子项目配置
│   ├── generate-vfs.js                       # 脚本:生成虚拟文件系统的元数据
│   ├── vfs-server.js                         # 脚本:虚拟文件系统后端服务
├── index.html                                # HTML 模板
├── package.json                              # 项目配置
├── vite.config.js                            # Vite 配置
├── README.md                                 # 项目说明
├── CESIUM_CHANGELOG.md                       # Cesium 版本更新日志

🏗️ 架构设计

组件层次

  1. 主编辑器组件 (Editor.vue): 负责所有业务逻辑和UI的集成
  2. UI 层 (components/editor/, components/dialog/): 负责用户界面和交互
  3. 地图渲染层 (components/scene/): 处理 Cesium 地图场景渲染和显示
  4. 逻辑层 (composables/, core/): 业务逻辑和状态管理
  5. 服务层 (services/): 数据请求和外部接口
  6. 工具层 (utils/): 通用工具函数

技术特点

  • 响应式状态: 使用 Vue 3 Composition API 管理应用状态
  • 模块化设计: 清晰的代码组织和职责分离
  • Cesium 集成: 基于 Cesium(^1.132),使用最新 API(移除 ready/readyPromise,使用 baseLayer 等)
  • 类型安全: 良好的代码结构支持 TypeScript 迁移
  • 性能优化: 合理的组件懒加载和渲染优化

Cesium 新版特性应用

  • 使用 baseLayer 替代 imageryProvider
  • 移除对 readyreadyPromise 的依赖
  • 使用 Scene.verticalExaggeration 替代 Globe.terrainExaggeration
  • 采用 ESM 模块化,不依赖内置 RequireJS

📋 开发规范

  • 遵循 Vue 3 组合式 API 最佳实践
  • 使用 ES6+ 语法特性
  • 组件命名采用 PascalCase
  • 文件和目录命名采用 camelCase
  • Git 提交信息格式: feat: 功能描述

重要逻辑

数据结构

  • 使用GeoJSON作为标绘信息的数据结构
  • 在GeoJSON数据结构的基础上增加一些该编辑器专用的附加信息
  • 标绘信息数据结构如下:
{
    "type": "FeatureCollection",
    "features": [
        {
            "type": "Feature",
            "geometry": { // 遵循GeoJSON标准的地理信息
                "type": "Point",
                "coordinates": [116.4, 39.9]
            },
            "properties": {
                "id": "ID",
                "name": "名称",
                ...<遵循GeoJSON标准的要素属性信息>
            },
            "userData": {
                ...<编辑器专用的要素附加信息>
            }
        }
    ],
    "userData": {
        ...<编辑器专用的标绘附加信息>
    }
}
  • 标绘环境管理器(PlotManager.js)支持以下数据操作流程:
    • clearPlot(): 清空标绘环境所有实体
    • exportPlot(): 导出标绘环境数据为GeoJSON+userData结构,Feature和FeatureCollection均支持userData字段,便于扩展和编辑器专用信息存储
    • loadPlot(json): 加载GeoJSON结构标绘环境数据,根据json内容重建实体

标绘环境管理 (useViewer.js)

  • 基于 Cesium的标绘环境初始化和管理
  • 支持实体的添加、删除和管理
  • 提供地理坐标拾取功能
  • 集成地形、大气、光照等渲染效果

资源选择与绘制逻辑

  • 资源面板(ResourceBrowser.vue)展示所有可用标绘资源,点击资源后进入绘制状态(currentDrawing)。
  • 资源类型定义见src/constants/RESOURCES.json,支持point、line、polygon等类型。
  • 通过useDrawing.js统一管理当前绘制资源状态。
  • 不同资源类型的地图绘制方式如下:
    • point(点):点击地图任意位置,直接添加一个点实体。
    • 其它类型(如line、polygon等):暂未实现,后续扩展。
  • 取消原有拖拽放置方式,统一通过点击资源+地图操作实现标绘。

拖拽标绘(已废弃,见上)

  • 支持从资源面板拖拽标绘对象到地图
  • 自动计算放置位置的地理坐标
  • 支持点、线、面、模型等多种标绘类型

💯 AI

  • 本工程基本使用AI自行编写代码;
  • 开发环境:VSCode + Cline + GitHub Copilot + Claude 4 / GPT-4.1
  • .clinerules目录:存储AI规则
  • .clinetask目录:存储历史对话

About

A Map plotting editor built with Cesium and Vue.js, powered by AI.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages