geopro/docs/superpowers/STATUS.md

13 KiB
Raw Permalink Blame History

Geopro 3.0 桌面客户端 — 当前状态与交接M1 进行中)

更新2026-06-07 · 分支feat/m1-core(尚未合并 master

本文件是会话交接的单一事实来源。下次继续前先读本文 + specs/2026-06-07-geopro-desktop-m1-design.md(设计基线)。计划在 plans/

铁律教训:渲染正确性必须用离屏 PNG 肉眼核对,不能只看"进程启动不崩"。工具:tests/spike/render_verify.cpprender_verify.exeD:/dev/spike_data/verify_*.png。本会话多次"声称成功"实为自欺,根因就是没看像素。


1. 现在能跑起来的东西(已离屏 PNG 核对 / 真机验证)

桌面 app geopro_desktop:

  • 真实登录:LoginWindow(用户名/密码/图形验证码/记住)→ verifyCodeCheck → RSA 加密密码 → login2 → token → 进工作台。真机登录成功;输入框样式已修(三态白底深字)。
  • 工作台 ADS 三区 + 数据详情:
    • 左上 对象显示栏:GS→TM(测线),复选框勾选测线 → 控制中央显示哪些测线的 dd_section。
    • 左下 数据真实显示栏(对齐原型):单击测线 → 列其采集批次(数据集,tab 数据/文件);单击采集批次 → 数据详情+异常列表+属性。启动自动选首测线+首数据集。
    • 中央 二维地图 / 三维视图(两个真内容,非相机切换):
      • 二维地图 = MapLineActor:测线 lat/lon 轨迹红线俯视(浅底),像地图。
      • 三维视图 = CurtainActor:沿测线的竖直断面墙(分段色带,z 纵向夸张×3,沿弯曲测线弯)。中央工具条「二维地图/三维视图」。3D 左上「视图详情」浮层(对齐原型,仅 3D 显示)五图层勾选:帘面 / 体素 / 切片 / 地形(体素=buildVoxelFromScatters 散点经 EPSG:4547 配准 IDW;切片=vtkImagePlaneWidget 在体素 image 上交互拖切面=dd_slice;地形=TerrainActor GDAL 读 DEM 高程面 + 影像 EPSG:3857 重投影贴图;后三者需 PROJ,不可用则禁用)。
    • 下方 数据详情:工具条「原数据/网格数据」切换 +「显示异常/显示电极/显示等值线」开关(对齐原型)。单击数据集 → 网格数据=GridContourActor 平面剖面(#18,colorBar 真实非均匀分段值上色,纵向夸张×1.5);原数据=ScatterActor 彩色方块散点(#17);显示异常=AnomalyActor dashed 折线叠加;显示电极=ElectrodeActor 顶边 ▼ 标记;显示等值线=#18 黑色等值线显隐(同纵向夸张对齐)。
    • 右上 异常列表(对齐原型):单击数据集→列该数据集异常(颜色块+名称(类型)+派生「位置/深/尺寸」),勾选框显隐,与数据详情异常叠加联动(取消勾选→该异常虚线隐藏)。
    • 右下 属性:名称/网格 nx×ny/vmin·vmax/异常数。
  • 单元测试累计 40 个全绿(core/data/net/render;含 Scatter 2 + Anomaly 4 + VoxelRegister 1 + Electrode 2 + Terrain 2、修复了陈旧的 Curtain mapper 类型断言);离屏 verify_section/map/curtain_3d/scatter/section_anomaly(含电极▼)/voxel_top/voxel_3d/terrain_3d(DEM+影像贴图).png 均核对正确。

2. 各 Phase 完成度

Phase 内容 状态
P0 三 spike
P1 core(LocalFrame/模型/ColorScale/IDW/CrsTransform/GeoLocalFrame)
P2 data(解析器/LocalSampleRepository)+ 对象树
P3 登录(RsaEncryptor/ApiClient/AuthService/LoginWindow) (Credential 记住免登录未做)
P4 渲染:render 层 + 二维地图(线)+ 三维(帘面/体素/切片/地形)+ 数据详情(#18/#17/异常/电极) 核心全达成:三视图 + #17 + 异常 + dd_voxel + dd_slice + DEM地形影像 + 原型六面板。:底图瓦片(M1.5)、数值标签、Credential 免登录、Z 基准统一、dock 透视持久化

3. 构建约定(机器本地

  • VS2026(MSVC 14.51)+ 官方 MSVC Qt 6.11.1(D:\Qt\6.11.1\msvc2022_64)+ vcpkg(d:\dev\vcpkg)。
  • 方案②-修订:Qt/VTK/ADS/QtKeychain 对接官方 Qt(不走 vcpkg);非 Qt 依赖走 vcpkg。VTK 9.6.2 源码编在 external/vtk-install。统一 Release
  • 构建/测试经 & cmd /c "D:\Git\lanbingtech\geopro\external\dev.bat <cmd>"(PowerShell 调,Bash 下参数透传坏)。C: 极小→TEMP/构建全在 D:。
  • app 构建前先 taskkill /IM geopro_desktop.exe /F(运行中 LNK1104 锁 exe)。
  • 部署:D:\Qt\6.11.1\msvc2022_64\bin\windeployqt.exe --release <exe>(找不到 ads dll 的警告无害);VTK/vcpkg dll 由 POST_BUILD TARGET_RUNTIME_DLLS 拷。
  • 离屏渲染验证:render_verify 需 PATH 加 external\vtk-install\bin + build\release\vcpkg_installed\x64-windows\bin;且体素/地形需 PROJ_DATA=...\vcpkg_installed\x64-windows\share\projGDAL_DATA=...\share\gdal 再运行。
  • GDAL:已加 vcpkg gdal(首次编译久,连带 hdf5/netcdf/geos 等;已缓存)。app/测试运行时需 PROJ_DATA(app main() 已自动按候选路径设;部署须随包附带 proj/gdal 数据)。
  • 改源码用 Write 工具,勿用 PowerShell Set-Content -Encoding UTF8(会把中文注释弄乱、断构建)。

4. 关键决策与已核实事实

  • 登录:基址 http://tenant.geomative.cn/pop-api;头 geomativeauthorization: Geomative <token>;getImageCode 验证码答案明文 data.code;verifyCodeCheck→login2会话 cookie 串联;login2 checkCode 空;token=data.accessToken
  • RSA 公钥已取(Playwright route 注入 setPublicKey hook + 缓存绕过 + 真登录捕获),resources/rsa_public_key.pem(RSA-2048,PKCS#1 v1.5)。
  • CRS 已实证确定(2026-06-08):剖面 projectX/Y 的真实 CRS = EPSG:4547「CGCS2000 / 3-degree Gauss-Kruger CM 114E」(=+proj=tmerc +lat_0=0 +lon_0=114 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80)。
    • 如何确定:同一条测线既有网格电极 lat/lon(EPSG:4326)又有散点 projectX/Y;用 pyproj 把 lat/lon→EPSG:4547 得 dX=+0.20m, dY=+0.30m(亚米级),反向→经纬 dlon/dlat≈3e-6°(~0.3m)。Krassovsky(北京54)椭球差 44m 排除→椭球=GRS80/CGCS2000(与 WGS84 现今差<1m,M1 可视化无影响)
    • 旧结论"EPSG:32649 解出 111°E"是因 32649 中央经线=111°E;改用 CM=114°E 即完美吻合。
    • 影像 image.tfw 仍是 EPSG:3857(与项目系不同,DEM/底图须 PROJ 重投影);dem.tif 自身 CRS 待 GDAL 读时核对。
    • 影响:DEM/影像 与 dd_voxel 回归 不再被 CRS 阻塞——散点 projX/Y 可经 EPSG:4547→4326→GeoLocalFrame 与帘面/地图配准。
  • 坐标统一:帘面/地图/数据详情已统一用 lat/lon→GeoLocalFrame(等距圆柱)局部米;dd_voxel 输入(散点 projX/projY)现可经 EPSG:4547→lat/lon→GeoLocalFrame 配准(CRS 已定);VoxelActor 代码就绪,待接入。
  • 网格 v/z[j=y][i=x],点序 i 最快;深度 y 越大越深→渲染时 z 取负;colorBar 网格色阶 alpha=0255、LVL 色阶 alpha=01;等值线级用 colorBar 真实分段值(均匀分级会一片蓝)。

5. 正确的视图模型(已实现,P4 续做务必照此,勿再走偏

对齐原型 + 物探用户工作流:

  • 二维地图三维视图两种不同内容(地图=测线线/点/底图;3D=断面墙/体素/地形),不是同一物体换相机
  • 数据详情(下方)才是"分析单条数据集"的专业图(ERT=#18 平面反演剖面)。
  • 体素、异常体是 3D 视图里的内容/派生产物,不是对象树里硬塞的兄弟节点
  • 渲染表现由 dd 类型决定(dd_section→帘面/剖面;dd_voxel→体绘制;轨迹→点;异常→线/面)。
  • 2D 相机可考虑锁旋转(只平移缩放)以区别 3D。

6. 已知问题 / 待办P4 下次会话)

  1. 散点 #17:ScatterActor(剖面原数据 2597 点彩色散点),数据详情"原数据"视图 已完成(2026-06-08,离屏 PNG 核对吻合 Python 真值,接入数据详情「反演剖面/原数据」切换;app 待人工登录肉眼复核交互)。
  2. 异常叠加:AnomalyActor(markType 点/线/面) 已完成(2026-06-08,叠加在数据详情 #18/#17 上,「显示异常」开关默认开;离屏 verify_section_anomaly.png 折线位置吻合 ref_18;样本 3 异常均 markType=2 dashed;app 待人工登录复核)。:dashed 点画在 VTK OpenGL2 下偏弱(几乎实线),几何/颜色/位置正确,纯观感项可后续调。
  3. DEM/影像地形 已完成(2026-06-08)。render::buildTerrain(GDAL 读 dem.tif 高程 + image.tif 影像;DEM CRS→4326→GeoLocalFrame 配准成 warp 面;影像 EPSG:3857→像素纹理坐标贴图)。离屏 verify_terrain_3d.png 卫星影像正确贴微起伏面、方向正立、配准对位。:影像须用 GDAL 读像素(vtkTIFFReader 对此压缩 TIFF 报错);+2 单测;接入 app 3D「地形」图层。dem.tif 低分辨率→起伏细微。Z 基准与帘面/体素夸张未统一(spec M-3 待办)。
    • dd_slice 交互切片 已完成(同日):3D「切片」图层=vtkImagePlaneWidget 在体素 image 拖切面(spec M1-b);左键拖动=移动切面(默认左键取值光标已改),中键=取值;纵向夸张已烤进体素 image(zDisplayScale),切片/体绘制/帘面同坐标系(切片穿过体素)。
      • 性能排查结论(2026-06-08,实测):体绘制走 GPU(RTX3060),拖动每帧~715ms(非 CPU 回退,前判误);拖动流畅。唯一卡点=首次开体素/切片的 GPU 着色器编译+体上传(一次性 ~1.21.7s),属固有成本,M1 可接受(如需消除可后续 pre-warm)。体绘制设 Auto/InteractiveAdjustSampleDistances=0(全程统一全质量,GPU 够快)。教训:勿臆测性能根因(CPU回退/磁盘flush 均被实测否定),用帧间隙时间戳实测定位。
  4. dd_voxel 回归: 已完成(2026-06-08,CRS 已定 EPSG:4547)。render::buildVoxelFromScatters:散点 projX/Y→4547→4326→GeoLocalFrame 配准 + IDW(maxDist 裁剪)→ buildVoxel;离屏 verify_voxel_top.png 两臂支撑吻合 ref voxel_hslice、verify_voxel_3d.png profile1 片贴合帘面;+1 单测(VoxelRegister,需 PROJ_DATA)。UI 已接入(增量3):3D「视图详情」浮层「体素」图层勾选驱动;main() 自动设 PROJ_DATA(部署须随包附带 proj 数据);PROJ 不可用则该层禁用。:仅 2 交叉线→薄十字片(15.9% 充填,半透明偏淡),可信满体需≥3线(设计 §10/§14)。dd_slice 交互切片未做(buildVoxel 已暴露 image 供 reslice widget)。
  5. 底图瓦片(二维地图,天地图/Mapbox):M1.5。
  6. Credential(QtKeychain):记住一个月免登录持久化(P3 Task2 未做)。
  7. 多测线:当前样本仅 1 条 dd_section(grid1);多条共存机制已就绪,加数据即叠加。
  8. 取景微调(数据详情/帘面的相机余量);纵向夸张倍数(剖面1.5/帘面3)可做成可调。
  9. render 仍部分内联在 main.cpp;可逐步抽到 view/controller。
  10. 布局对齐原型(权威参考 http://prototype.geomative.cn/;截图存 .playwright-mcp/)。计划见 plans/2026-06-08-m1-prototype-layout.md(六面板 + view/ 抽取,增量序列)。进度:
    • 增量1 右上「异常列表」(2026-06-08,panels/AnomalyListPanel,与数据详情显隐联动;待人工复核)。
    • 增量2 左下「数据列表」+ 对象树到 TM 层(2026-06-08,panels/DatasetListPanel;树 GS→TM 复选驱动中央, DS 移出树入数据列表 tab 数据/文件, DS 单击→详情+异常+属性, 启动自动选首测线/首数据集;待人工复核)。
    • 增量3 3D「视图详情」图层浮层(2026-06-08,QFrame 浮于 QVTK 左上,仅 3D 显示;帘面/体素图层勾选;体素经此正经接入=之前移除的工具条开关的正确归宿;main() 设 PROJ_DATA;待人工复核浮层渲染+体素显隐)。
    • 🔶 增量4 电极标记 + 工具条(2026-06-08,ElectrodeActor 顶边 ▼ PNG 核对吻合; +「显示电极/显示等值线」开关;待人工复核)。:数值标签、色阶配置/滤波处理(M1.5/进阶)。
    • 渲染积木累计含 ElectrodeActor(顶边 ▼)、TerrainActor(DEM 高程面 + 影像纹理,GDAL)。底图瓦片=M1.5。
    • 架构:新面板抽到 src/app/panels/(暂随 app 编译,如 login/),控制 main.cpp 体量;后续可升 src/view/ 库。

7. 渲染验证手段(务必用)

cmd /c "...\external\dev.bat cmake --build build/release --target render_verify"
# 运行(PATH 加 vtk-install\bin 与 vcpkg bin)→ 看 D:/dev/spike_data/verify_*.png

新增/改动渲染后,先用此离屏 PNG 核对方向/颜色/几何,再接进 app。app 是交互窗口,无法离屏验证,接入后需人工登录肉眼确认。

8. 文档与工具索引

  • 设计基线:specs/2026-06-07-geopro-desktop-m1-design.md(§4/§5 已含正确视图模型注记)
  • 计划:plans/ 下 phase0-4 + 2026-06-07-m1-view-redesign.md(正确视图模型)+ spike-report
  • 环境:../ENV_SETUP_Windows.md
  • 验证脚本:tools/validate_samples.py(#17/#18 真值)、tools/validate_voxel.py(voxel)、tests/spike/render_verify.cpp(app 渲染积木离屏核对)
  • 渲染积木(render 层):MapLineActor(测线线)、CurtainActor(断面墙)、GridContourActor(#18 平面)、ScatterActor(#17 散点)、AnomalyActor(异常 点/线/面)、VoxelActor(buildVoxel 体绘制)、buildVoxelFromScatters(散点→CRS配准→IDW→体素,VoxelFromScatters.hpp)、ColorLutBuilderCameraPresetScene;core::GeoLocalFrame(经纬→局部米)、core::CrsTransform(PROJ,EPSG:4547↔4326)。
  • 散点 #17 专属色阶经 LocalSampleRepository::loadScatterColorScale(剖面原数据自带色阶,范围/分段与网格色阶不同)。