Df1e620d05f38fffc1faa02718cadab3
Cesium项目实战(3)-城市建筑三维白膜数据的制作与效果展示

作为城市的主体,如果能站在上帝视角,直观的浏览这个城市的建筑面貌,或许这是他对这个城市最直接的感受,往往记住一个城市最直接的就是记住了它的标志性建筑,比如:北京天安门、水立方,上海东方明珠,广州小蛮腰塔等等。那么,在这篇文章里,我们用最简单的,通过还原建筑的方式来将整个城市从二维平面转换为三维立体。

  在本篇“城市建筑三维白膜数据的制作与效果展示”中我们主要包括如下几个可视化内容。

  1. 城市建筑数据的获取
  2. 城市建筑数据的三维白膜建模
  3. 城市建筑模型的三维可视化

1. 城市建筑数据的获取

  城市建筑数据,指的是一个城市的建筑平面轮廓图,跟某栋建筑的详规、控规图纸不一样,而是城市范围内所有建筑的轮廓,轮廓可以简单的就一个矩形,或者多边形封闭区域,表达的是在这个区域内有栋建筑,不需要详细的信息。

  正常途径的话,数据更新最快,也最准确的,当然归属规划、国土相关部门了,但是这类数据往往很难拿到,如果有可能的话,也尽量从官方获取数据。

  当然我们如果仅仅只是想做一些研究性的课题,或者其他技术交流、实验性质的项目的话,这个时候,我们对于数据的时效性、准确性就没那么高了,可以在网上下载免费的数据下载器工具软件,或者付费购买一些公司、大佬们写的下载软件,当然这个购买的费用也不贵,可以终生适用,还可以得到免费的升级维护服务。

  当然,也有最简单的方式,就是通过一些渠道,QQ群、微信群、论坛、博客啥的,可以使用网友们共享的数据,当然这个质量就没有什么保障了,需要你懂一些基础数据的编辑,如ArcGIS、SuperMap软件的操作了。(本篇文章所涉及到的北京市建筑轮廓数据就是这种聚到获取的,格式为WGS84的shp矢量数据,仅作技术研究用途)

  最后,数据获取方式千万条,但是一定不能侵权,做技术研究、做课题的一定要保管好自己的数据,不要商用,商用的话,最好使用授权的数据。免得以后引起纷争,毕竟GIS圈内的数据保密政策还是蛮厉害的。


2. 城市建筑数据的三维白膜建模

  白膜建模,应该属于三维建模领域里面,最原始也是最简单的建模了,模型体现的就是一个一个白色的盒子,方式就是吧建筑轮廓直接按照指定的高度拉伸即可。

  城市级别的建筑体量是不能靠一个一个手动在软件中建模的,必须得自动完成。

  一、纯代码绘制

  这种方式处理起来也很简单,根据建筑轮廓,可以绘制多边形、墙体等Entity对象,或者PolygonGeometry、WallGeometry等Primitive对象。

// 例如:绘制一个wall实体对象
var greenWall = viewer.entities.add({
    name: 'Green wall from surface with outline',
    wall: {
        positions: Cesium.Cartesian3.fromDegreesArrayHeights([
            -107.0, 43.0, 100000.0,
            -97.0, 43.0, 100000.0,
            -97.0, 40.0, 100000.0,
            -107.0, 40.0, 100000.0,
            -107.0, 43.0, 100000.0]), // 自定义每个实体拉伸高度
        material: new Cesium.ImageMaterialProperty({
            image: '../images/wall.jpg', // 贴图
            color: Cesium.Color.WHITE.withAlpha(0.2), // 颜色
            transparent: true
        }),
        outlineColor: Cesium.Color.WHITE.withAlpha(0.2),
        outlineWidth: 2,
        outline: true
    }
});

  二、建模软件自动建模

  这种方式需要建模软件能够根据属性参数进行自动化建模,同时,还需要软件数据格式支持(CAD/SHP/GEOJSON/KML等),三维建模数据导出格式支持(OBJ/DAE/3DTILES等)。

  三、SHP -> 3DTILES 建模

  这种方式是最简单的,无需其他的操作,直接一步到位,但是需要有几个前提条件。

  1、SHP数据格式最好是WGS84坐标系。
  2、属性字段中有数值性的高度属性。
  3、文件编码最好是UTF-8。

  本文采用的是第三种方案,是通过 北京西部世界科技有限公司 公司团队开发的 CesiumLab软件 制作的。


3. 城市建筑模型的三维可视化

数据做好了,接下来就在Cesium中加载数据吧

  首先,我们需要把CesiumLab处理好的数据放入一个静态资源服务器(Nginx、Tomcat等)中,当然也可以直接使用CesiumLab自己的服务。得到诸如此类的一个服务地址:"http://localhost:90/beijing_building/tileset.json"。

  接下来,直接在cesium中使用Cesium3DTileset接口加载

var tileset = viewer.scene.primitives.add(new Cesium.Cesium3DTileset({
  url: "http://localhost:90/beijing_building/tileset.json"
}));

top Created with Sketch.