feat/vtk-3d-view #7

Merged
gaozheng merged 301 commits from feat/vtk-3d-view into main 2026-06-27 18:43:52 +08:00
1 changed files with 10 additions and 6 deletions
Showing only changes of commit 5f27e59685 - Show all commits

View File

@ -49,8 +49,11 @@ constexpr double kPi = 3.14159265358979323846;
constexpr double kEarthCirc = 40075016.686; // 赤道周长(米) = z0 单瓦片地面尺寸 constexpr double kEarthCirc = 40075016.686; // 赤道周长(米) = z0 单瓦片地面尺寸
constexpr double kTilesAcross = 4.0; // 视野跨度目标覆盖瓦片数(决定层级) constexpr double kTilesAcross = 4.0; // 视野跨度目标覆盖瓦片数(决定层级)
// 地面起伏AWS Terrarium DEM 瓦片(免费/无 tokenXYZ Web-Mercator 与卫星瓦片对齐)。 // 地面起伏Mapbox terrain-RGB DEM 瓦片(原版 web 同款源,全球 CDN比 AWS Terrarium 快)。
// elev(米) = R*256 + G + B/256 - 32768。数据到约 z15更高层级无 DEM → 保持平面。 // 公式 elev(米) = -10000 + (R*65536 + G*256 + B)*0.1。数据到 z15更高层级取祖先块。
// kMapboxToken原版 commercial-admin 的 Mapbox 公开 tokenpk.*,客户端用,同 天地图 tk 性质)。
const char* kMapboxToken =
"pk.eyJ1IjoidGJ1c2FuIiwiYSI6ImNtZjY2emZneDBkY24ybXB4cmpvdmwzNWYifQ.h6tcQ380WN5AW6fZr08how";
constexpr int kDemMaxZoom = 15; constexpr int kDemMaxZoom = 15;
constexpr int kTerrainGrid = 32; // 每瓦片网格分辨率(33x33 顶点) constexpr int kTerrainGrid = 32; // 每瓦片网格分辨率(33x33 顶点)
constexpr double kTerrainExag = 1.0; // 地形垂向夸张(1=真实高程) constexpr double kTerrainExag = 1.0; // 地形垂向夸张(1=真实高程)
@ -88,7 +91,7 @@ double demElev(const QImage& dem, double fx, double fy) {
const int px = std::clamp(static_cast<int>(std::lround(fx * (w - 1))), 0, w - 1); const int px = std::clamp(static_cast<int>(std::lround(fx * (w - 1))), 0, w - 1);
const int py = std::clamp(static_cast<int>(std::lround(fy * (h - 1))), 0, h - 1); const int py = std::clamp(static_cast<int>(std::lround(fy * (h - 1))), 0, h - 1);
const QRgb c = dem.pixel(px, py); const QRgb c = dem.pixel(px, py);
return qRed(c) * 256.0 + qGreen(c) + qBlue(c) / 256.0 - 32768.0; return -10000.0 + (qRed(c) * 65536.0 + qGreen(c) * 256.0 + qBlue(c)) * 0.1; // Mapbox terrain-RGB
} }
} // namespace } // namespace
@ -341,12 +344,13 @@ void TileBasemap::fetchTerrain(int z, int x, int y, long long key, vtkSmartPoint
qInfo() << "[basemap] 首次拉DEM 卫星z=" << z << " → DEMz=" << dz << "(" << dx << "," << dy qInfo() << "[basemap] 首次拉DEM 卫星z=" << z << " → DEMz=" << dz << "(" << dx << "," << dy
<< ")"; << ")";
} }
// 必须 https该 S3 桶对纯 http 返回 403实测 // Mapbox terrain-RGBpngraw 无损,保证高程解码准确);原版同源,全球 CDN
const QString url = const QString url =
QStringLiteral("https://s3.amazonaws.com/elevation-tiles-prod/terrarium/%1/%2/%3.png") QStringLiteral("https://api.mapbox.com/v4/mapbox.terrain-rgb/%1/%2/%3.pngraw?access_token=%4")
.arg(dz) .arg(dz)
.arg(dx) .arg(dx)
.arg(dy); .arg(dy)
.arg(QString::fromLatin1(kMapboxToken));
const int gen = generation_; const int gen = generation_;
QNetworkReply* reply = nam_.get(QNetworkRequest(QUrl(url))); QNetworkReply* reply = nam_.get(QNetworkRequest(QUrl(url)));
connect(reply, &QNetworkReply::finished, this, [this, reply, key, demKey, gen, place]() { connect(reply, &QNetworkReply::finished, this, [this, reply, key, demKey, gen, place]() {