要解决的问题
密集地图数据的编辑,既需要精度,也需要响应速度。移动一个顶点,不应该让整张地图重新构建。
我做了什么
使用 React 与 deck.gl 构建编辑器,包含上下文工具、命令式撤销、Worker 导入和设备本地恢复,以新加坡作为示例工作区。
结果如何
完成可运行原型、13 项自动化测试,以及百万要素的 CPU 流程基准测试。该规模的浏览器渲染表现尚未验证。
以新加坡为编辑画布
示例覆盖莱佛士坊与直落亚逸。真实的 OpenStreetMap 道路中心线与信号位置提供地理背景;车道边界和路口范围则是可编辑的示意标注。
交互预览
直接在作品集中探索新加坡街道、绘制车道、移动顶点,并撤销修改。准备好后即可启动编辑器;导入的文件保留在你的设备上。
精确操作,不打断工作
聚焦的编辑界面
在同一工作区完成选择、绘制与检查。白色顶点手柄、吸附、快捷键及带名称的撤销步骤,让每次修改都清晰且可逆。
小修改只更新小范围
通过要素 ID 直接定位到有界数据块。一次编辑只替换受影响的数据块,保留其他 deck.gl 数据引用及其 GPU 缓冲区。
可放心取消的导入
Worker 分批解析和验证 GeoJSON。取消操作或遇到无效几何时,当前地图保持完整;只有验证通过才替换工作区。
把恢复纳入日常流程
IndexedDB 在本地保存变更的数据块。明确的保存状态和 GeoJSON 导出,为用户提供可恢复的工作区与可携带的备份。
有依据,也有边界
在 macOS、Node v26.4.0 环境的一次 CPU 测试中,处理了采用新加坡坐标的 100 万个混合要素、140 万个顶点,JSON 文件大小为 135.51 MiB。这是单次测量,不代表浏览器帧率或生产容量保证。
- JSON 解析
- 838.42 ms
- 几何验证
- 196.26 ms
- 建立索引
- 74.63 ms
- 单要素编辑
- 0.07 ms
该次运行的 Node 堆内存约为 871 MiB。解析仍需读取完整 JSON 文档;Worker 将工作移出界面线程,但不会消除内存开销。
已经实现,以及仍待验证的部分
已实现点、线、面绘制、顶点编辑、属性修改、导入导出、撤销重做和本地恢复。多部件几何可导入和管理,但顶点编辑目前仅支持单部件几何。自动化测试、TypeScript、代码检查和生产构建均已通过;浏览器交互与百万要素的 GPU 渲染仍需测试。
后续重点包括浏览器与移动端交互测试、流式导入、二进制几何、空间瓦片及更深入的拓扑验证。示例不是经过测绘的高精地图,不可用于导航。
技术栈
- React
- TypeScript
- deck.gl
- MapLibre
- Web Workers
- IndexedDB