首页 / 浏览问题 / WebGIS / 问题详情
s3m缓存桌面预览没有错位,webgl加载后部分构件错位了
twt
19EXP 2023年11月03日

缓存没问题,加载到webgl就错位了,这是什么原因​​​​

1个回答

您好,

SuperMap iClient3D for Cesium产品默认是圆球,如果您生成缓存时选择S3M版本为3.0,那么默认“椭球”选项被勾选,生成的缓存为椭球数据,在前端需要设置椭球体转换参数,如以下代码所示:

function onload(Cesium) {
var obj = [6378137.0,6378137.0,6356752.3142451793];
Cesium.Ellipsoid.WGS84 = Object.freeze(new Cesium.Ellipsoid(obj[0], obj[1], obj[2]));
var viewer = new Cesium.Viewer( 'cesiumContainer');
var scene = viewer.scene;
var promise = scene.open('http://localhost:8090/iserver/services/XXX/rest/realspace');
}

希望能够帮助到您!

450EXP 2023年11月03日
好的,谢谢我试试下

问题解决了,但是加了这个后,项目中有部分图层会报这个错误加载不出来

我看了加载报错的这些是2.0的缓存,如果设置椭球体转换参数,2.0的缓存就不能同时加了吗;场景里就必须都要加载3.0的吗
您好,

Invalid array length是指无效的数组长度,请问您是通过什么代码打印出现这个信息的呢?如以上代码所示,设置椭球体参数后直接打开整个场景,不设置其他功能代码,图层能完整加载出来吗?

关于缓存S3M版本的问题,S3M1.0和S3M2.0版本的缓存为圆球数据,如果前端设置了椭球体参数,圆球数据会转换为椭球数据进行正确位置的加载。
Invalid array length是指无效的数组长度这个是cesium包里面打印出来的;

如果前端设置了椭球体参数,您的意思S3M2.0版本3.0版本都是可以同时加载的是吧
这个报错具体得看看您编写的什么代码,方便远程看看吗?如果方便的话,请查看私信。
其次, S3M2.0版本和S3M3.0版本数据可以同时加载。如果是既有圆球又有椭球的数据,可以进行设置椭球体参数方法转换椭球,圆球的数据会自动转到椭球。

我重新生成了下缓存解决了;还有个问题如果开启了椭球模式,模型显示在地下了这种是什么情况

您好,

(1)请问所使用的SuperMap iClient3D for Cesium产品具体版本号是多少?可通过控制台打印输出信息:  

console.log(Cesium.SuperMapVersion)

(2)请问切缓存前桌面端的模型数据集是否为地上正常显示效果?桌面端“风格设置”选项卡的“拉伸设置”组中高度模式和数据来源是如何设置的呢?切缓存时选择S3M版本为3.0,椭球选项是否已被默认勾选,如下图所示:

1. Cesium.SuperMapVersion:'34205'

2.我这边用的官网11.0.1版本生成的场景缓存,默认使用版本3.0。没有椭球模式选项,默认可能是椭球模式吧。

 缓存在桌面就是贴着地面0.0高程,使用椭球模式后把scp配置文件中的position的z改为8770.0才在地面上

以上截图是与您同样的官网11.0.1版本对数据集生成缓存时的参数面板设置,如果是对整个场景生成缓存,您需要选择将您的模型数据加载到椭球场景再生成场景缓存,生成缓存后的scp文件中场景类型应为:"globeType" : "Ellipsoid_WGS84",如下图所示:

这边是我生成出来的配置文件:好像这个不一样"crs" : "epsg:4294967295",​​​​​​

数据坐标系有问题,建议使用“开始”选项卡->“数据处理”组->“投影转换”->“批量投影转换”功能转换为统一的地理坐标系再进行生成缓存、服务发布、前端调用等一系列操作。

坐标系也转换了,数据加载还是在地下;crying

方便远程看看具体情况或者提供数据这边本地测试吗,已经私信您了。

感谢问题已经解决yes

咨询个相关问题,改为椭球模式后,flyTo这种视角定位;是不是也跟着要重新设定;

我发现好像之前写死的视角跟着不太对了

您好,

视角定位需要重新设定,可通过 Web 控制台输出信息并查看当前的视角定位。

(1)获取当前相机位置:

console.log(viewer.camera.position);

(2)获取heading、pitch、roll等参数值:

console.log(viewer.camera.heading);
console.log(viewer.camera.pitch);
console.log(viewer.camera.roll);

...