1. OSGB倾斜摄影数据预处理实战
第一次接触OSGB格式的倾斜摄影数据时,我被它特殊的文件结构搞懵了。打开数据文件夹,你会看到一个Data目录和一个XML文件,Data里面又是层层嵌套的子文件夹,每个子文件夹里存放着金字塔结构的OSGB文件。这种设计其实很聪明——就像搭积木一样,从远处看整体轮廓,拉近后自动加载细节。
在iDesktop中处理这些数据,第一步要生成配置文件。我习惯用"三维数据"选项卡下的"倾斜摄影"→"生成配置文件"功能。这里有个关键细节:如果你的原始数据坐标系不是WGS84(EPSG:4326),建议先记下原始坐标系参数,后面转换时会用到。我就踩过这个坑,当时没注意坐标系,导致后面发布服务时位置全乱了。
生成配置文件后会得到.scp文件,这个文件相当于整个倾斜摄影数据的"目录"。在新建球面场景后,通过"添加三维切片缓存图层"加载.scp文件,就能在场景中看到倾斜模型了。不过这时候你可能会发现模型"飘"在空中——这是因为缺少地形数据支撑,我们后面会通过TIF地形数据来解决。
2. TIF地形数据处理技巧
地形数据就像三维世界的"地基"。我常用GeoTIFF格式的DEM数据,在iDesktop中通过"地形"→"生成地形缓存"来处理。这里要注意几个参数设置:
- 瓦片大小:512x512适合大多数场景
- 层级设置:根据数据精度决定,一般16-18级足够
- 边界范围:建议勾选"自动计算"
有一次项目中使用30米精度的TIF数据,生成缓存后发现地形锯齿严重。后来改用5米精度数据,配合"抗锯齿"选项,效果明显改善。生成的地形缓存会包含.sct文件和一堆子文件夹,和倾斜摄影缓存类似也是金字塔结构。
把地形缓存添加到场景后,原先"飘着"的倾斜模型就会稳稳落在地面上。这时候保存工作空间,建议用英文命名避免编码问题。我习惯用"项目名_date"的格式,比如"Shanghai_20240615.smwu"。
3. 坐标系转换的坑与解决方案
坐标系问题是新手最容易翻车的地方。有次我加载数据后发现模型跑到非洲去了,就是因为没处理好坐标系转换。这里分享我的检查清单:
- 确认原始数据坐标系(OSGB和TIF可能不同)
- 在iDesktop场景属性中设置目标坐标系(通常为4326)
- 倾斜入库时选择"坐标系转换"选项
- 发布服务前再次验证场景坐标系
对于国内项目,常遇到CGCS2000转WGS84的情况。虽然两者差异很小(通常<1米),但对高精度项目还是建议用七参数转换。我在江苏某项目测试过,直接转换会导致3-5厘米偏差,后来通过控制点校正才解决问题。
4. 倾斜入库生成S3M缓存详解
原始OSGB数据虽然能在iDesktop查看,但要发布Web服务必须转换成S3M格式。这个步骤叫"倾斜入库",在"三维地理设计"模块下。关键参数设置:
<倾斜入库配置> <输入路径>D:/data/osgb</输入路径> <输出路径>D:/output/s3m</输出路径> <坐标系>EPSG:4326</坐标系> <纹理压缩>true</纹理压缩> <LOD层级>自动</LOD层级> </倾斜入库配置>我强烈建议勾选"生成配置文件"选项,这样会同时输出.scp文件用于后续发布。有一次我忘记勾选,结果不得不重新跑一遍入库流程,20GB数据花了3小时...
入库完成后检查输出目录,应该看到:
- 包含.s3mb文件的子文件夹
- 同名的.scp配置文件
- 可选的metadata.json文件
5. 多源数据工作空间整合
实际项目往往需要整合多个数据源。我的标准操作流程是:
- 新建空白工作空间
- 依次添加处理好的倾斜摄影S3M缓存
- 添加地形缓存
- 根据需要添加矢量数据(如建筑轮廓)
- 调整图层顺序(地形在最下层)
- 保存为.smwu文件
有个技巧:对于大型项目,可以先创建多个场景分别加载不同区域数据,再通过"场景组合"功能合并。去年做智慧园区项目时,我用这个方法成功整合了12个分区的倾斜模型。
6. iServer10服务发布实战
发布服务时我习惯用"工作空间"方式,这样能保留所有图层关系。具体步骤:
- 启动iServer服务
- 登录管理后台
- 选择"服务管理"→"发布服务"
- 选择保存的工作空间文件
- 服务类型选"三维服务"
- 设置服务名称(英文无空格)
- 关键点:勾选"允许跨域访问"
发布成功后,你会得到类似这样的服务地址:http://localhost:8090/iserver/services/3D-Shanghai/rest/realspace
测试时建议先用iDesktop连接服务,确认无误再集成到Web端。我遇到过服务发布成功但无法访问的情况,后来发现是防火墙阻止了8090端口。
7. WebGL加载完整代码解析
前端加载的核心代码如下:
var viewer = new Cesium.Viewer('container', { terrainProvider: new Cesium.CesiumTerrainProvider({ url: '地形服务地址' }) }); var promise = viewer.scene.addS3MTilesLayerByScp( '倾斜摄影服务地址/scp文件路径', { name: 'ObliqueModel' } ); // 添加底图 viewer.imageryLayers.addImageryProvider( new Cesium.WebMapTileServiceImageryProvider({ url: "http://t0.tianditu.gov.cn/img_w/wmts?tk=您的密钥", layer: "img", style: "default", format: "tiles", tileMatrixSetID: "w" }) );常见问题排查:
- 模型位置偏移:检查前端代码的坐标系是否与服务一致
- 纹理缺失:确认服务目录包含所有材质文件
- 加载缓慢:调整S3MTilesLayer的LOD参数
- 跨域问题:确保服务端配置CORS
最近项目中发现个细节:Chrome浏览器对WebGL内存有限制,加载超大规模模型时建议启用--disable-web-security参数测试。正式环境可以通过模型分块解决。