geopro/docs/superpowers/plans/2026-06-16-vtk-3d-p5-2d-dat...

6.1 KiB
Raw Blame History

P5 二维数据集栏渲染 + 底图 Implementation Plan

接续:三栏结构重构(已完成) + 真实 ERT 帘面(已完成)。本计划做「二维数据集」栏的真实渲染 + 天地图底图。 GUI 渲染正确性须用户实测Claude 不能 GUI 测;见构建铁律)。

Goal: 「二维数据集」栏勾选 → 在 VTK 视图的 2D 俯视面渲染:轨迹线(dd_trajectory_data)、网格面(dd_grid),并叠加天地图底图(可切换 天地图/Google/隐藏)。

Architecture: 复用现有 VtkSceneController(已有 ViewMode::Map2D + addSurveyLine) + GeoLocalFrame(已重锚真实数据) + 天地图 token/WMTS(已存在于 trajectory_map.html)。新增2D 数据异步加载(轨迹/网格) + 2D actor + 底图瓦片层(VTK)。

已确认事实(真实 API/代码):

  • 天地图 tokenTK=aca91d8c9f59a4f779f39061b8a07737WMTS XYZhttp://t{0-7}.tianditu.gov.cn/{layer}_w/wmts?...&tileMatrixSet=w&TileMatrix={z}&TileRow={y}&TileCol={x}&style=default&format=tiles&tk=TK(图层 vec街道/img卫星 + cva/cia注记EPSG:3857原生 z18。见 src/app/resources/map/trajectory_map.html
  • 轨迹数据:GET /business/dd/ert/trajectory/line?dsObjectId={id}&frontCrsCode=EPSG:4326data.electrodelList[],每项 {electrodeNo, electrodeCoordinate}(经纬度)。
  • 网格数据:dd/ert/grid/rows/{id}(GET) 实测 404 → 本计划 Task 0 先确认正确端点(疑似 query 参数或 POST参考 src/app/panels/chart/GridStrategy.hpp + ApiDatasetRepositorygridRowsBatch/makeGridRows)。
  • dimensionOfdd_trajectory_data→Dim2Ddd_grid→当前 Other需加 Dim2D)。
  • col2D(Column2DDataset) 信号 basemapChanged/view2DModeChanged/customZChanged/checkedDatasetsChanged 在 main.cpp 当前未接线(T7 留待本期)。

Task 0确认 dd_grid 数据端点(先做,免后续返工)

src/app/panels/chart/GridStrategy.hpp + src/data/api/ApiDatasetRepository.cppmakeGridRows/gridRowsBatch,确认 dd_grid 详情数据的真实端点/方法/参数(dd/ert/grid/rows 的正确调用形态)+ 返回字段x/y/v? 或散点?)。产出:端点 + 字段说明,更新本计划 Task 2。

Task 1dimensionOf 加 dd_grid → Dim2D

  • src/data/repo/LocalSample3dRepository.cpp::dimensionOf + src/app/DatasetDimension.cpp::splitByDimension:把 dd_gridDim2D(现为 Other
  • 单测 tests/app/test_dataset_dimension.cppdd_grid→2D 用例。
  • 验证ctest 绿。

Task 22D 数据异步加载(轨迹 + 网格)

Api3dRepository(真实) + LocalSample3dRepository(样本 stub) 加异步方法(照 loadSection 范式):

  • loadTrajectory(dsId, onOk(vector<LatLon>), onErr):真实走 trajectory/line,解析 electrodelList[].electrodeCoordinate → 经纬序列。
  • load2dGrid(dsId, onOk(SectionData/Grid), onErr):按 Task 0 的端点解析网格面。
  • I3dSceneRepository 加这两个虚方法接口扩展LocalSample stub 返回样本/空)。
  • 验证编译绿FakeSceneRepo 加 override。

Task 32D actorrender 层)

  • 轨迹线:新增 render/actors/TrajectoryActor(或复用 MapLineActor):经 GeoLocalFrame.toLocal 把经纬序列 → 局部米折线,摆在 Z=0 平面(或 2D视图 Z。橙色对齐轨迹详情 #ff8c00)。
  • 网格面:复用 MapLineActor(俯视红线) 或 GridContourActor(着色面,需 frame)。
  • 单测:纯几何(经纬→局部米折线点数/坐标)抽出可测。

Task 4VtkSceneView + Controller 接 2D 渲染

  • I3dSceneView/VtkSceneViewaddTrajectory(...)add2dGrid(...)
  • VtkSceneControllerMap2D 分支里,对勾选的 2D ds 按维度调 loadTrajectory/load2dGrid → addTrajectory/add2dGrid异步 + QPointer/gen 守护,照帘面范式)。
  • setViewModecol2D 的「2D视图位置」(关闭/Z=0/顶部/底部/自定义Z) 控制 2D 面的 Z自定义Z=世界绝对米,见三栏 spec

Task 5main.cpp 接 col2D 信号

  • drawer->col2D()checkedDatasetsChanged → 渲染 2D ds同 col3D 模式,按维度过滤后的真实 dsId
  • view2DModeChanged/customZChanged → setViewMode + 2D 面 Z。
  • basemapChanged → Task 6 底图开关。
  • 验证:编译绿 + 用户实测(勾选轨迹 ds → 俯视面出橙色测线;网格 ds → 面)。

Task 6天地图底图瓦片层最复杂可独立验证

新增 render/ground/TileGroundLayer

  • 输入:当前数据地理范围(从已渲染 actor 的 lat/lon 包围盒,或 GeoLocalFrame 原点 + 视域)→ 选合适 zoom数据跨度→z
  • 瓦片数学EPSG:3857 经纬→TileRow/Col标准 Web Mercator 瓦片公式),取覆盖范围的瓦片集。
  • 异步拉取:QNetworkAccessManager GET 天地图 WMTS URLtoken/子域见上)→ QImage → vtkTexture。
  • 摆放:每块瓦片的地理 bbox → 四角经纬 GeoLocalFrame.toLocal → 局部米 → vtkPlaneSource + texture置于 Z=底图平面。
  • 切换:basemapChanged(0天地图/1Google/2隐藏)Google 可后置(国内可用性),先天地图 + 隐藏。
  • LOD/随相机更新:本期可固定一档 zoom覆盖数据范围相机驱动 LOD 后置。
  • 配准是精度敏感点3857 瓦片范围反算到 GeoLocalFrame 必须与帘面/轨迹同一 frame否则底图与数据错位。须用户实测对齐Claude 不能 GUI 测)。
  • 单测瓦片数学经纬→z/x/y、瓦片 bbox→经纬纯函数抽出可测。

④ 三维分析栏交互(本期受限,附记)

  • 树/右键菜单已是 UI。detailRequesteddetailCtrl.openDataset 已接T7显示/隐藏 可接 actor 可见性。
  • 真切片需 3D 体模型(dd_voxel/dd_Structual3D),后端缺 → 受限,待后端。
  • 切片 CRUD/色阶/异常 = P4接口已留位(②a),待后端 + 1.0 参考。

风险/验证

  • 全部渲染须用户 build.bat rebuild 实测Claude 不能 GUI 测)。
  • 底图配准、2D 面 Z、轨迹/网格定位都是精度敏感点 → 小步验证。
  • Task 0(grid 端点) 不明会卡 Task 2 的网格分支 → 先确认。