82 lines
4.2 KiB
C++
82 lines
4.2 KiB
C++
#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
|