#pragma once #include #include #include #include #include #include #include #include class vtkActor; class vtkObject; class vtkTexture; class vtkRenderWindow; class vtkInteractorObserver; class vtkCallbackCommand; namespace geopro::render { class Scene; } namespace geopro::core { class GeoLocalFrame; } namespace geopro::app { // 天地图 WMTS 底图层(局部平面,B 方案)+ LOD:按相机视距自动选瓦片层级、覆盖可视范围, // 缩放/平移结束后增量增删瓦片。复用轨迹图同款 token;瓦片经同一 GeoLocalFrame 配准。 class TileBasemap : public QObject { Q_OBJECT public: enum Kind { Street = 0, Satellite = 1, Hidden = 2 }; TileBasemap(geopro::render::Scene& scene, vtkRenderWindow* rw, std::shared_ptr frame, QObject* parent = nullptr); ~TileBasemap() override; void show(Kind kind); // 显示某底图(Hidden 等同 hide);记住类型供 LOD 刷新复用 void hide(); // 移除全部瓦片 void refresh(); // 按当前相机重算层级+覆盖,增量更新瓦片(交互结束回调) private: static long long tileKey(int z, int x, int y); void ensureObserver(); // 首次显示时挂到交互样式的 EndInteractionEvent void purgeStale(); // 本轮请求全部落地后再删旧层瓦片,避免缩放空白闪烁 bool computeView(double& centerLat, double& centerLon, int& zoom) const; // 相机视锥 ∩ z=0 地面 → 可视经纬范围(治倾斜/旋转黑边);算不出(看向地平线)返回 false。 bool visibleGroundBox(double& west, double& south, double& east, double& north) const; void fetchTile(int z, int x, int y, long long key); void fetchTerrain(int z, int x, int y, long long key, vtkSmartPointer tex); // 拉覆盖该瓦片的 DEM(z>15 取祖先块)后落地 void placeActor(long long key, vtkSmartPointer actor); void ensureBaseline(const QImage& dem); // 首块 DEM 定基准高程(base/detail 共用→地形连续) void ensureBaseLayer(); // 远处粗底图层(填到天边,治倾斜露黑边) void fetchBaseTile(int z, int x, int y); // 单块粗底(sat+DEM→warp,持久不purge) vtkSmartPointer buildFlat(int z, int x, int y, vtkSmartPointer tex); // 平面瓦片(DEM 兜底) vtkSmartPointer buildWarped(int sz, int sx, int sy, int dz, int dx, int dy, vtkSmartPointer tex, const QImage& dem); // DEM 位移网格 + 卫星贴图 static void onInteractionEnd(vtkObject*, unsigned long, void* clientData, void*); geopro::render::Scene& scene_; vtkRenderWindow* rw_; std::shared_ptr frame_; QNetworkAccessManager nam_; Kind kind_ = Hidden; int generation_ = 0; // show/hide/换源 自增,丢弃过期回包 std::map> placed_; // 已贴瓦片:key→actor std::set desired_; // 当前视野应显示的瓦片 key std::set inFlight_; // 在途瓦片(续到起伏/平面最终落地) std::map demCache_; // DEM 块缓存(key=DEMz/x/y),跨隐藏/重选复用 std::map> texCache_; // 影像纹理缓存,重选/缩放回看免重拉 std::vector> baseTiles_; // 远处粗底层(持久,不随相机purge) bool baseLoaded_ = false; double baseline_ = 0.0; // 基准高程(首块中心),地形绕 z=0 起伏 bool haveBaseline_ = false; bool terrainProbed_ = false; // 首次 fetchTerrain 打一行诊断日志 vtkSmartPointer styleObs_; // 持引用保证回调期有效 vtkSmartPointer observer_; bool refreshing_ = false; }; } // namespace geopro::app