首页 / 浏览问题 / 三维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日
你好,我在webgl的api文档中并没有找到控制矢量瓦片子图层显隐的接口。

麻烦您顺带告知,通过scene加载矢量瓦片图层后,控制子图层显隐的操作和接口。

谢谢
链接:https://pan.baidu.com/s/1lGyyiAZig2pYD4NkirAYtQ
提取码:f0gd

您参考一下这个示例
好的,收到。

通过在前端修改mapboxstyle来控制图层显隐以及其他符号化信息是吧?
是的,相当于用前端去做专题图,以此控制不同图层甚至不同对象的显隐或者风格等等
好的,顺带再问一下。矢量瓦片要素在场景中能像实体一样可以pick吗(点击选中事件)
可以的。

你好,我还有几个问题却需要确认一下。

  1. 需要最新的webgl才有相关接口支持mvt矢量瓦片吧?
  2. 前端渲染样式的支持情况?是不是和原生的mapbox保持一致。
  3. 生产矢量瓦片只能通过桌面端吗?比如java 9D组件可以吗?
1、是的,需要最新版本webgl10.0.1

2、和mapbox一致。如果出现颜色偏暗等情况可以尝试关闭动态高光(scene.hdr)

3、生成矢量瓦片是10i才有的新功能。建议使用10.0.1以上版本

好的,感谢。

你们早期10i版本有两个缺陷,我跟那个董懿鑫反馈过的,也不知道后续有没有解决(这也是我没有升级10i的原因之一)

  1. 早期 java 10i和桌面端10i生成场景缓存时,点符号模型存在变形压缩情况。
  2. 在webgl中浏览虽然没有变形,但是s3m图层在大部分视角下都不显现,只有特殊角度才会显现出来。
第二个问题有可能是瓦片边长导致的。可以试试生成缓存时调大瓦片边长
嗯嗯,好的。
你好,桌面端多任务生成矢量瓦片很慢这个怎么解决呢?
增加进程数,或者换一个cpu配置高的电脑,然后增加进程数
解决了,错误数据导致的,数据范围太大。

对了,顺带问一个问题。 我切到了21级,但前端请求到19级就不继续请求了,这需要怎么设置?
链接:https://pan.baidu.com/s/1J7aFQtqqR7ttC3zRuf5xQA
提取码:io0z

研发最近重制了mvt加载方式,提供了新的接口,可以用这个webgl包以及里面的示例代码实现。

另,mvt需要以ugcv5的形式发出
官网最新的webgl包不行吗?我现在用的官网最新的包。

目前问题就是上面那个,请求到19级瓦片之后不会再去请求了。

另外我是用ugcv5的形式发布的。
用新包和新方法试一下吧,以前是写到影像图层集里的,可能需要设置影像的显示层级
接口还是没有变吧?

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

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

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

...