编者按:

在社会发展进程中,城市建设规模不断扩大,日渐复杂的社会系统衍生出大量复杂性风险,应急新需求也与日俱增,各应急场景中三维地图的建设和应用已经越来越迫切。Cesium技术能够提供基于JavaScript语言的开发包,方便用户快速搭建一款零插件的虚拟地球Web应用,并在性能、精度、渲染质量等方面都有高质量的保证,是应急行业系统GIS可视化的重要应用。本文从当前的市场需求及面临的问题出发,结合百分点科技多个项目的建设经验,从不同维度介绍了Cesium技术在智慧应急行业的应用。

一、Cesium介绍

目前,三维空间可视化模型以网络地理信息系统(Web GIS)为基础进行开发。随着WebGL技术的发展与完善,以WebGL引擎渲染的三维GIS已经成为主要使用对象,其中Cesium作为开源地图引擎,被广泛用于三维场景的构建与应用。Cesium是基于JavaScript编写的WebGL开源三维库,支持2D、2.5D、3D地图展示,支持OGC制定的WMS/WMTS/WMF等符合国际规范的格式。Cesium不需要任何插件,只需要浏览器支持开启WebGL功能即可。

二、Cesium应急行业实践

随着社会的发展和进步,城市建设规模不断扩大,日渐复杂的社会系统衍生出大量复杂性风险,并出现紧急性突发事件,应急新需求也与日俱增。为有效预防和减少自然灾害、意外事故、公共卫生及社会安全事件造成的损失,保障人民群众生命财产安全、维护社会稳定,智慧城市应急管理系统的建立势在必行。

三维建模是城市三维可视化的基础,随着智慧城市概念的逐步深入,各个领域与行业都亟需将数字化建模场景融入到实际的业务场景中去。二维地图技术目前已难以满足大数据背景下的三维空间信息分析。因此,Cesium技术在智慧应急行业中的应用越来越重要。

esium是一款面向三维地球和地图的、世界级的JavaScript开源产品,提供了基于JavaScript语言的开发包,方便用户快速搭建一款零插件的虚拟地球Web应用,并在性能、精度、渲染质量,以及多平台、易用性上都有高质量的保证。

在应急行业中,Cesium可以通过GIS可视化提升全体系的应急业务场景可视化能力,进一步打造万物物联、数字孪生、可视化仿真、一体化数据模型,具备完整的二维矢量数据三维建模方案,同时无缝接入手工建模模型、倾斜摄影模型、点云等多源数据,能够提供快速自动的城市级建模能力。

您好!根据我的搜索结果,以下是我找到的有关Cesium Billboard Gif动图的信息:

- 如果能够将Gif动图进行解析,获得时间序列对应的每帧图片,然后按照时间序列动态更新Billboard的纹理,即可实现动图纹理效果。

- 在Cesium中,可以通过创建Billboard对象来加载和显示GIF图像。 Billboard是Cesium中的一种可视化对象,能够以2D或者3D的形式呈现在地球表面或者其他位置。要加载GIF图像到Billboard中,首先需要创建一个Billboard对象,然后使用ImageryProvider接口中的setDataSource方法来设置数据源。

esium是一种基于WebGL的开源地球和地图库,它提供了一组用于创建3D地球和地图的工具。CZML是Cesium的一种数据格式,它可以用于描述3D模型、点云、网格等地理空间数据。

3DTiles是3D Tiles的一种数据格式,它是JSON定义的语言,同时也是一个高度优化的语言,能够实现解析时更紧凑、人工读写更容易。在Cesium中,一个瓦片集(Tileset)是由一组瓦片(Tile)按照空间数据结构(树状结构)组织而成的,它至少包含一个用于描述瓦片集的JSON文件(包含瓦片集的元数据和瓦片对象),每一个瓦片对象可以引用下面的其中一种格式,用于渲染瓦片内容:二进制blob、要素表或批处理表。

DTiles的样式是可选的,可以将其应用于Tileset,样式是由可计算的表达式所定义,用于修改每个要素的显示方式。下图代码中root下的内容就是一个Tile,即一个瓦片,其包含用于确定是否渲染瓦片的元数据、对渲染内容的引用及任何子瓦片的数组,切片实际上也是一个JSON对象。

| 属性名 | 类型 | 描述 |

| ------ | ------------ | -------------------------------------------- |

| boundingVolumes | region/box/sphere | 定义瓦片的最小边界范围,用于确定在运行时渲染哪个瓦片,有region、box、sphere三种形式。 |

| geometricError | number | 非负数,以米为单位定义了不同瓦片层级的几何误差,通过几何误差来计算以像素为单位的屏幕误差(SSE),从而确定不同缩放级别下应该调用哪个层级的瓦片。简单来说,Tile的几何误差是用来确定瓦片切换层级的,即控制LOD的。|

| refine | string | 细化方式,确定瓦片从低级别(LOD)切换为高级别(LOD)的呈现过程。包括替换(REPLACE)和添加(ADD)两种方式。替换就是直接把父级的瓦片替换掉,添加则是在父级瓦片的基础增加细节部分。|

在 3D Tiles 中,一个瓦片集(Tileset)是由一组瓦片(Tile)按照空间数据结构(树状结构)组织而成的,它至少包含一个用于描述瓦片集的 JSON 文件(包含瓦片集的元数据和瓦片对象),其中每一个瓦片对象可以引用下面的其中一种格式,用于渲染瓦片内容:b3dm、i3dm、pnts、cmpt。

理论上来说,ADD是一种非常好的方式,是一种增量的LOD策略,能够减少数据的传输。refine属性在根节点的Tile中是必须定义的,在子节点中是可选的,如果子节点没有定义,则继承父节点的该属性。

content属性指定了瓦片实际渲染的内容。content.uri属性可以是一个指定二进制块(b3dm、i3dm、pnts、cmpt)的位置,也可以是指向另一个外部的tileset.json。content.boundingVolume属性定义了类似Tile属性boundingVolume的边界范围框,但是content.boundingVolume是一个紧密贴合的边界范围框,仅包含切片的内容。该属性可以用来做视锥体裁剪,只渲染视图范围内的内容。如果该属性没定义,系统也会自动计算。

children因为3DTiles是分级别的,所以每个Tile会有子Tile、子子Tile、子子子Tile ......,分得越多,层级划分得越精细。

viewerRequestVolume定义了一个边界范围,使用与boundingVolumes相同的模式,只有当观察者处于其定义的范围内时才会显示该Tile。

transform定义了一个4x4的变换矩阵 ,通过此属性可以将Tile的坐标转换为自己的局部坐标系内的坐标,并通过自己的transform矩阵变换到父节点坐标系中。它会对Tile的content、boudingVolume、viewerRequestVolume进行转换。

通常,一个3DTiles数据会使用一个主Tileset JSON文件作为定义Tileset的入口点,这个文件通常以tileset.json命名。从上面的示例代码可以看出,Tileset JSON具有四个顶级属性:asset、properties、geometricError和root。

1. asset

asset包含了整个Tileset的元数据对象。其中,asset.Version属性用于定义3DTiles版本,它指定了Tileset的JSON模式和基本的Tileset格式。tileVersion属性是可选的,可以用来定义特定应用程序的Tileset。

2. properties

properties是一个对象,其中包含了Tileset中每个feature属性的对象。上面的例子是一个建筑物的3DTiles,因此每个瓦片都包含有三维建筑物模型,而每个三维建筑物模型都有高度属性。在properties中,每个对象的名称都与每个要素属性的名称相对应,并且包含了该属性的最大值和最小值。这些值对于创建样式的颜色渐变非常有用。

3. geometricError

geometricError是一个非负数。通过这个几何误差的值来计算屏幕误差,从而确定Tileset是否渲染。如果在渲染过程中,当前屏幕误差被用作这里定义的屏幕误差值,那么这个Tileset就不会被渲染。换句话说,屏幕误差用于控制Tileset中的root是否渲染。

4. root

root是一个对象,包含了用于描述Tileset几何形状的顶点信息。它由一些几何图形组成,例如点(points)、线段(lines)或多边形(polygons)。这些几何图形用于定义Tileset的边界框(bounding box),以及如何将3D模型投影到2D屏幕上。

以下是重构后的文本:

root是一个JSON对象,它存储了真正的Tile数据。需要注意的是,root.geometricError 与Tileset的顶级geometricError不同,TileSet的geometricError 是根据屏幕误差来控制 TileSet 中的 root 是否渲染,而 root(Tile) 中的 geometricError 是用来控制 Tile 中的 children 是否渲染。root.children 是一个定义子 Tile 的对象数组,每个 Tile 还有其 children,形成一种递归定义的树状结构。每个子 Tile 的内容完全由其子 Tile 的 boundingVolume 包围,并且通常是其 geometricError 用于其子 Tile 的 geometricError,因为越接近叶子节点,模型越精细,与原模型的几何误差就越小。对于叶子节点的 Tile,其数组的长度为零,或者是未定义 children。

在创建树状结构时,可以使用 Tile 的 content.uri 指向外部的 Tileset(另一个 Tileset 的 JSON 文件)。这样做的一个好处是,不同的 Tileset 可以分开存储,例如我国的每个城市可单独存储成几个 Tileset,然后再定义一个包含所有 Tileset 的全局 Tileset。

在 Cesium API 帮助文档中搜索 3Dtile 关键词可以找到如下结果:Cesium 虽然也支持两种方式(Entity和Primitive)加载3DTiles数据,但因为多数情况下3DTiles数据都是成片区的数据,数据量比较大,所以为了保证性能,建议使用 Primitive 方式。

在 Cesium API 帮助文档中搜索 3Dtile 关键词可以找到以下相关类:

- Cesium3Dtileset:用于流式传输大量的异构3D地理空间数据集;

- Cesium3DTileStyle:瓦片集样式;

- Cesium3DTile:数据集中的一个瓦片;

- Cesium3DTileContent:瓦片内容;

- Cesium3DTileFeature:瓦片集要素,用于访问 Tile 中批量表中的属性数据,可通过 scene.pick 方法来获取一个 BATCH,即三维要素。

Cesium3DTileFeature.getPropertyNames()方法用于获取批量表中所有属性名,Cesium3DTileFeature.getProperty(string Name) 用于获取对应属性名的属性值。

要加载3DTiles,可以使用Cesium3DTileset对象,它是一个表示3D Tileset的类。要设置样式,可以使用Cesium.ColorGeometryInstanceAttribute和Cesium.ImageryProvider对象。要调整位置,可以使用Cesium.Cartesian3对象。要拾取要素,可以使用Cesium.ScreenSpaceEventHandler对象和Cesium.Ray对象。

3D Tileset文件转换是将三维地理空间内容转换为三维分幅,并组合成单个数据集的过程,以实现无缝性能和实时分析。目前,百分点科技主要介绍的是无人机倾斜摄影的模型转换方式,这种技术可以改变传统的测绘作业方式,提高测绘行业的作业效率。

以下是一些代码示例:

```javascript

// 加载3DTiles

var tileset = new Cesium.Cesium3DTileset({ url: 'path/to/tileset' });

scene.primitives.add(tileset);

// 设置样式

var geometryInstance = new Cesium.GeometryInstance({

geometry: new Cesium.BoxGeometry({}),

attributes: {

color: Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.BLUE)

}

});

scene.groundColor = new Cesium.Color(1.0, 1.0, 1.0, 0); // 设置地面颜色为白色

scene.primitives.add(new Cesium.Primitive({ geometryInstances: [geometryInstance] }));

// 调整位置

var position = Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883); // 经度、纬度转笛卡尔坐标系下的坐标

viewer.camera.flyTo({ destination: position }); // 让相机飞到指定位置

// 拾取要素

var handler = new Cesium.ScreenSpaceEventHandler(viewer.canvas);

handler.setInputAction((function onClick(event) {

var pickResult = viewer.scene.pick(event.position); // 在屏幕上点击的位置进行拾取

if (pickResult.status === Cesium.PickStatus.INTERSECTING) {

var pickedObject = pickResult.object; // 被点击的对象

if (pickedObject instanceof Cesium.Entity) {

console.log('You picked me!'); // 输出信息

} else {

console.log('I was not picked.'); // 输出信息

}

} else {

console.log('Nothing was picked'); // 没有被点击的对象,输出信息

}

})());

handler.setInputActionEnabled(true); // 使输入操作生效

```

以下是重构后的内容:

1. 蒸汽云扩散模型-数据渲染和爆炸模型-动画效果的比较

2. 城市风场模型调用流程

3. Cesium与第三方技术的融合

3.1 监控视频与GIS的融合

3.2 Echarts可视化支持

3.3 MapV可视化支持

4. 无人机检测气体浓度

5. 结语

百分点大数据技术团队基于应急行业大数据和其它互联网相关数据,结合计算机信息管理系统(CIM),致力于使应急系统的数据信息更加完善、多源和高精度。通过对这些数据的深度挖掘和分析,我们为应急智慧平台打下了坚实的基础,进而制定更为合理的应急预案和应急体系。

这一技术路线有助于改善和优化救援指挥工作,为处理突发事件、预防自然灾害、减少危险品爆炸事件、保障人民群众财产安全和智慧城市建设等提供高效的决策支撑。百分点大数据技术团队在这条技术路线上已经积累了丰富的经验,并将继续创新实践,不断探寻、思考和深化,为客户提供更加完善的技术服务。