feat/vtk-3d-view #7
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue