去年在跟一个行业单位在对接模型数据的时候,发现他们用cesium 来加载超图的S3M服务,需要我们来提供S3M服务地址。当时觉得他们挺厉害的,以为是他们做了什么转换能够接上超图的服务。
在git 上发现超图开源了S3M转换的库(git 地址:https://github.com/SuperMap/s3m-spec),去尝试了下,发现了一些问题,主要如下:
1、可以加载本地相对路径下的人工建模的样例数据,自己处理的人工建模数据部分可以加载,部分无法加载,而且存在黑色线框、模型丢失问题;无法加载Iserver 上发布的人工建模数据。如下图
2、不管是本地的相对路径下倾斜摄影缓存还是IServer 发布的倾斜摄影缓存都无法加载
针对人工模型有些可以加载,有些不能加载的问题,尝试过对模型不进行烘焙,或者进行lightingmap 、completemap 烘焙,不能加载的模型还是无法加载,当时就放弃了深入的研究。
最近有接触到需要Cesium 接入超图数据的的需求(现在很多国产化的GIS平台都选择了超图平台),刚好有点时间,又重新打开了超图的git 开源库,发现更新了许多代码,心里在想是不是有了改进呢?经过测试
1、人工建模:相对路径下的人工建模样例数据可以加载。自己处理的人工建模部分可以加载,部分无法加载,不会存在贴图问题,模型没有丢失。IServer上发布的人工建模数据也可以加载了
2、不管是本地的相对路径下倾斜摄影缓存还是IServer 发布的倾斜摄影缓存都无法加载
抱着研究一番的心态,对上面的问题做了一些追踪,下面是自己的一个分析思路,整理出来方便后续自己回忆思路,也可以给大家做一些参考
1、人工建模数据有些无法加载的问题
1.1 在浏览器上查看报错信息,明显的提示json 转换失败
1.2 找到可以加载的模型数据的索引文件.scp 以及不可以加载的模型数据的.scp 文件进行比较
经过与数据组沟通,这两份数据,json格式的是SuperMapDesktop 10版本以上生成的缓存数据,而xml 格式的是SuperMapDesktop 9D版本生成的缓存数据,进一步发现json格式的scp 文件对应的是.s3mb后缀模型文件。
Xml 格式对应的是.s3m后缀的模型文件。.S3MB 是超图桌面版10i 才有的缓存格式。而在github 上超图并没有说明这个库只针对s3mb格式缓存数据。既然找到数据原因,进一步去代码验证出错位置。
1.3 代码调试
报错具体是在S3MTileLayer 异步的时候
找到对应的S3MTIleLayer.js。具体报错代码在Cesium.Resource.fetchJson(),既然不是json 格式,在这里就报错了,没有继续往下执行
1.4 结论:人工建模无法加载的原因就是.scp文件的内容不是json 格式,导致代码解析失败。实际上是生成的缓存格式不是S3MB 格式。可以用超图desktop 10i以上的版本生成S3MB格式缓存,就能解决不能加载的问题。
2、倾斜数据无法加载
2.1 倾斜数据无法加载,在浏览器中并未报任何错误,在网络请求中也有请求对应的的模型文件,而且模型格式也是.S3MB
2.2 无法看出错误信息,只能一步一步调试,对比人工建模与倾斜数据的差别
最终找到这个S3MContentParser.js 这个js 是用于做S3MB 内容转换的。顺着这个js 往下找
发现加载倾斜数据的时候并未往下执行,而人工建模数据是往下执行的。如果把这个屏蔽掉,人工建模数据也无法渲染出来。人工建模数据和倾斜数据这个参数的区别是
人工建模 fileType:OSGBCachFile,倾斜摄影 fileType:OSGBFile
这个参数是通过scp 文件的解析获取的,打开对应scp 文件来比较
OSGBFileType导致无法渲染倾斜的数据,因为数据请求了,没做转换。那如果在这里把OSGBFile 也作为参数,是不是可以进行数据转换了呢?
把S3MContenFactory.js 改为如下截图
期望很美好,现实很骨感,着色器报错了
基本可以判断是超图并未支持倾斜转换后的S3M数据支持。但是倾斜数据格式更加透明,不存在属性、贴图的相关问题,应该更加容易支持才是。继续往下调试代码
在这个S3MCashFileRenderEntity 当中使用了顶点着色器和片段着色器,而这两个着色器附加到着色器程序,把模型渲染出来。按照这个思路是不是针对倾斜数据的OSGBFile 编写对应的顶点着色器和片段着色器,那就可以渲染出倾斜模型?这个需要后续去验证
2.3 结论:超图开源的库并未支持scp 文件中fileType===OSGBFile的倾斜模型数据,所以无法加载。想要实现倾斜数据的加载需要自定义顶点着色器和片段着色器。
后续问题,通过Cesium 加载S3MB的模型数据,集成到现有框架中,所有涉及到后期处理的分析功能对S3MB数据都无效,甚至基本的量测功能都需要对S3MB图层进行兼容,这就导致加载S3MB格式的数据似乎只存在浏览的意义。