fix(vtk): 修垂直偏移根因-四叉树粗块先到时baseline未定就按全高程warp把地形抬高;改show时先拉数据中心DEM定基准再铺瓦片(全场同一基准)
This commit is contained in:
parent
fd43051d8d
commit
fb43237830
|
|
@ -182,7 +182,36 @@ void TileBasemap::show(Kind kind) {
|
|||
requestRender();
|
||||
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) {
|
||||
|
|
|
|||
|
|
@ -43,6 +43,7 @@ private:
|
|||
static long long tileKey(int z, int x, int y);
|
||||
void ensureObserver(); // 首次显示时挂到交互样式的 EndInteractionEvent
|
||||
void requestRender(); // 合并渲染:同一事件循环轮次多次请求只渲染一帧
|
||||
void primeBaselineThenRefresh(); // 先定数据中心基准高程,再铺四叉树(保证所有瓦片同一基准)
|
||||
void purgeStale(); // 本轮请求全部落地后再删旧层瓦片,避免缩放空白闪烁
|
||||
// 四叉树细分:按瓦片投影屏幕尺寸递归(近细远粗),收集叶瓦片到 out。
|
||||
void refineTile(int z, int x, int y, std::set<long long>& out, int& count);
|
||||
|
|
|
|||
Loading…
Reference in New Issue