135 lines
9.0 KiB
Markdown
135 lines
9.0 KiB
Markdown
# 二维数据集视图(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>
|