geopro/docs/superpowers/specs/2026-06-22-2d-dataset-vtk-v...

135 lines
9.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.

# 二维数据集视图VTK 2D 渲染)设计 — 调研与取舍
> 日期 2026-06-22。分支 `feat/vtk-3d-view`。
> 起因:需求"二维数据集视图 = 筛选勾选对象中、ds 类型显示属性为 2D 的数据集,勾选后显示在 VTK 的 2D 视图"。
> **此面板是客户端独有功能,原版 web 无对应面板**(无可照抄的实现)。
---
## 1. 需求原文
```
筛选对象列表中所勾选的对象中、ds 类型的显示属性为 2D 的数据集
勾选一个或者多个数据集,可显示在 VTK 的 2D 视图
```
经与用户确认「VTK 的 2D 视图」= **2D 数据平铺进当前 3D 地图**(不另开正交视口),由二维数据集栏的 `view2DMode`(关闭 / Z=0 / 顶部 / 底部 / 自定义)+ `customZ` 控制摆放高度,叠在底图(天地图/Google之上多选可叠多张。共享同一 `GeoLocalFrame` 配准。
---
## 2. 关键调研结论:后端无「显示属性」字段(实测 API 确认)
用真实 token 拉了 `项目列表 → 项目结构 → 数据集列表` 三级接口(`http://tenant.geomative.cn/pop-api`
- 数据集列表 `POST /business/dsObject/data/page`**classifyType=3** 为数据,非 2返回的每条 ds
```
ddCode(如 dd_inversion_data)、dsTypeCode("ERT platform inversion data")、
dsTypeId、name(类型名)、dsName、dsClassifyType=3、
properties[](confFieldId→value采集时间/CRS/点数/日期…)、parentId/source*…
```
**没有任何 2D/3D、dimension、display、显示 字段。**
- dataView 用的 `POST /business/projectWorkbench/queryProjectStruct` 只返回树节点type 1/2/3同样无维度。
- `properties` 里的 confField 是采集元数据(时间/坐标系/点数),不是显示属性。
**结论**「ds 类型的显示属性为 2D」**不是后端字段**,只能是**客户端按 `ddCode` 自定义的分类**。桌面端其实已有这张表 —— `Api3dRepository::dimensionOf` / `LocalSample3dRepository::dimensionOf`(标了 TODO它**就是**「显示属性」的实现,只是当前不完整(仅 `dd_trajectory_data`→2D其余 3D/Other
> 即:要做这个需求,等于**客户端定义/补全 ddCode→显示维度 映射**,后端给不了真值。
---
## 3. ddCode 形态台账(取自原版 datasetInfo 的 ddCode→详情组件映射 + 行业语义)
| ddCode | 详情组件 / 含义 | 空间形态 |
|---|---|---|
| dd_trajectory_data | ElectrodeCom 电极/测线 | **线**lat/lon 序列)|
| dd_transient_electromagnetic_trajectory_data | BatteryComMapLineCom 瞬变电磁测线 | **线** |
| dd_radar_channel_trajectory / dd_radar_rtk_trajectory | 雷达通道/RTK 轨迹 | **线** |
| dd_inversion_data | ContourCom 等值面 | **竖直剖面**(沿测线距离 × 深度)|
| dd_ert_measurement_data | ScattersCom 散点 | **拟剖面**(电极对 × 视深,散点)|
| dd_ert_measurement_gr_data | GroundResistanceCom 接地电阻 | 沿线序列 |
| dd_gpr_channel_image / dd_radar / dd_gpr_channel_detail | 雷达图像/成果 | **竖直 B-scan**(沿轨迹 × 时深)|
| dd_grid | DdGridCom 网格 | 网格(**面 or 剖面,依数据而定,存疑**|
| dd_voxel / dd_Structual3D / dd_Property3D | 体素 / 结构 / 属性 3D | **三维体** |
| dd_3d_show | ThreeModelCom 3D 模型 | **三维模型** |
| dd_slice | 切片 | 三维分析 |
---
## 4. 专业 + 用户视角哪些值得作为「2D 渲染到 VTK」业务价值导向不凑功能
中央 VTK 视图是**地理配准的 3D 地图**(地形 + 底图 + 共享 frame。"2D 渲染进去"= 把数据**摆到地图上**。按数据的空间本质分三类:
### 4.1 地理足迹型(线 / 点 / 面)—— 有真业务价值 ✅
- **测线 / 轨迹**dd_trajectory_data、各类 *_trajectory本就是地面上一串 lat/lon = 物理测线/电极布设/雷达轨迹。
- **电极 / 传感器点位**:地理点。
- **真·面状栅格**若存在lat×lon 的面值网格,如地表某物性面)。
**价值**:回答"survey 做在**哪**、多条线/对象**空间怎么排布**、覆盖范围、异常相对地图/地形在**哪**"。对**没有三维体表示的纯 2D 数据(轨迹、点)**,地图平铺是它**唯一**的空间表达。daily 工程价值高。
### 4.2 竖直剖面型(反演剖面 / 雷达 B-scan / 拟剖面)—— 平铺进地图**没有业务价值** ❌
- 这类数据是"距离 × **深度**"。把它**平铺**到水平地图上,等于让"深度"当地图的水平轴 —— **地理上无意义、且误导**
- 它们的正确表达是:
- **3D 视图**里沿测线**立成帘面**(地理竖直切片,已实现);
- **2D 详情面板**`GridDataChartView` / Qwt里**正视读图**(距离 × 深度,地球物理师标准看图方式,已实现)。
- 再把剖面图平铺到地图 = **凑功能**,无增量价值。
### 4.3 三维体型voxel / 结构 / 属性 / 3D 模型)—— 不属于 2D
走 3D 渲染(体素/模型),不在本面板范围。
### 4.4 用户视角佐证
- **野外/项目工程师**:要"我测在哪、线怎么排、异常落在地图哪个位置" → **足迹型**每天用。
- **解释员**剖面要么正视读详情面板、要么看帘面3D**绝不**会想看一张平铺在地图上的剖面。
---
## 5. 建议(结论)
**二维数据集视图的真实业务价值 = 地图上的「平面/足迹层」**:把**本质是平面/线、且没有有意义三维体表示**的数据集,按地理位置摆到 3D 地图上,提供空间上下文与覆盖总览。
- **纳入 2D 渲染(足迹)**:测线/轨迹类(线)、电极/传感器点位(点)、真·面状栅格(面,若有)。
- **不纳入**:反演剖面、雷达 B-scan、拟剖面等**竖直剖面**——它们已有"3D 帘面 + 2D 详情正视图"两条更对的表达,平铺地图无价值且误导。
- **dd_grid 存疑**:需确认其数据到底是"面状栅格"(→ 纳入)还是"剖面网格"(→ 不纳入)。
> 即 `dimensionOf` 的 2D 集合应当是**足迹型**,而非把所有非三维体都塞进来。
### 待产品确认
1. 2D 集合是否就取"足迹型"(测线/轨迹 + 点位 + 面状栅格)?
2. `dd_inversion_data` 是否**坚持不进** 2D 面板(按 §4.2,建议不进;它进 3D 栏渲帘面 + 详情面板正视)?
3. `dd_grid` 的真实数据形态(面 / 剖面)?
---
## 5.1 关键数据路径发现(影响实现规模)
`VtkSceneController` 持**两个仓储**
- `dsRepo_` = **`LocalSampleRepository`(样本数据)**`grid(dsId)=dsRepo_.loadGrid` 只有内置样本网格grid1 等)。**现有 Map2D 的 `addSurveyLine(grid(dsId))` 用的就是样本数据,不是真实后端**,且 Map2D 模式从不激活。
- `sceneRepo_` = **`Api3dRepository`真实后端async**:帘面 `loadSection` / 体 `loadVolume` 走真实 ERT 端点。
**结论**:渲染**真实** 2D 足迹**不能复用样本测线路径**,需在 `Api3dRepository` 加**真实异步足迹加载器**。轨迹线端点已存在:`GET /business/dd/ert/trajectory/line?dsObjectId={id}&frontCrsCode={crs}`(返回经纬度,`ApiDatasetRepository::makeTrajectoryMap` 已在用)。
**首切片范围(可交付、可测)**:先做**轨迹线**足迹(`dd_trajectory_data` 等轨迹类)——端点确定、数据形态确定(线)。点位/面状栅格待其端点与数据形态确认后续做。
## 6. 实现路径(确认 2D 集合后)
1. **分类**:补全 `dimensionOf`ddCode→维度2D 集合 = 足迹型。DsRow 无需新字段(后端无此字段)。
2. **渲染**
- 线(测线/轨迹)→ 复用 `buildSurveyLine` / `addSurveyLine`(已存在),在**当前 3D 场景**画(不切 Map2D 模式)。
- 点(电极/传感器)→ 复用 `ElectrodeActor` / 点 actor。
- 面状栅格(若纳入)→ 收尾 `GridContourActor` 成水平等值面着色复用帘面刚修正的「banded + 上界 stop 取色 + 满 RGB」共享函数。
3. **Z 摆放**`view2DModeChanged`(关闭/Z=0/顶部/底部/自定义)+ `customZChanged` → 控制 2D 层世界 Z。
4. **接线**main.cpp`col2D()->checkedDatasetsChanged` → 新增 `setChecked2DDatasets`Z 模式信号接入。底图已就绪。
5. **配准**:共享 `GeoLocalFrame`,与帘面/测线同系。
---
## 7. 参考 / 实证
- 真实端点base `http://tenant.geomative.cn/pop-api`header `geomativeauthorization: Geomative <token>`
- 项目 `POST /business/my/profile/project/page`
- 结构 `GET /business/projectStruct/queryProjectStruct/{projectId}`
- 数据集 `POST /business/dsObject/data/page`body 含 projectId/structParentId/structParentConfType/`classifyTypeList:[3]`/pageNo/pageSize
- dataView 结构 `POST /business/projectWorkbench/queryProjectStruct`
- 桌面端:`Api3dRepository::dimensionOf`(待补全)、`VtkSceneController`Map2D/View3D + addSurveyLine、`Column2DDataset`(信号 checkedDatasetsChanged / view2DModeChanged / customZChanged 已定义、main.cpp 仅接 basemap
</content>
</invoke>