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

9.6 KiB
Raw Permalink Blame History

二维数据集视图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/pageclassifyType=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 切片 三维分析
??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 集合应当是足迹型,而非把所有非三维体都塞进来。

待产品确认

  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. 分类:补全 dimensionOfddCode→维度2D 集合 = 足迹型。DsRow 无需新字段(后端无此字段)。
  2. 渲染
    • 线(测线/轨迹)→ 复用 buildSurveyLine / addSurveyLine(已存在),在当前 3D 场景画(不切 Map2D 模式)。
    • 点(电极/传感器)→ 复用 ElectrodeActor / 点 actor。
    • 面状栅格(若纳入)→ 收尾 GridContourActor 成水平等值面着色复用帘面刚修正的「banded + 上界 stop 取色 + 满 RGB」共享函数。
  3. Z 摆放view2DModeChanged(关闭/Z=0/顶部/底部/自定义)+ customZChanged → 控制 2D 层世界 Z。
  4. 接线main.cppcol2D()->checkedDatasetsChanged → 新增 setChecked2DDatasetsZ 模式信号接入。底图已就绪。
  5. 配准:共享 GeoLocalFrame,与帘面/测线同系。

7. 参考 / 实证

  • 真实端点base http://tenant.geomative.cn/pop-apiheader geomativeauthorization: Geomative <token>
    • 项目 POST /business/my/profile/project/page
    • 结构 GET /business/projectStruct/queryProjectStruct/{projectId}
    • 数据集 POST /business/dsObject/data/pagebody 含 projectId/structParentId/structParentConfType/classifyTypeList:[3]/pageNo/pageSize
    • dataView 结构 POST /business/projectWorkbench/queryProjectStruct
  • 桌面端:Api3dRepository::dimensionOf(待补全)、VtkSceneControllerMap2D/View3D + addSurveyLineColumn2DDataset(信号 checkedDatasetsChanged / view2DModeChanged / customZChanged 已定义、main.cpp 仅接 basemap