百分点大数据技术团队:Cesium 技术在智慧应急行业的应用
编者按:社会发展进程中,城市建设规模不断扩大,日渐复杂的社会系统衍生出大量复杂性风险,应急新需求也与日俱增,各应急场景中三维地图的建设和应用已经越来越迫切。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 应急行业实践
三维建模是城市三维可视化的基础,随着智慧城市概念的逐步深入,各个领域与行业都亟需将数字化建模场景融入到实际的业务场景中去,二维地图技术目前已难以满足大数据背景下的三维空间信息分析,三维地图的建设和应用已经越来越迫切。
随着社会的发展和进步,城市建设规模不断扩大,日渐复杂的社会系统衍生出大量复杂性风险,并出现紧急性突发事件,应急新需求也与日俱增,为有效预防和减少自然灾害、意外事故、公共卫生及社会安全事件造成的损失,保障人民群众生命财产安全、维护社会稳定,智慧城市应急管理系统的建立势在必行。
因此,需要建立预判、监控、指挥、决策、救援于一体的智慧应急平台,这必然离不开大量的数据做支撑。在分析处理所收集的海量数据过程中,GIS 应用提供了一个高效的数据可视化平台,有效地提高了数据收集和处理的效率。在 GIS 的多项技术中,Cesium 是一款面向三维地球和地图的、世界级的 JavaScript 开源产品。它提供了基于 JavaScript 语言的开发包,方便用户快速搭建一款零插件的虚拟地球 Web 应用,并在性能、精度、渲染质量,以及多平台、易用性上都有高质量的保证,无疑是应急行业系统 GIS 可视化的重要应用。
1. 应急行业的指挥场景
通过 GIS 可视化提升全体系的应急业务场景可视化能力,进一步打造万物物联、数字孪生、可视化仿真、一体化数据模型,具备完整的二维矢量数据三维建模方案,同时无缝接入手工建模模型、倾斜摄影模型、点云等多源数据,能够提供快速自动的城市级建模能力。
在应急指挥场景中 GIS 可视化的使用是多元的,像基础图层的展示、标绘工具的能力、资源点位的上图,以及定制化专题中的三维模型处理等在整个业务当中都有所体现,下面将从不同维度介绍 Cesium 在项目中的使用。
1.1 基础图层
基础底图:
(1)Cesium 加载 WMS 服务:
(2)Cesium 加载 WMTS 服务:
参数说明:
常见坐标系:
(1)WGS84:为一种大地坐标系,也是目前广泛使用的 GPS 全球卫星定位系统使用的坐标系。
使用该坐标系的地图:谷歌地图国外区
(2)GCJ02:又称火星坐标系,是由中国国家测绘局制订的地理信息系统坐标系统,是由 WGS84 经加密后的坐标系。
使用该坐标系的地图:腾讯地图,高德地图,谷歌地图中国区
(3)BD09:为百度坐标系,在 GCJ02 坐标系基础上再次加密。
使用该坐标系的地图:百度地图
注:非中国地区地图,服务坐标统一使用 WGS84 坐标。
卷帘效果:
一般底图中都有“图层切换”这个最基本的功能,可以查看想要查看的图层,包括卫星图和电子地图等,当想对两个图层进行较直观的对比时,卷帘图层是一个很好的实现方式,通过拖动分界线可以很方便地查看任意位置两个图层的变化。
1.2 点状对象
突发事件点位
为凸显突发事件点位,实际开发中经常会有动图加载的需求,Gif 是我们最常见的动图格式,它的原理是通过对多帧图片按时间序列进行切换,从而达到动画的效果,但 Cesium 不支持纹理贴动图,并且考虑到 Cesium 的 Billboard 支持单帧纹理贴图,所以如果能将 Gif 动图进行解析,获得时间序列对应的每帧图片,然后按照时间序列动态更新 Billboard 的纹理,即可实现动图纹理效果。而 Libgif 第三方库能够将 Gif 转化为一帧帧图像,所以我们结合 Libgif 来进行 Gif 动图的渲染。
POI 检索点位
结合资源点位和互联网的 POI 点位数据,进行地理位置精准查询功能开发,为应急指挥提供辅助信息。
基础数据点位(聚合)
基础数据点位多、数据量大,应用地图聚合功能可以更好地进行展示,使地图看起来不是杂乱的,从而提升地图的加载性能。
正在发生事件点位
对于资源点位,指挥官可以通过 app 控制端进行操作,点位会高亮显示,地图聚焦到该点位,起到醒目的作用。
1.3 面状对象
利用面状对象可以综合性地实现底图立体边界的特效,使可视化页面更加形象立体。
利用面状中的墙体立体效果,可以渲染地图区域边界,达到可视化页面的立体效果。
1.4 标注标绘
地图标绘是指在地图背景上标绘各种具有空间特征的事、物的分布状态或行动部署。标绘功能是应急系统中必不可少的一部分,它可以用来表达各种信息,描述各种对象,表示各种资源,还可以渲染业务进度和流程,以便三维可视化分析。地图标绘是三维 GIS 的一个重要技术手段,在几何表达上主要分为点标绘、线标绘、面标绘、体标绘,常用的为点、线、面的形式。其中在应急系统中,点位设计是具有一定行业标准的,例如医院、学校、消防车、喷水车和避难场所等。
在系统中可以利用点标绘加实体模型,以及文字标注的方式来表达事故现场(地形、资源、人群、设备)的动态及分布情况,并分析事故现场群众的主要聚集地,同时对危险源进行情景分析和风险研判。然后将危险源和其他的资源数据(学校、医院、救援队、避难场所等)进行综合分析,通过扩散爆炸等数据模型来模拟事故发生场景,分析灾害可能带来的人员伤害及财产损失。最后指挥官会在前两个阶段的基础上,协同应急相关部门以标绘形式进行情景演练实施与协调调度,提前确定事故级别和指挥救援方案,制定最佳救援预案。
1.5 轨迹路线、漫游
轨迹路线、漫游都是基于 CZML 数据结构来实现的,它是 JSON 定义的语言,同时也是高度优化的语言,能够实现解析时更紧凑、人工读写更容易。
基于 Cesium 的这一特性,可开发出模拟实时救援的具体路径,演练救援场景,对救援物资、人员进行指挥调度,提前制定应急预案等工作,使应急指挥人员可以迅速掌握事故地点周围情况,为其决定是否应急撤离、判断事故现场外影响区域的安全性提供有利的依据。此外,还可以根据相关危险类型、潜在后果、现有资源控制紧急情况的行动类型,调动相关的救援人员及物资快速到达现场,做好应急和抢险工作,妥善安排人员留守或者转移到安全地带,最大限度地保证现场人员和外援人员及相关人员的安全。
1.6 3D Tileset
使用 3DTiles 格式流式可以加载各种不同的 3D 数据,包括倾斜摄影模型、三维建筑物、CAD 和 BIM 的外部和内部,以及点云数据,并支持样式配置和用户交互操作。
3D Tileset 介绍
3DTiles 是在 glTF 的基础上,加了分层 LOD 的概念(可以把 3DTiles 简单地理解为带有 LOD 的 glTF),专门为流式传输和渲染海量 3D 地理空间数据设计的,例如倾斜摄影、3D 建筑、BIM/CAD、实例化要素集和点云。它定义了一种数据分层结构和一组切片格式,用于渲染数据内容。3DTiles 没有为数据的可视化定义明确的规则,客户可以按照适合自己的方式来可视化 3D 空间数据。同时,3DTiles 也是 OGC 标准规范成员之一,可在台式机、Web 端和移动应用程序中实现海量异构 3D 地理空间数据的共享、可视化、融合及交互功能。
在 3DTiles 中,一个瓦片集(Tileset)是由一组瓦片(Tile)按照空间数据结构(树状结构)组织而成的,它至少包含一个用于描述瓦片集的 JSON 文件(包含瓦片集的元数据和瓦片对象),每一个瓦片对象可以引用下面的其中一种格式,用于渲染瓦片内容。
瓦片的内容(瓦片格式的一个单独实例)是一个二进制 blob,具有特定于格式的组件,包括要素表(Feature Table)和批处理表(Batch Table)。瓦片内容参考多种要素集特征,例如表示建筑物或树木的 3D 模型或点云中的点,每个要素的位置和外观属性都存储在瓦片要素表中,其他应用于特定程序的属性则存储在批处理表中。客户端可在运行时选择要素,并检索其属性以进行可视化或分析。
上面表格中的 b3dm 和 i3dm 格式是基于 glTF(一种专为高效传输 3D 内容而设计的开放性规范)构建的,其瓦片内容在二进制体中嵌入了 glTF 资源,包含模型的几何和纹理信息,而 pnts 格式却没有嵌入 glTF 资源。
瓦片中的树状组织结合了层次细节模型(Hierarchical Level of Detail,简称 HLOD)的概念,以便最佳地渲染空间数据。在树状结构中,每个瓦片都有一个边界范围框属性,该边界范围框在空间中能够完全包围该瓦片和子节点的数据。
瓦片集可以使用类似于 2D 空间的栅格和矢量瓦片方案(如 Web 地图切片服务 WMTS 或 XYZ 方案),其在若干细节级别(或缩放级别)处提供预定义的瓦片。但是,由于瓦片集的内容通常是不一致的,或者可能很难仅在二维上组织,因此树可以是具有空间一致性的任何空间数据结构,包括 k-d 树、四叉树、八叉树和网格。
3DTiles 的样式是可选的,可以将其应用于 Tileset,样式是由可计算的表达式所定义,用于修改每个要素的显示方式。下图代码中 root 下的内容就是一个 Tile,即一个瓦片,其包含用于确定是否渲染瓦片的元数据、对渲染内容的引用及任何子瓦片的数组,切片实际上也是一个 JSON 对象。
Tiles-瓦片
瓦片包含用于确定是否渲染瓦片的元数据、对渲染内容的引用及任何子瓦片的数组,切片实际上也是一个 JSON 对象,它由以下属性组成。
(1)boundingVolumes(边界范围框)
boundingVolumes 定义了瓦片的最小边界范围,用于确定在运行时渲染哪个瓦片,有 region、box、sphere 三种形式。
(2)geometricError(几何误差)
geometricError 是一个非负数,以⽶为单位定义了不同瓦片层级的几何误差,通过几何误差来计算以像素为单位的屏幕误差(SSE),从而确定不同缩放级别下应该调用哪个层级的瓦片。简单来说,Tile 的⼏何误差是用来确定瓦片切换层级的,即控制 LOD 的。
(3)refine(细化⽅式)
refine 确定瓦片从低级别(LOD)切换为高级别(LOD)的呈现过程,简单来说就是瓦片是如何切换的,其中包括替换(REPLACE)和添加(ADD)两种方式。替换就是直接把父级的瓦片替换掉,添加则是在父级瓦片的基础增加细节部分。
理论上来说,ADD 是一种非常好的方式,是一种增量的 LOD 策略,能够减少数据的传输。这里强调统一下,refine 属性在根节点的 Tile 中是必须定义的,在子节点中是可选的,如果子节点没有定义,则继承父节点的该属性。
(4)content(内容)
content 属性指定了瓦片实际渲染的内容。content.uri 属性可以是一个指定二进制块(b3dm、i3dm、pnts、cmpt)的位置,也可以是指向另一个外部的 tileset.json。content.boundingVolume 属性定义了类似 Tile 属性 boundingVolume 的边界范围框,但是 content.boundingVolume 是一个紧密贴合的边界范围框,仅包含切片的内容。该属性可以用来做视锥体裁剪,只渲染视图范围内的内容,如果该属性没定义,系统也会自动计算。下图是关 Tile.boundingVolumes 和 content.boundingVolumes 的比较,红色是 Tile 的 boundingVolumes,包围 Tileset 的整个区域;蓝色是 content 的 boundingVolumes,仅包围切片中的渲染模型。
(5)children(子节点)
因为 3DTiles 是分级别的,所以每个 Tile 会有子 Tile、子子 Tile、子子子 Tile ......,分的越多,层级划分的越精细,这与下文要讲到的 Tileset 瓦片集 root.children 是同一个概念。
(6)viewerRequestVolume(可选,观察者请求体)
viewerRequestVolume 定义了一个边界范围,使用与 boundingVolumes 相同的模式,只有当观察者处于其定义的范围内时,Tile 才显示,从而实现精细控制个别瓦片的显示与否。
(7)transform(可选,位置变换矩阵)
transform 定义了一个 4x4 的变换矩阵 ,通过此属性,Tile 的坐标就可以是自己的局部坐标系内的坐标,最后通过自己的 transform 矩阵变换到父节点的坐标系中。它会对 Tile 的 content、boudingVolume、viewerRequestVolume 进行转换。详情可查看 3DTiles 的规范文档。
Tileset 瓦片集
通常一个 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,因此每个瓦片都含有三维建筑物模型,每个三维建筑物模型都有高度属性。属性中每个对象的名称与每个要素属性的名称相对应,并且包含该属性的最大值和最小值,这些值用于创建样式的颜色渐变非常有用。
(3)geometricError
geometricError 是一个非负数,是通过这个几何误差的值来计算屏幕误差,确定 Tileset 是否渲染。如果在渲染的过程中,当前屏幕误差用于这里定义的屏幕误差,这个 Tileset 就不渲染。即根据屏幕误差来控制 Tileset 中的 root 是否渲染。
(4)root
root 是一个 JSON 对象,定义最根级的 Tile,它存储的是真正的 Tile。也就是说,root 的数据组织方式与 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 加载 3DTiles
在 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) 来获取对应属性名的属性值。
3D Tileset 文件转换
三维地理空间内容(包括摄影测量/海量、模型、BIM/CAD、三维建筑、实例要素和点云)可以转换为三维分幅,并组合成单个数据集,以实现无缝性能和实时分析,包括测量、可见性分析、样式设置和过滤。
本次百分点科技主要介绍的就是当前比较流行的无人机倾斜摄影的模型转换方式,目前,无人机倾斜摄影技术的广泛应用,改变了传统的测绘作业方式,大幅度提升测绘行业的作业效率。无人机倾斜摄影技术,就是在无人机上搭载多台传感器,从垂直、倾斜等不同角度采集影像,通过对倾斜影像数据处理并整合其他地理信息,输出正射影像、地形图、三维模型等产品。
倾斜摄影转 3DTiles
转换方式:无人机航拍 > 倾斜摄影 > 3DTiles 转换 > 三维图层发布
转换工具:Cesiumlab3
三维模型发布:文件统一由文件服务器 go-fastdfs 统一管理,统一的路由、统一的命名、统一的服务。
矢量数据转 3DTiles
转换方式:矢量数据(shp) > 3Dtiles 转换 > 三维图层发布
转换工具:水经注(水经注万能地图下载器是一款基于各大地图服务器的多线程地图浏览下载软件)、Cesiumlab3。
三维模型发布:文件统一由文件服务器 go-fastdfs 统一管理,统一的路由、统一的命名、统一的服务。
1.7 空间分析
空间分析是指以地理事物空间位置和形态特征为基础,以空间数据运算、空间数据与属性数据综合运算能力为特征,提取与产生新的空间信息技术和过程。
下面就以应急蒸汽云、爆炸模型场景与城市风场场景为例进行说明:
(1)蒸汽云、爆炸模型调用流程:
· 前端先根据用户参数请求应用服务,应用服务再根据入参调用 Python 模型服务;
· Python 模型根据入参进行计算,并输出多条轮廓线矩阵数据,每条轮廓线都标识相应浓度信息;
· 前端再根据应用服务返回坐标数据应用服务再将矩阵数据的 x,y 坐标转换为经纬度返回给前端。
(2)城市风场模型调用流程:
· Three.js VTKLoader 尝试多种集成都集成不了,最终还是选定 vtk.js 作为可视化解决方案;
· Vtk.js 有显示窗口,无法与 GIS(cesium)100%融合,当前方案设计交互方式展现;
· 模型计算需要时间不能采用实时的交互方式采用离线的方式,模型生成文件后转换 vtp 存储到文件服务器当中。
· 可根据机构、用户、时间维度定义文件存储目录规则,系统可根据规则自动加载。
2. Cesium 与第三方技术的融合
2.1 监控视频与 GIS 的融合
在传统的视频监控系统中,工作人员需要同时观看多个分镜头画面,并且很难将零散的分镜头视频与其实际地理位置相对应,无法对大场景进行全局实时监测,也无法对历史事件进行快速回溯查找。三维 GIS 与监控视频的融合技术,可以将实时画面投射到三维实景模型上,通过经纬度、海拔等地理信息坐标体系,实现基于时空位置智能精准定位和时空动态分析,从而提升视频分析能力,实现人工智能的应用价值。
2.2 Echarts 可视化支持
Cesium 和 Echarts 也能很好的结合,满足多样化的统计、分析、展示数据等功能,例如分析各地区资源数据,统计突发事件造成得人员伤亡情况等,应用柱状图、折线图、饼图和地理信息数据更好地进行整合,直观展现多元化得信息。
2.3 MapV 可视化支持
MapV 是一款地理信息可视化开源库,可以用来展示大量地理信息数据,点、线、面的数据,每种数据也有不同的展示类型,如直接打点、热力图、网格、聚合等方式展示数据,能和 Cesium 很好得整合到一起,更直观地展示数据类型。
无人机检测气体浓度
结语
城市信息模型(City Information Modeling)即 CIM,是以城市信息数据为基数,建立起三维城市空间模型和城市信息的有机综合体,从数据类型上讲是大场景的 GIS 数据+小场景的 BIM 数据+物联网的有机结合,属于智慧城市建设的基础数据。BIM+3D GIS 的结合使得城市数字化,其中 GIS 起到了强大的枢纽作用,各个 BIM 单体之间连接网络管理能力,比如道路、地下管廊与管线等都是依靠 GIS 来实现的,同时对于大规模建筑群的 BIM 数据也具有管理能力,进而才有了 CIM 表现出一个虚拟的智慧城市。
基于应急行业大数据和其它互联网相关数据,并结合 CIM,能够让应急系统的数据信息更加完善、多源和高精度。通过对这些数据的深度挖掘和分析,为应急智慧平台打下夯实的基础,制定更合理的应急预案、应急体系,为改善和优化救援指挥工作提供高效的指引,从而全面提高资源的合理分配,为处理突发事件、预防自然灾害、减少危险品爆炸事件、保障人民群众财产安全和智慧城市建设等提供决策支撑。
百分点大数据技术团队已经在该技术路线上积累了丰富的经验,我们将继续创新实践,不断探寻、思考和深化,为客户提供更加完善的技术服务。
评论