Files
road-compiler/.trellis/tasks/archive/2026-08/08-26-direct-edit-map-editor/design.md

1.9 KiB
Raw Blame History

设计

技术合约不在本文重复定义。权威定义见父任务 .trellis/tasks/08-26-direct-manipulation-road-editor/design.md 的以下小节:

  • 「Handle manifest」— 客户端读取的字段与 reserves 禁入区语义。
  • 「坐标与单位分层」— 客户端渲染用 EPSG:3857指针位移换米必须先回 4326 再用球面距离。
  • 「预览时序与延迟预算」— 80ms 防抖、pointerup 最终请求、previewSeq 乱序丢弃、degraded 处理。
  • 「交互与预览」「编辑所有权」— 只读基线图层、三个独立 source、道路区间与 junction reserve 的边界。
  • 「客户端边界」— 遗留 app.js 不在范围、vitest 覆盖范围。
  • 「上线与回滚形态」— directEdit 开关默认关闭时的行为。

输入 adapter 的候选、探针退出条件与回退优先级见父任务 research/canvas-integration.md

本子任务的局部决定

  • 三个 source 严格分离:editHandles(手柄)、editGhost(客户端即时轮廓与辅助线)、editPreview(服务端权威几何)。基线图层始终只读,绝不写入。
  • 手柄 feature 的 properties 只带 handleId,语义一律回 manifest 查。这样客户端没有第二份约束模型。
  • ghost 只画手柄、辅助线与半透明预估轮廓,不承担权威几何。服务端预览到达后替换 editPreviewghost 随即淡出。
  • EditSession 是纯逻辑对象,不持有 OpenLayers 引用命令栈、undo/redo、previewSeq 仲裁都可在 node 环境下单测。OL 只作为它的输入输出适配层。
  • previewSeq 仲裁放在 EditSession 而非请求层:请求层只负责发与取消,丢弃决策要可测。
  • 探针独立成可删除目录,不进 MapCanvas。探针结论只影响"手柄命中与拖拽由谁实现",不影响上面任何一条。
  • 开关关闭时不注册 interaction、不请求 manifest、不创建三个 source确保零残留开销。