丢弃 ESRI 灰色'Map data not yet available'错误瓦片,回退父级放大
This commit is contained in:
@@ -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° 外返回黑块),限制范围让极区用冰盖底色
|
||||
|
||||
Reference in New Issue
Block a user