ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

倾斜摄影OSGB数据发布三维服务全流程:iDesktop处理、MongoDB索引与iServer配置

倾斜摄影OSGB数据发布三维服务全流程:iDesktop处理、MongoDB索引与iServer配置 简介这份资源围绕倾斜摄影数据处理与发布流程展开面向测绘、GIS、三维建模及智慧城市相关从业者与学习者帮助解决OSGB数据从拿到手到Web端展示的完整链路问题。压缩包内共1个PDF文件大小约1.79MB以图文教程形式系统梳理了倾斜摄影数据介绍、组织格式、文件含义解析、加载、入库与服务发布等核心环节。内容以CC软件生产的OSGB格式为例讲解s3c工程文件、Data根目录与metadata.xml中ENU坐标系、EPSG编码及插入点坐标的读取方式并给出SuperMap iDesktop生成配置文件、倾斜入库、瓦片边长与s3m单文件大小判断标准以及iServer发布三维服务的操作要点。目前已有773人学习适合需要掌握倾斜摄影数据全流程处理与发布的中级读者参考。1. 倾斜摄影数据处理和发布流程从一堆 OSGB 到能点开的三维服务手里拿到一个倾斜摄影项目外业飞完内业空三跑完硬盘里躺着几十 GB 的 OSGB 文件夹模型在 ContextCapture 里预览没问题但领导或甲方一句“给我个链接我能在浏览器里转着看”很多人就卡住了。这条链路其实分两段前半段是数据处理把原始 OSGB 整理成引擎能高效读取的格式后半段是发布把数据挂到服务端通过 iServer 这类 GIS 服务软件对外提供三维瓦片服务。中间还夹着一个常被忽略的角色——MongoDB它负责存切片后的元数据和索引配置不对服务能起来但模型加载不出来。这篇笔记面向的是已经会飞、会跑空三但卡在“数据怎么进服务、怎么发出去”这一步的测绘和 GIS 从业者。我会按真实项目顺序把 OSGB 的目录结构要求、SuperMap iDesktop 里的倾斜摄影处理参数、MongoDB 的部署要点、iServer 发布三维服务的配置逐段拆开。不堆概念重点放在每一步的参数含义和翻车点目标是让你照着能跑通一条最小可用的发布链路。2. 先搞懂 OSGB 的目录结构为什么你的数据一进软件就报错2.1 OSGB 的 Data 目录和 metadata.xml 到底谁在管谁倾斜摄影模型从建模软件导出时常见的是 ContextCapture 的产物一个Data文件夹里面按瓦片层级分块存放.osgb文件同级还有一个metadata.xml。很多人以为metadata.xml只是个说明文件删了也能用这是第一个认知偏差。metadata.xml里记录了整个模型的参考坐标系、瓦片金字塔的层级划分、每块瓦片的包围盒范围SuperMap iDesktop 在导入倾斜摄影时第一步就是解析这个文件来建立空间索引。如果坐标系信息缺失或写错导入后模型会飘到错误的地理位置甚至直接提示“无法识别数据”。Data目录内部的命名规则也有讲究。ContextCapture 默认按Tile_000_000这种行列号命名子文件夹每个子文件夹里再放该瓦片的 OSGB 文件。SuperMap 的倾斜摄影导入功能对这个结构是兼容的但如果你手动合并过多个架次的数据把两个Data文件夹直接拷贝到一起就会出现瓦片编号冲突软件读取时只能识别其中一套。正确做法是在建模阶段就规划好分块或者用 iDesktop 的“倾斜摄影合并”功能重新组织索引而不是在文件系统层面硬拼。还有一个容易被忽略的点OSGB 文件本身是二进制格式不同建模软件导出的 OSGB 在顶点坐标精度、纹理压缩方式上可能有差异。SuperMap 的导入工具对 ContextCapture 和 Bentley 的产物兼容性最好如果你用的是其他国产建模软件导入前最好先用 iDesktop 打开单个 OSGB 看看纹理是否正常显示确认没有花屏或丢失再批量处理。2.2 用 SuperMap iDesktop 导入倾斜摄影的完整操作打开 iDesktop新建一个文件型数据源坐标系选择和你项目一致的比如 CGCS2000 高斯投影。然后在“三维数据”选项卡里找到“倾斜摄影”下的“导入 OSGB”功能。弹出的对话框里数据路径指向metadata.xml所在的那一层不是Data文件夹里面。这一点很多人会选错选到Data里面软件就找不到配置文件了。导入参数里有两个关键项一个是“瓦片层级”默认是全部导入但如果你的模型范围很大全量导入会生成一个巨大的缓存建议先只导入前几层做测试另一个是“纹理压缩格式”iDesktop 提供 DXT 和 WebP 两种DXT 兼容性好但体积大WebP 压缩率高适合后续要发布到 Web 端的场景。选 WebP 的话iServer 发布时也要对应开启 WebP 纹理支持否则客户端解码不了。导入完成后iDesktop 会生成一个.scp配置文件这个文件记录了倾斜摄影缓存的索引信息后续发布服务时直接指向它就行。如果你在 iDesktop 里预览发现模型加载特别慢先检查一下是不是把“生成缓存”的层级设得太高一般发布到 Web 端层级到 18 到 20 级就够用了再高肉眼也看不出差别但数据量会翻倍。# 检查 OSGB 目录结构的常用命令 # 进入 metadata.xml 所在目录 ls -lh metadata.xml # 查看 Data 目录下的瓦片文件夹数量 ls Data | wc -l # 查看单个瓦片文件夹内的 osgb 文件数量 ls Data/Tile_000_000 | head -20上面这几条命令用来快速确认数据完整性。metadata.xml必须存在且大小不为零Data下的瓦片文件夹数量应该和建模时的分块数一致每个瓦片文件夹里的 OSGB 文件数量也应该均匀如果某个文件夹里文件数明显偏少说明建模导出时可能中断过需要重新导出那一块。3. MongoDB 在倾斜摄影发布里的角色不是可选项是索引底座3.1 为什么 iServer 发布三维服务要依赖 MongoDBSuperMap iServer 发布倾斜摄影三维瓦片服务时切片后的瓦片元数据默认存储在 MongoDB 里。这些元数据包括每个瓦片的层级、行列号、包围盒、纹理路径等iServer 通过查询 MongoDB 来快速定位客户端请求的瓦片。如果你不装 MongoDBiServer 在发布三维服务时会提示“找不到瓦片存储”服务能创建但无法正常响应请求。MongoDB 在这里扮演的是“瓦片索引数据库”的角色不是用来存原始 OSGB 文件的。原始文件还是放在磁盘上MongoDB 里只存索引和少量元数据。所以 MongoDB 的数据量不会特别大一个中等规模的倾斜摄影项目索引数据通常也就几百 MB。但它的读写频率很高每个瓦片请求都要查一次所以 MongoDB 的性能直接影响服务的响应速度。安装 MongoDB 时版本选择有讲究。iServer 官方文档里会写明支持的 MongoDB 版本范围常见的是 3.6 到 4.4 之间。如果你装了个 MongoDB 5.0 或更高版本可能会遇到驱动不兼容的问题iServer 连不上。我一般会在 Linux 上用 yum 或 apt 安装指定版本而不是直接装最新版。Windows 上就用 MSI 安装包安装时记得勾选“Install MongoDB as a Service”这样开机自启不用每次手动启动。3.2 Linux 下安装 MongoDB 并配置 iServer 连接以 CentOS 为例先添加 MongoDB 的官方源然后安装指定版本。安装完成后修改配置文件/etc/mongod.conf把bindIp改成0.0.0.0这样 iServer 才能从其他机器连过来。如果 iServer 和 MongoDB 在同一台机器上保持127.0.0.1也行但生产环境一般会分开部署。# 添加 MongoDB 4.4 官方源CentOS 7 示例 cat /etc/yum.repos.d/mongodb-org-4.4.repo EOF [mongodb-org-4.4] nameMongoDB Repository baseurlhttps://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.4/x86_64/ gpgcheck1 enabled1 gpgkeyhttps://www.mongodb.org/static/pgp/server-4.4.asc EOF # 安装 MongoDB yum install -y mongodb-org # 启动服务并设置开机自启 systemctl start mongod systemctl enable mongod # 验证服务状态 systemctl status mongod安装完成后用mongo命令行客户端连上去创建一个专门给 iServer 用的数据库和用户。不要直接用 admin 库权限太大不安全。// 连接到 MongoDB use admin // 创建 iServer 专用用户 db.createUser({ user: iserver, pwd: YourStrongPassword, roles: [ { role: readWrite, db: iserver_tiles }, { role: dbAdmin, db: iserver_tiles } ] }) // 验证用户创建成功 db.getUsers()然后在 iServer 的管理后台里找到“数据存储”配置添加一个 MongoDB 存储填入 IP、端口、数据库名、用户名和密码。测试连接通过后发布三维服务时选择这个存储作为瓦片索引库。如果连接失败先检查防火墙有没有放行 27017 端口再检查 MongoDB 的bindIp配置和用户权限。注意MongoDB 默认没有开启认证生产环境一定要在mongod.conf里加上security: authorization: enabled然后重启服务。开启认证后之前创建的用户才能生效。4. 用 iServer 发布倾斜摄影三维服务的参数怎么调4.1 发布前的数据准备scp 缓存和瓦片存储的对应关系在 iDesktop 里导入 OSGB 并生成倾斜摄影缓存后你会得到一个.scp文件和一个同名的文件夹文件夹里是按层级组织的瓦片数据。发布到 iServer 之前需要把这两样东西放到服务器上 iServer 能访问到的路径下。通常我会在 iServer 的安装目录下建一个data文件夹把倾斜摄影缓存整个拷进去。然后在 iServer 管理后台的“服务管理”里选择“发布三维服务”数据来源选“倾斜摄影缓存”路径指向.scp文件。iServer 会自动读取缓存里的元数据并提示你选择瓦片存储。这里就要选之前配置好的 MongoDB 存储。如果一切正常iServer 会开始把瓦片索引写入 MongoDB这个过程根据数据量大小可能几分钟到几十分钟不等。发布参数里有一个“瓦片版本”的选项一般选默认的就行。还有一个“是否启用多线程加载”如果服务器 CPU 核心多可以勾上能提升并发请求时的响应速度。但要注意多线程加载会占用更多内存如果服务器内存紧张反而可能导致服务不稳定。4.2 三维服务的 REST 接口和前端调用方式服务发布成功后iServer 会生成一个三维服务的 REST 接口地址形如http://your-server:8090/iserver/services/3D-yourServiceName/rest/realspace。前端用 SuperMap iClient3D for WebGL 加载时直接把这个地址传给scene.open()方法就行。// 前端加载倾斜摄影三维服务 var viewer new Cesium.Viewer(cesiumContainer); var scene viewer.scene; // 打开 iServer 发布的三维服务 scene.open(http://your-server:8090/iserver/services/3D-tilt/rest/realspace); // 设置相机视角到模型范围 scene.camera.setView({ destination: Cesium.Cartesian3.fromDegrees(116.39, 39.9, 500), orientation: { heading: Cesium.Math.toRadians(0), pitch: Cesium.Math.toRadians(-45), roll: 0 } });这段代码里scene.open()是异步的服务加载完成后会触发scene.openCompleted事件可以在事件回调里做后续操作比如添加标注或切换图层。如果模型加载不出来先打开浏览器开发者工具看网络请求确认瓦片请求的 URL 是否正确返回状态码是不是 200。常见的问题是跨域iServer 默认允许跨域但如果你在前面加了 Nginx 反向代理就要在 Nginx 配置里加上 CORS 相关的头。还有一个参数是scene.globe.depthTestAgainstTerrain倾斜摄影模型本身是三维的如果这个值设为true模型和地形之间会有深度测试可能出现模型被地形遮挡的情况。一般发布倾斜摄影服务时如果不需要和地形叠加可以设为false让模型始终显示在最前面。5. 避坑排查OSGB 导入失败、MongoDB 连不上、服务 404 的常见原因5.1 导入 OSGB 时提示“文件格式不支持”或“坐标系无效”现象在 iDesktop 里导入 OSGB选完metadata.xml后弹窗报错提示文件格式不支持或坐标系无效。原因最常见的是metadata.xml里的坐标系定义和 iDesktop 当前数据源的坐标系不一致。比如metadata.xml里写的是 EPSG:4326但数据源建的是 CGCS2000 高斯投影iDesktop 在导入时会尝试做坐标转换如果转换参数缺失就会报错。另一个原因是 OSGB 文件本身损坏可能是建模导出时磁盘写满导致文件不完整。解决先用文本编辑器打开metadata.xml找到SRS标签确认里面的 EPSG 代码。然后新建数据源时选择相同的坐标系。如果坐标系确实需要转换先在 iDesktop 里用“投影转换”功能把数据源转成目标坐标系再导入 OSGB。对于文件损坏的情况用osgb查看工具逐个检查瓦片文件找到损坏的重新导出。5.2 MongoDB 服务启动后 iServer 仍然连接超时现象MongoDB 用systemctl status mongod看是 running 状态但 iServer 配置存储时测试连接一直超时。原因MongoDB 默认只监听127.0.0.1如果 iServer 在另一台机器上就连不上。另外CentOS 7 默认开启 firewalld27017 端口没有放行。还有一种情况是 SELinux 拦截了 MongoDB 的网络访问。解决修改/etc/mongod.conf里的bindIp为0.0.0.0重启 MongoDB。然后执行firewall-cmd --add-port27017/tcp --permanent和firewall-cmd --reload放行端口。如果还不行临时把 SELinux 设为 permissive 模式测试setenforce 0如果连接成功说明是 SELinux 策略问题需要添加相应的策略规则而不是直接关闭。5.3 三维服务发布后前端请求瓦片返回 404现象iServer 后台显示服务已启动但前端加载时控制台大量 404模型显示不出来。原因瓦片索引没有正确写入 MongoDB或者 iServer 读取的瓦片路径和实际存储路径不一致。常见于把倾斜摄影缓存从一台机器拷到另一台机器后.scp文件里的路径还是旧的绝对路径。解决在 iServer 管理后台的“服务管理”里找到对应的三维服务查看“瓦片存储”配置确认 MongoDB 连接正常且数据库里有数据。可以用mongo客户端连上去执行use iserver_tiles然后db.tiles.count()看有没有记录。如果没有记录说明发布时索引没写进去需要重新发布。如果有记录但前端还是 404检查.scp文件里的路径用文本编辑器打开把里面的绝对路径改成相对路径或服务器上的正确路径。5.4 模型加载出来但纹理模糊或颜色异常现象模型几何形状正常但纹理看起来模糊或者颜色偏暗、偏亮。原因纹理压缩格式不匹配。iDesktop 导入时选了 WebP 压缩但 iServer 发布时没有开启 WebP 支持客户端解码失败只能显示低分辨率纹理。另一种可能是 OSGB 本身的纹理分辨率就低建模时为了控制数据量做了降质。解决在 iServer 的“服务配置”里找到三维服务的“纹理设置”确认 WebP 支持已开启。如果还是模糊回到 iDesktop 重新导入 OSGB纹理压缩格式改成 DXT虽然数据量大一些但兼容性最好。对于颜色异常检查 iDesktop 里的“光照设置”倾斜摄影模型默认使用顶点颜色或纹理颜色如果开启了场景光照可能会让模型看起来偏色发布前把光照关掉再对比一下。5.5 MongoDB 数据量增长过快导致磁盘满现象服务运行一段时间后MongoDB 数据目录占用越来越大最终磁盘写满服务崩溃。原因iServer 在运行过程中会不断写入瓦片访问日志和缓存索引如果没有定期清理MongoDB 的iserver_tiles库会持续膨胀。另外MongoDB 的local库和oplog也会占用空间特别是开启了副本集的情况下。解决定期清理不再使用的三维服务对应的瓦片索引。在 iServer 后台删除服务时勾选“同时删除瓦片存储”这样 MongoDB 里的相关集合会被删除。另外在mongod.conf里设置storage.wiredTiger.engineConfig.cacheSizeGB限制缓存大小避免 MongoDB 占用过多内存。对于日志可以用db.tiles.createIndex({ createTime: 1 }, { expireAfterSeconds: 86400 })创建 TTL 索引让超过一天的临时瓦片记录自动过期。6. 进阶技巧用瓦片合并和 LOD 策略控制发布后的加载性能倾斜摄影数据发布后最影响体验的不是模型精度而是加载速度。我做过一个项目模型范围 2 平方公里OSGB 原始数据 40 多 GB直接发布后前端首次加载要等将近一分钟客户差点以为服务挂了。后来做了两件事把首屏加载时间压到了 8 秒以内。第一件事是瓦片合并。iDesktop 的倾斜摄影缓存生成时有一个“合并根节点”的选项默认是关闭的。开启后软件会把最顶层的几个瓦片合并成一个更大的瓦片这样前端在拉取第一层数据时请求数量从几十个降到几个首屏加载速度提升非常明显。合并的层级一般选 2 到 3 层再高就会导致单个瓦片文件过大反而拖慢后续层级的加载。这个参数在 iDesktop 的“倾斜摄影缓存”对话框里叫“合并层级”设成 2 就行。第二件事是调整 LOD 策略。iServer 发布三维服务时默认的 LOD 切换距离是按模型包围盒自动计算的但有时候这个自动值偏保守导致前端在中等距离就加载了最高精度的瓦片。可以在 iServer 的服务配置里手动调整“LOD 切换距离”参数把最高精度层级的切换距离调近一些让前端在远处用低精度瓦片靠近了再加载高精度。具体调多少需要根据模型的实际范围和屏幕分辨率来试我一般会先设成默认值的一半然后在前端用不同距离测试看哪个值下加载速度和视觉效果的平衡最好。还有一个技巧是给 MongoDB 的瓦片索引集合加复合索引。默认情况下iServer 查询瓦片时是按层级和行列号组合查询的如果只建了单字段索引查询效率会随数据量增长而下降。在 MongoDB 里执行db.tiles.createIndex({ level: 1, row: 1, col: 1 })把层级、行号、列号建成复合索引查询速度能提升一个数量级。这个操作在服务发布完成后做一次就行不影响已有数据。最后说一个我踩过的坑有一次发布完服务前端加载正常但过了一天客户反馈模型“缺了一块”。排查发现是 MongoDB 的磁盘空间不足导致部分瓦片索引写入失败但 iServer 没有报错服务看起来是正常的。从那以后我养成了一个习惯发布完服务后一定去 MongoDB 里db.tiles.count()一下和 iDesktop 里显示的瓦片总数对比数字对不上就说明索引没写全得重新发布。这个检查花不了一分钟但能省掉后面很多扯皮的时间。希望帮到你。本文还有配套的精品资源点击获取
返回列表