From 6256098a944da8d9ac916f690a6490bed5c8d717 Mon Sep 17 00:00:00 2001 From: fukunee Date: Sat, 19 Sep 2026 17:03:38 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=A2=E5=BC=83=20ESRI=20=E7=81=B0=E8=89=B2'?= =?UTF-8?q?Map=20data=20not=20yet=20available'=E9=94=99=E8=AF=AF=E7=93=A6?= =?UTF-8?q?=E7=89=87=EF=BC=8C=E5=9B=9E=E9=80=80=E7=88=B6=E7=BA=A7=E6=94=BE?= =?UTF-8?q?=E5=A4=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/scene/CesiumGlobe.js | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/scene/CesiumGlobe.js b/src/scene/CesiumGlobe.js index 599149f..61bf3ef 100644 --- a/src/scene/CesiumGlobe.js +++ b/src/scene/CesiumGlobe.js @@ -241,10 +241,45 @@ export class CesiumGlobe { scene.maximumRenderTimeChange = Infinity; // 配合 requestRenderMode:静止时停止重绘,大幅省电省帧 // 卫星影像 + // 检测 ESRI "Map data not yet available" 灰色错误瓦片并丢弃,自动回退父级放大 + const discardNotAvailableTile = { + _canvas: document.createElement('canvas'), + _ctx: null, + isReady() { + return true; + }, + shouldDiscardImage(image) { + try { + if (!this._ctx) { + this._ctx = this._canvas.getContext('2d', { willReadFrequently: true }); + } + this._canvas.width = 8; + this._canvas.height = 8; + this._ctx.drawImage(image, 0, 0, 8, 8); + const d = this._ctx.getImageData(0, 0, 8, 8).data; + let gray = 0; + let total = 0; + for (let i = 0; i < d.length; i += 4) { + const r = d[i]; + const g = d[i + 1]; + const b = d[i + 2]; + const mx = Math.max(r, g, b); + const mn = Math.min(r, g, b); + if (mx - mn < 15 && r > 110 && r < 240) gray++; + total++; + } + return total > 0 && gray / total > 0.92; + } catch (e) { + return false; + } + }, + }; + const imagery = new Cesium.UrlTemplateImageryProvider({ url: IMAGERY_URL, credit: 'Imagery © Esri, Maxar, Earthstar Geographics', maximumLevel: 19, + tileDiscardPolicy: discardNotAvailableTile, }); const imageryLayer = new Cesium.ImageryLayer(imagery, { // 卫星影像不覆盖极区(约 ±85° 外返回黑块),限制范围让极区用冰盖底色