chore(task): plan crosswalk element editor experiment

This commit is contained in:
2026-08-28 17:57:37 +08:00
parent b2da3b6866
commit a0af1c0e84
6 changed files with 204 additions and 0 deletions

View File

@@ -0,0 +1,63 @@
# 斑马线元素级编辑器实验
## 目标
验证“元素级编辑器”能取代只显示固定道路参数手柄的交互:用户点击一组斑马线的任一条带后,整组进入选中状态,地图显示该元素的编辑控件,参数表单与地图操作都能预览、保存和撤销同一份结构化编辑。
斑马线是实验对象,实验通过后才抽象和推广到停止线、箭头、信号灯等元素。
## 已确认的事实
- 当前 `junction-crosswalk-inset` 只改变斑马线相对路口的位置;控制手柄属于被选道路的进口,而非具体斑马线。
- `compileControlMarkings()` 为一组斑马线生成多条 `crosswalk` GeoJSON feature每条 feature 的属性目前不足以作为稳定的组级编辑目标。
- 浏览器已有 `EditSession`、服务端权威 preview、保存、重编译与撤销链路。编辑数据必须保持语义约束不得保存派生 GeoJSON 或屏幕坐标。
- 当前普通道路级手柄仍服务于横断面参数,不应与元素级选择共用或互相覆盖。
## 范围
### 第一阶段:元素选择与位置闭环
1. 点击任意一条斑马线条带,选中整组斑马线;点击空白处或另一道路元素清除或切换选择。
2. 后端为每组斑马线发布稳定 `elementId`、元素类型、语义锚点、可编辑参数与受影响 feature ID客户端不得由 feature 数组位置猜测分组。
3. 选中后显示轻量的元素级编辑状态,至少有位置控制;移动只允许沿该进口定义的合法轴和范围,钳位来自服务端 manifest。
4. 位置控制和参数表单共同更新既有 `junction-crosswalk-inset` 约束,并复用 preview、保存、撤销与重编译链路。
5. 表单显示当前值、单位、合法范围和阻塞性诊断;修改后更新地图预览,保存后重新编译仍为 `exact`
### 第二阶段:尺寸与外观闭环(本任务内设计、第一阶段通过后实施)
1. 选中框提供与斑马线语义相符的长度/宽度调整,不写自由像素缩放。
2. 表单可修改斑马线长度、宽度、条带数量和条带间距;地图控件与表单写同一结构化元素参数。
3. 编译器消费这些参数生成整组条带,并对不合法组合返回阻塞诊断。
## 明确不做
- 不实现通用的任意旋转、自由二维移动、任意缩放或把 transform 矩阵持久化。
- 不编辑多组斑马线,不跨进口/跨路口拖放,不改变 OSM 中心线或路口拓扑。
- 不在本任务中推广停止线、箭头或信号灯;不提前建立“所有元素”的大而全抽象。
- 不移除或改变道路横断面、路口 shape 的现有手柄和所有权。
## 验收标准
- [ ] 点击一条条带后,整组条带显示为同一选中元素;切换到另一组或空白处时状态正确更新。
- [ ] `elementId` 在同一输入、重编译、保存和重新加载后稳定;同组条带共享一个 ID不同斑马线不共享。
- [ ] 移动控件与表单修改位置时,预览只更新该元素及其声明的受影响层;无效输入保留最后一个有效预览并显示诊断。
- [ ] 保存、刷新、重新编译后位置不回退,相关约束状态为 `exact`;未保存编辑可以撤销/重做。
- [ ] 第二阶段完成后,长度/宽度/条带数量/间距能从表单和地图控件一致地更新,非法尺寸或间距被拒绝而非静默修复。
- [ ] 现有道路级手柄仍可独立工作,且未选中斑马线时不显示元素编辑 UI。
- [ ] `npm run format:check``npm run test``npm run test:client``npm run test:client:unit``npm run build` 通过。
## 风险与门槛
- 第一阶段必须先证明 feature -> element -> semantic anchor 的稳定回链,以及非空约束确实改变正式编译输出;两者任一失败时停止,不进入尺寸和外观参数。
- 选中框是交互反馈,不能成为第二个几何模型;所有位置、范围和尺寸的权威值由后端 element manifest 给出。
- 当前地图 feature 的属性可能缺少足以识别 crossing 的稳定字段。需要先通过编译器补充,不可在客户端按经纬度近似聚类。
## Acceptance Criteria
- [ ] TBD
## Notes
- Keep `prd.md` focused on requirements, constraints, and acceptance criteria.
- Lightweight tasks can remain PRD-only.
- For complex tasks, add `design.md` for technical design and `implement.md` for execution planning before `task.py start`.