geopro/src/app/TileBasemap.hpp

82 lines
4.2 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#pragma once
#include <QImage>
#include <QNetworkAccessManager>
#include <QObject>
#include <map>
#include <memory>
#include <set>
#include <vector>
#include <vtkSmartPointer.h>
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<geopro::core::GeoLocalFrame> 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<vtkTexture> tex); // 拉覆盖该瓦片的 DEM(z>15 取祖先块)后落地
void placeActor(long long key, vtkSmartPointer<vtkActor> actor);
void ensureBaseline(const QImage& dem); // 首块 DEM 定基准高程(base/detail 共用→地形连续)
void ensureBaseLayer(); // 远处粗底图层(填到天边,治倾斜露黑边)
void fetchBaseTile(int z, int x, int y); // 单块粗底(sat+DEM→warp,持久不purge)
vtkSmartPointer<vtkActor> buildFlat(int z, int x, int y,
vtkSmartPointer<vtkTexture> tex); // 平面瓦片(DEM 兜底)
vtkSmartPointer<vtkActor> buildWarped(int sz, int sx, int sy, int dz, int dx, int dy,
vtkSmartPointer<vtkTexture> tex,
const QImage& dem); // DEM 位移网格 + 卫星贴图
static void onInteractionEnd(vtkObject*, unsigned long, void* clientData, void*);
geopro::render::Scene& scene_;
vtkRenderWindow* rw_;
std::shared_ptr<geopro::core::GeoLocalFrame> frame_;
QNetworkAccessManager nam_;
Kind kind_ = Hidden;
int generation_ = 0; // show/hide/换源 自增,丢弃过期回包
std::map<long long, vtkSmartPointer<vtkActor>> placed_; // 已贴瓦片key→actor
std::set<long long> desired_; // 当前视野应显示的瓦片 key
std::set<long long> inFlight_; // 在途瓦片(续到起伏/平面最终落地)
std::map<long long, QImage> demCache_; // DEM 块缓存(key=DEMz/x/y),跨隐藏/重选复用
std::map<long long, vtkSmartPointer<vtkTexture>> texCache_; // 影像纹理缓存,重选/缩放回看免重拉
std::vector<vtkSmartPointer<vtkActor>> baseTiles_; // 远处粗底层(持久,不随相机purge)
bool baseLoaded_ = false;
double baseline_ = 0.0; // 基准高程(首块中心),地形绕 z=0 起伏
bool haveBaseline_ = false;
bool terrainProbed_ = false; // 首次 fetchTerrain 打一行诊断日志
vtkSmartPointer<vtkInteractorObserver> styleObs_; // 持引用保证回调期有效
vtkSmartPointer<vtkCallbackCommand> observer_;
bool refreshing_ = false;
};
} // namespace geopro::app