使用cesium中的scene.open中遇到的几个问题

本文探讨了在Cesium中使用scene.open方法加载和管理图层时遇到的问题,包括如何删除不同类型的图层(OSGBLayer、ImageFileLayer、TerrainFileLayer)以及在获取场景矩形范围和飞行效果方面遇到的挑战。同时,提出了获取场景矩形范围的解决方案,并针对flyTo失效的情况提出了解决策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  有些服务是发在场景(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                     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值