首先总体需求是需要在webgl中叠加二维数据(大数据,10w以上),且能做到子图层显隐控制。
另外,这个问题有提过,但是提供的方法没有效果,比如移除图层、再重新添加等。webgl中的imagery图层有刷新方法吗?
目前,采用的方法是通过WebGL-SuperMapImageryProvider接口,添加iserver地图服务图层,并通过SuperMap.REST.SetLayerStatusParameters接口来控制地图服务子图层显隐。但存在以下几个问题:
- imageryLayer在WebGL场景中属于底图系列,层级比较低,会被一些实体图层遮挡。
- 通过SetLayerStatusParameters接口来改变子图层显隐时,webgl中没有提供对应的图层redraw\refresh方法,虽然已经改变了iserver端出图的参数,但是场景中并不会更新瓦片,需要鼠标来回滚动滑轮和漫游场景,瓦片才会一点点刷新。
期望解决事项:
- 除了这种SuperMapImageryProvider添加大量二维数据的方式,还有没有其他更优的往场景中添加大量二维数据并能做到子图层控制的方法?
- 怎么能让场景中的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);
}