9.6 KiB
二维数据集视图(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:
没有任何 2D/3D、dimension、display、显示 字段。ddCode(如 dd_inversion_data)、dsTypeCode("ERT platform inversion data")、 dsTypeId、name(类型名)、dsName、dsClassifyType=3、 properties[](confFieldId→value:采集时间/CRS/点数/日期…)、parentId/source*… - 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 | 切片 | 三维分析 |
| ??dd_time_sensor | TimingSensor 时序传感器(折线图+数据表) | 时序曲线(非空间)待确认 |
| ??dd_current_method_indicator | DdElectricDetectionCom 电流法指标(指标表+散点状态图) | 指标/状态(非空间)待确认 |
??标记:原版 datasetInfo 有此详情组件,但初版台账漏列,详情视图是否纳入客户端范围待确认(2026-06-22 补)。雷达/GPR 家族(//标记)因客户端将重构、客户需求未定,整体搁置。
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 集合应当是足迹型,而非把所有非三维体都塞进来。
待产品确认
- 2D 集合是否就取"足迹型"(测线/轨迹 + 点位 + 面状栅格)?
dd_inversion_data是否坚持不进 2D 面板(按 §4.2,建议不进;它进 3D 栏渲帘面 + 详情面板正视)?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 集合后)
- 分类:补全
dimensionOf(ddCode→维度),2D 集合 = 足迹型。DsRow 无需新字段(后端无此字段)。 - 渲染:
- 线(测线/轨迹)→ 复用
buildSurveyLine/addSurveyLine(已存在),在当前 3D 场景画(不切 Map2D 模式)。 - 点(电极/传感器)→ 复用
ElectrodeActor/ 点 actor。 - 面状栅格(若纳入)→ 收尾
GridContourActor成水平等值面,着色复用帘面刚修正的「banded + 上界 stop 取色 + 满 RGB」共享函数。
- 线(测线/轨迹)→ 复用
- Z 摆放:
view2DModeChanged(关闭/Z=0/顶部/底部/自定义)+customZChanged→ 控制 2D 层世界 Z。 - 接线(main.cpp):
col2D()->checkedDatasetsChanged→ 新增setChecked2DDatasets;Z 模式信号接入。底图已就绪。 - 配准:共享
GeoLocalFrame,与帘面/测线同系。
7. 参考 / 实证
- 真实端点(base
http://tenant.geomative.cn/pop-api,headergeomativeauthorization: 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)。