首页 / 浏览问题 / 三维GIS / 问题详情
关于webgl中SuperMapImageryProvider相关的一些问题!
263EXP 2020年03月13日

首先总体需求是需要在webgl中叠加二维数据(大数据,10w以上),且能做到子图层显隐控制。

另外,这个问题有提过,但是提供的方法没有效果,比如移除图层、再重新添加等。webgl中的imagery图层有刷新方法吗?

目前,采用的方法是通过WebGL-SuperMapImageryProvider接口,添加iserver地图服务图层,并通过SuperMap.REST.SetLayerStatusParameters接口来控制地图服务子图层显隐。但存在以下几个问题:

  1. imageryLayer在WebGL场景中属于底图系列,层级比较低,会被一些实体图层遮挡。
  2. 通过SetLayerStatusParameters接口来改变子图层显隐时,webgl中没有提供对应的图层redraw\refresh方法,虽然已经改变了iserver端出图的参数,但是场景中并不会更新瓦片,需要鼠标来回滚动滑轮和漫游场景,瓦片才会一点点刷新。

期望解决事项:

  1. 除了这种SuperMapImageryProvider添加大量二维数据的方式,还有没有其他更优的往场景中添加大量二维数据并能做到子图层控制的方法?
  2. 怎么能让场景中的ImageryLayer重新绘制,去服务器端请求新瓦片。

部分代码如下:

    //初始化当前地图子图层状态信息
    setLayerStatusList = (parameters, subLayers) => {
        for (var i = 0; i < subLayers.length; i++) {
            var layerStatus = new SuperMap.REST.LayerStatus();
            layerStatus.layerName = subLayers[i].name;
            layerStatus.isVisible = subLayers[i].visible;
            parameters.layerStatusList.push(layerStatus);
        }
        //设置资源在服务端保存的时间,单位为分钟,默认为10
        parameters.holdTime = 1;
        return parameters;
    }

    //rest瓦片图层显隐性控制接口
    setLayerStatus = (restLayer) => {
        //拷贝一下
        let subLayers = restLayer.subLayers.concat();
        let layersID = restLayer.imageryProvider.layersID;
        let url = restLayer.imageryProvider.url;
        let name = restLayer.name;

        restLayer.show = false;
        window.CesiumViewer.imageryLayers.remove(restLayer,false);
        window.CesiumViewer.render();   

        //使用发送子图层控制参数请求来控制子图层
        //子图层控制参数必设:url、mapName、SetLayerStatusParameters
        var layerStatusParameters = new SuperMap.REST.SetLayerStatusParameters();
        layerStatusParameters = this.setLayerStatusList(layerStatusParameters, subLayers);
        layerStatusParameters.resourceID = layersID;
        var setLayerStatusService = new SuperMap.REST.SetLayerStatusService(url);
        setLayerStatusService.events.on({
            "processCompleted": (setLayerStatusEventArgs) => {    
                restLayer.show = true;
                window.CesiumViewer.imageryLayers.add(restLayer);   
                window.CesiumViewer.render();
            }
        });
        setLayerStatusService.processAsync(layerStatusParameters);
    }

1个回答

您好,您可以通过二维矢量瓦片(MVT)的形式加载您的地图服务,并在前端控制子图层的显隐。

具体步骤:

1、iDesktop中,对地图生成二维矢量瓦片(MVT)

2、发布ugcv5二维矢量瓦片(MVT)

3、前端通过scene.addVectorTilesLayer调用
5,560EXP 2020年03月16日
接口还是没有变吧?

试了没有效果,反倒不能改变样式了。
再不? 你给我的新包,没有找到新的接口。麻烦告知以下,
新包里有个mvt示例,可以参考下那个示例
不好意思,在eaxmples里没有找到mvt相关的示例

哦哦,好像是离线包没有封这个示例。您将官网上mvt示例的代码拷贝到发给您的版本吧(不要直接看官网,官网版本较旧,有些许问题,在给您的新包里这些问题得到了解决)

http://support.supermap.com.cn:8090/webgl/examples/editor.html#MVT

...