Cesium实现建筑物单体化(分栋分层)

单体化的方式有很多种:切割单体化、重建单体化,本文所介绍的方法为叠加单体化(简单)。

基本原理为:对于模型中的每个建筑,事先准备好相应的矢量面数据;在场景中单击模型时,通过获取单击位置的坐标,进而查询所属的矢量面,将面渲染到场景中。


具体实验步骤如下:

1. 首先有整个区域的3dtiles模型,加载到Cesium场景中;

2. 在GIS软件中,绘制所有需要单体化查询的建筑。

  • 可以使用ArcGIS(或QGIS)打开对应的影像图(同期正射影像最佳),进行建筑轮廓的绘制;
  • 如需分层单体化,需要在每个面要素中需要增加层高、楼高等属性(用于在cesium中绘制指定高度和位置的box);

        备注:如果有条件,可以直接在osgb/3dtiles上勾勒建筑轮廓

3. 将上步绘制的矢量面数据,发布成可查询要素的服务

  • 方式一:直接在前端使用Turf实现查询,此方式最简单。
  • 方式二:使用GeoServer服务器发布wfs服务,无需后端代码。
  • 方式三:使用PostgreSQL数据库结合后端代码实现查询服务。

4. 在Cesium场景中单击目标,获取目标点经纬度,通过第3步的服务查询要素信息

    说明:如果是分层单体化,则需要经纬度+高程,然后查询相应的矢量数据

5. 查询到目标要素后,在场景中构造带有classificationType的entity或者primitive,即可实现单体化;

         参考官方示例:Classification - Cesium Sandcastle

Cesium实现建筑物单体化(分栋分层)_第1张图片

6. 通过设置 viewer.scene.invertClassification = true,也可以实现遮罩效果;

Cesium实现建筑物单体化(分栋分层)_第2张图片

Cesium实现建筑物单体化(分栋分层)_第3张图片

本人亲测实现流程,可以满足建筑物分栋分层单体化。

如果你对其中的步骤有疑问,请留言,我再补充细节。

你可能感兴趣的:(Cesium,posgis,postgresql,javascript)