有些服务是发在场景(scene)下的,超图提供了一个很方便的方法:scene.open,这个方法会将场景中所有的图层(无论是OSGB还是影像和地形)加载进来。同时这个方法会自带一个自动地位功能,具体实现不深究。
这个方法虽然很方便,省去了循环遍历场景下图层的代码,但是也会因此导致出现一些问题。
1、删除图层的问题
使用scene.open的首要问题就是如何删除图层。因为这个方法会将场景下面的所有图层一次性的加载进来,不需要我们单独进行台南佳。那么这个方法的内部在加载图层之初必然会进行判定,根据图层的不同调用不同的方法进行图层的叠加。目前我用到的图层的不同类型有:
a、OSGBLayer
这个图层是用来加载三维模型,目前还未单独使用进行添加。不过推测单独添加的方法应该如下:
1 var promise = scene.addS3MTilesLayerByScp('http://localhost:8090/iserver/services/3D-zj/rest/realspace/datas/zj/config', {name : 'base'}); 2 promise.then(function(layer){ 3 layer.visible = false; 4 });
这个方法依旧是由超图进行了封装。
删除的方法如下:
1 scene.layers.remove(layerName)
可见图层是加载了Layers中,所以才能使用layers.remove移除图层。
b、ImageFileLayer
影像文件图层,用来加载影像,单独加载方法如下:
1 let imageryLayer = viewer.imageryLayers.addImageryProvider(imageryProvider); 2 imageryLayer.getViewableRectangle().then(function (rectangle) { 3 if(rectangle == undefined){ 4 return; 5 }else{ 6 let cur_rectangle = viewer.camera.computeViewRectangle(); // 获取当前视角边界 7 let inter_rectangle = Cesium.Rectangle.intersection(cur_rectangle,rectangle); // 取得当前视角边界和影像图层边界的交集 8 // 若边界的交集不存在,说明所加载的影像图层不再视界范围内,这时候需要使用飞入效果。否则不使用飞入效果 9 if(inter_rectangle == undefined || isNeedToFly(cur_rectangle)){ 10 viewer.camera.flyTo({ 11 destination: rectangle 12 }); 13 } 14 } 15 },function(err){ 16 throw "影响图层叠加失败,请联系管理员"