今天在用cesium加载超图iserver发布的大数据tiff影像发布成wms服务的时候,三维球上加载显示非常慢,通过浏览器调试查看网络,发现是一个请求长时间卡住导致。
image.png
把这个请求URL单独放到浏览器去访问还是慢,初步认为是iserver的问题,具体什么原因,可以反编译iserver源码加日志来排查。现在我先默认它有问题,如何快速解决该问题呢?我通过iserver自带的iclient发现浏览并不慢,继续定位发现cesium默认第一张瓦片的bbox范围较大。
image.png
难道是iserver由于这个原因导致的?通过对比其他二维客户端加载效果发现,其他客户端加载快,而且不是从最大bbox开始加载,而是只请求数据的bbox。
接下来就该看看cesium加载wms服务的逻辑了,发现数据如果是经纬度坐标,那么bbox会很大,想着能不能跳过前几张瓦片呢,看接口有requestImage方法可以获取瓦片信息,那么根据源码来重写不就可以了么,通过自己尝试修改后,发现跳过前面几级,加载速度快了许多。
下面我粘贴自己修改方法,方便各位解决类似问题。
imageProvider.requestImage = function (x, y, level, request) {
if (level <= 5) {
//这里就是跳过前面5级,根据自己需要设置
return createImageBitmap(this, 10, 10, 100, 100);
}
//下面代码是cesium源码抄录过来的
var result;
var timeDynamicImagery = imageProvider._timeDynamicImagery;
var currentInterval;
if (Cesium.defined(timeDynamicImagery)) {
currentInterval = timeDynamicImagery.currentInterval;
result = timeDynamicImagery.getFromCache(x, y, level, request);
}
if (!Cesium.defined(result)) {
var dynamicIntervalData = Cesium.defined(currentInterval) ? currentInterval.data : undefined;
var tileProvider = imageProvider._tileProvider;
if (Cesium.defined(dynamicIntervalData)) {
tileProvider._resource.setQueryParameters(dynamicIntervalData);
}
result= tileProvider.requestImage(x, y, level, request);
}
if (Cesium.defined(result) && Cesium.defined(timeDynamicImagery)) {
timeDynamicImagery.checkApproachingInterval(x, y, level, request);
}
return result;
}
网友评论