众所周知,倾斜摄影自动建模的模型可以看作是一张表面覆盖率高分辨率影像的连续的TIN三角网。这在实际应用中只能像影像地图一样当作底图浏览,不能单独选中和查询,这对于实际作用不大。要解决这个问题,就只能进行模型单体化。“单体化”其实指的是每一个我们想要单独管理的对象,都是一个个单独的、可以被选中分离的实体对象,可以赋予属性,可以被查询统计等等。只有具备了“单体化”的能力,数据才可以被管理,而不仅仅是被用来查看。目前应用较为广泛的单体化方法包括以下三种:切割单体化、ID单体化和动态单体化。
倾斜摄影模型单体化技术
切割单体化
实现思路大体如下:首先,以配套矢量面(建筑物、道路、树木等)的边界线为切割线,将点集(即建模过程中生成的高密度点云)分为内外两个部分;再进行运算生成每一个点子集的边界,也就得到了单体化模型的边界;最后对每一个点子集进行三角剖分和优化,便得出单体化模型。
ID单体化
ID单体化是指结合已有的二维矢量面数据,将对应的矢量面的ID值作为属性赋给三角网中的每个顶点,那么同一地物对应的三角网顶点就存储了同一个ID值,当鼠标选中某一个三角面片时,根据这个三角面片顶点的ID值得到其他ID相同的三角面片并高亮显示,就实现了单独选中某一地物的效果。矢量数据集中存储ID值的字段就是关联字段,也可以指定其他字段作为关联字段。
动态单体化
与前两种方法不同的是,动态单体化不需要对倾斜摄影模型数据进行预处理。我们将配套的二维矢量面与倾斜摄影模型加载到同一场景中,在渲染模型数据时把矢量面贴到倾斜模型对象表面,然后设置矢量面的颜色和透明度,从而实现可以单独选中地物的效果。如果要做专题图,用这种办法那是相当方便。
三种单体化技术对比
总的来说目前市场上大部分三维应用中都是通过叠加配套矢量面的方式实现了动态单体化,而在不支持动态渲染的环境中则多使用ID单体化的方式。例如在WebGL客户端和移动端开发中,均使用ID单体化。
模型单体化实例研究
实现单体化的方式可以通过工具软件预处理,也可以通过相关js进行,这里主要从这两方面进行研究:
LocaSpace单体化
LSV 能够实现倾斜摄影自动化建模成果的单体化。采用矢量化的方式,通过叠加的矢量底面,在渲染层面实现建筑物、道路等地物单体化。
具体方法为在LSV中加载OSGB的倾斜摄影数据,在场景功能模式下打开数据源,
再在开始模块下叠加矢量图层
PhotoMesh单体化
PhotoMesh的单体化是通过精准切割单体化实现的。具体实现路径为:将数据在PhotoMesh中加载,经过自动建模后,将PhotoMesh创建的三维模型导入CityBuilder,通过叠加分类图层,将模型单体化并赋予属性信息,同时创建LOD,进行优化,生成3DML数据格式。
Cesium实现单体化
通过Cesium.JS前端实现单体化主要依靠classificationType这个参数,这是一个分类参数,设置其参数,可轻松实现单体化。通过 classificationType: Cesium.ClassificationType.CESIUM_3D_TILE属性的设置,即可在前端展示页面实现单体化。
SuperMap实现单体化
SuperMap也就是超图的单体化是通过其桌面软件完成的,具体实现分层单体化过程如下:
方式1:使用SQL 的空间查询方法
- 先叠加数据
- 选择菜单中的风格设置(如图)
拉伸设置:高度模式——相对高度;底部高程——属性表中相应的底高字段;拉伸高度——属性表中相应的拉伸高字段;
- 在场景的图层管理器中右键添加的矢量面图层,选择“对象选择风格”,更改前景色为饱和度高的颜色,透明度设为50%,勾选“贴对象”,然后确定;
- 等待操作完成完成单体化,最后效果如下:
方式2 : 利用shp数据进行空间建模,拉伸模型,然后依赖SmID来进行关联,做数据查询
- 对数据进行预处理
- 拉伸建模
- 建模完成之后保存当前场景
- 在场景上右键,生成场景缓存,保存到工作空间同级目录即可
- 注意存储类型以及文件类型(原始,s3m)