fix(vtk): 修垂直偏移根因-四叉树粗块先到时baseline未定就按全高程warp把地形抬高;改show时先拉数据中心DEM定基准再铺瓦片(全场同一基准)

This commit is contained in:
gaozheng 2026-06-17 15:19:16 +08:00
parent fd43051d8d
commit fb43237830
2 changed files with 31 additions and 1 deletions

View File

@ -182,7 +182,36 @@ void TileBasemap::show(Kind kind) {
requestRender(); requestRender();
return; return;
} }
refresh(); // 四叉树覆盖:近细远粗一次铺满(含远处粗块,无需单独粗底层) primeBaselineThenRefresh(); // 先定基准高程再铺瓦片:避免先到的粗块用错基准把地形整体抬高
}
void TileBasemap::primeBaselineThenRefresh() {
if (haveBaseline_ || kind_ != Satellite) { refresh(); return; }
// 先拉"含数据中心"的 DEM 块定基准(z15),确保任何瓦片 warp 前基准已就位、全场一致。
const auto c = frame_->toLatLon(0.0, 0.0);
const int z = kDemMaxZoom;
const geopro::render::TileXY t = geopro::render::lonLatToTile(c.lon, c.lat, z);
const long long demKey = tileKey(z, t.x, t.y);
auto cached = demCache_.find(demKey);
if (cached != demCache_.end()) {
ensureBaseline(z, t.x, t.y, cached->second);
refresh();
return;
}
const int gen = generation_;
const QString url =
QStringLiteral("https://api.mapbox.com/v4/mapbox.terrain-rgb/%1/%2/%3.pngraw?access_token=%4")
.arg(z).arg(t.x).arg(t.y).arg(QString::fromLatin1(kMapboxToken));
enqueueGet(url, [this, z, t, demKey, gen](QNetworkReply* r) {
r->deleteLater();
if (gen != generation_) return;
QImage dem;
if (r->error() == QNetworkReply::NoError && dem.loadFromData(r->readAll())) {
demCache_[demKey] = dem;
ensureBaseline(z, t.x, t.y, dem);
}
refresh(); // 成功→基准就位失败→baseline=0 兜底,但仍全场一致
});
} }
void TileBasemap::refineTile(int z, int x, int y, std::set<long long>& out, int& count) { void TileBasemap::refineTile(int z, int x, int y, std::set<long long>& out, int& count) {

View File

@ -43,6 +43,7 @@ private:
static long long tileKey(int z, int x, int y); static long long tileKey(int z, int x, int y);
void ensureObserver(); // 首次显示时挂到交互样式的 EndInteractionEvent void ensureObserver(); // 首次显示时挂到交互样式的 EndInteractionEvent
void requestRender(); // 合并渲染:同一事件循环轮次多次请求只渲染一帧 void requestRender(); // 合并渲染:同一事件循环轮次多次请求只渲染一帧
void primeBaselineThenRefresh(); // 先定数据中心基准高程,再铺四叉树(保证所有瓦片同一基准)
void purgeStale(); // 本轮请求全部落地后再删旧层瓦片,避免缩放空白闪烁 void purgeStale(); // 本轮请求全部落地后再删旧层瓦片,避免缩放空白闪烁
// 四叉树细分:按瓦片投影屏幕尺寸递归(近细远粗),收集叶瓦片到 out。 // 四叉树细分:按瓦片投影屏幕尺寸递归(近细远粗),收集叶瓦片到 out。
void refineTile(int z, int x, int y, std::set<long long>& out, int& count); void refineTile(int z, int x, int y, std::set<long long>& out, int& count);