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

4.0 KiB
Raw Blame History

主地图道路区间编辑器

父任务:.trellis/tasks/08-26-direct-manipulation-road-editor。需求来源与权威合约在父任务的 prd.md / design.md

目标

在主地图上实现道路内部区间的直接操纵:外缘、步行带、车道分隔与区间范围可拖,拖拽即时有 ghost服务端返回权威预览改动可撤销、可保存。

顺序依赖

前置:direct-edit-solver-api 的第 2 步handle manifest交付后即可开工完整验收需要其预览与保存端点全部就绪。 后继:direct-edit-junction-tools 复用本任务的 EditSession、ghost/preview 图层与命令栈。

范围

  • ol-ext Transform 的限时隔离探针,以及不通过时的原生 OpenLayers 回退。
  • selection → handle manifest 的读取与渲染handles / ghost / preview 三个独立 source。
  • 四类可拖能力:外缘偏移、步行带宽度、车道分隔位置、区间范围控制。
  • EditSession命令栈、undo/redo、应用/保存/取消。
  • 80ms 防抖预览、pointerup 强制最终请求、previewSeq 乱序丢弃、AbortController 取消在途请求。
  • 无效草稿的诊断反馈,保留最后一个有效预览。
  • directEdit 开关,默认关闭。

不做

  • 路口 reserve 内的任何编辑(属 direct-edit-junction-tools)。
  • 遗留 workbench/client/app.js 的同步或删除。
  • OSM 中心线与拓扑的编辑。

验收标准

  • 选中道路后出现手柄,拖拽前后 OpenLayers Map 为同一实例,未被重建。
  • 拖动外缘 → 道路面、步行带、车道线、标线、connector 一致更新,只有受影响 source 被替换。
  • 车道分隔手柄可独立调整某条分隔线,效果不等价于外缘偏移的副作用。
  • 区间范围手柄可修改影响区间,两端平滑过渡回基线。
  • 落在 junction reserve 内的手柄不可拖动,并提示进入 JunctionTools
  • 连续快速拖拽后松手,最终几何与松手位置一致,无回跳。
  • 违反不变量的草稿显示阻塞诊断,地图停在最后一个有效预览。
  • 未保存编辑可撤销/重做;保存后重新编译几何不变,约束状态 exact
  • 客户端单元测试覆盖:命令栈与 undo/redo、previewSeq 乱序丢弃、handle 事件到约束值的投影、米制换算在不同纬度的正确性。
  • 关闭 directEdit 开关后,工作台行为与当前 main 一致。
  • npm run format:checknpm run testnpm run test:clientnpm run test:client:unitnpm run build 全绿。

交付状态2026-08-28 收口)

11 条里 9 条通过2 条显式接受为未通过,不勾选:

条目 结论
区间范围手柄可修改影响区间,两端平滑过渡回基线 阻塞compileGeometry() 不读 profile.interval / profile.transitions,每次编辑都作用于整条路。纯逻辑(intervalRangeHandlesprojectIntervalEndcoordinateAtStation已交付并单测UI 由 intervalEditingSupported = false 隐藏——拖了没效果的控件比没有控件更糟。详见 research/interval-not-applied.md,含实现路径。
落在 junction reserve 内的手柄不可拖动,并提示进入 JunctionTools 实现完成但无法在用户数据上演示。判据(可编辑带 < 道路宽度)已实现,fengshu-er-road.osm 上实测 6 段置灰共 35 个手柄;用户导入的片区 125 个手柄全部可编辑,因为不存在被两个路口填满的短路段。由 test/direct-edit-solver.js 的 sandwich fixture 覆盖。

其余 9 条1、2、3、6、7、10 由用户浏览器手测确认8 的保存与重放由用户手测加 test/workbench-edit-api.js 断言9 为 97 个客户端单测11 为门禁。

本任务实施期间修掉的三个缺陷,均为跨层接线而非逻辑错误,已写入 spec 道路手柄左右放错边、约束未随 operation 发送、/api/import 未安装 compileFresh。 后者早于直接编辑存在,一直让 UI 导入的会话无法重新生成。