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° 外返回黑块),限制范围让极区用冰盖底色