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

58 lines
4.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 主地图道路区间编辑器
父任务:`.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:check``npm run test``npm run test:client``npm run test:client:unit``npm run build` 全绿。
## 交付状态2026-08-28 收口)
11 条里 9 条通过2 条**显式接受为未通过**,不勾选:
| 条目 | 结论 |
| --- | --- |
| 区间范围手柄可修改影响区间,两端平滑过渡回基线 | **阻塞**`compileGeometry()` 不读 `profile.interval` / `profile.transitions`,每次编辑都作用于整条路。纯逻辑(`intervalRangeHandles``projectIntervalEnd``coordinateAtStation`已交付并单测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 导入的会话无法重新生成。