美文网首页开源
用cesium加载超图得wms服务慢解决方法

用cesium加载超图得wms服务慢解决方法

作者: LC黑哥哥 | 来源:发表于2021-11-23 22:25 被阅读0次

    今天在用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;
          }
    
    

    相关文章

      网友评论

        本文标题:用cesium加载超图得wms服务慢解决方法

        本文链接:https://www.haomeiwen.com/subject/wvsgtrtx.html