我们在之前曾介绍过了 Leaflet 的相关内容,但是纵观下来我们可以发现,Leaflet
其实只是局限在二维场景当中的应用,而我们今天将要介绍到的 Cesium
则是主要用于处理三维场景,话不多说,我们下面就来认识一下 Cesium
什么是 Cesium
关于 Cesium
的由来背景我们就不过多提及了,其实简单来说,Cesium
就是一个跨平台、跨浏览器的展示三维地球和地图的 JavaScript
库,它使用 WebGL
来进行硬件加速图形,在使用时不需要任何插件支持(但是浏览器必须支持 WebGL
),它提供了基于 JavaScript
语言的开发包,方便用户快速搭建一款零插件的虚拟地球 Web
应用,并在性能,精度,渲染质量以及多平台,易用性上都有高质量的保证
如果从单纯的可视化方向来看的话,Cesium
与 Leaflet
以及 OpenLayer
等没有本质的区别,只是 Cesium
支持三维场景,实现的效果可以更加精致,使用 Cesium
的话可以做到以下几点
- 支持全球级别的高精度的地形和影像服务
- 支持
2D
,2.5D
,3D
形式的地图展示,真正的二三维一体化 - 可以绘制各种几何图形、高亮区域,支持导入图片,甚至
3D
模型等多种数据可视化展示 - 支持矢量、海量模型数据(倾斜,
BIM
,点云等) - 支持基于时间轴的动态数据可视化展示
此外,在 Cesium
当中所支持的数据格式主要有以下这些,这里我们先有个了解,在后续章节当中我们会来详细进行介绍
- 影像数据 -
Bing
、天地图、ArcGIS
、OSM
、WMTS
、WMS
等 - 地形数据 -
ArcGIS
、谷歌、STK
等 - 矢量数据 -
KML
、KMZ
、GeoJSON
、TopoJSON
、CZML
- 三维模型 -
GLTF
、GLB
(二进制glTF
文件) - 三维瓦片 -
3D Tiles
(倾斜摄影、人工模型、 三维建筑物、CAD
、BIM
,点云数据等)
Cesium 目录结构
本小结当中我们来看 Cesium
目录结构,我们对于下载的 Ceisum
进行解压,解压内容如下图所示
其中涉及到的文件以及文件夹的释义如下
1 | ├── Apps |
API 结构
接着我们再来简单的了解一下 Cesium API
的结构,整体如下图所示(可以右键在新标签中打开来查看大图)
为了方便理解和记忆,我们可以将其分为以下几类
Viewer 类属性
主要包括
imageryLayers
- 影像数据terrainProvider
- 地形数据dataSources
- 矢量数据entities
- 几何实体集合(用于空间数据可视化)Widgets
- 组件,即Viewer
初始化界面上的组件Camera
- 相机Event
- 事件,鼠标事件、实体选中事件等
Scene 类属性
主要包括
primitives
- 图元集合(几何体和外观)postProcessStages
- 场景后期处理- 环境对象,大气圈、天空盒、太阳、月亮等
Event
事件,更新、渲染事件等Camera
类属性- 位置、方位角、俯仰角、翻滚角
空间计算
主要包括三维矩阵、四元数、四维矩阵、转换等
Cesium 基本用法
下面我们就来看看 Cesium
的基本使用方式,就以官方提供的 HelloWorld
示例为例,让我们来看看 Cesium
运行起来以后到底是什么样子的,其实如果想要初始化一个地球,其实只需简单的四步
第一步,引入 Cesium.js
,该文件定义了 Cesium
对象,它包含了我们需要的一切,这里我们采用的线上地址,当然也可以下载 Cesium
包,使用 Build
文件夹下面的 Cesium.js
,下载地址见 Cesium Download
1 | <script src="https://cesium.com/downloads/cesiumjs/releases/1.84/Build/Cesium/Cesium.js"></script> |
第二步,引入 widgets.css
,为了能使用 Cesium
各个可视化控件
1 | @import url(widgets.css); |
第三步,我们新建立一个 div
,用来作为三维地球的容器
1 | <div id="cesiumContainer"></div> |
第四步,初始化一个 CesiumViewer
实例
1 | var viewer = new Cesium.Viewer('cesiumContainer') |
经过如上四步操作,我们就已经初始化一个地球了,完整代码如下
1 | <!DOCTYPE html> |
但是这里有一点需要注意,那就是如果我们直接双击打开 html
文件的话是无法正常显示的,这是因为 Cesium
程序需要运行在 Web
服务器上的,搭建服务的过程我们也就不过多提及了,可以采用 express
或者 koa
等方式,也可以使用一些现成的库,比如 anywhere
,live-server
等,以上代码所呈现出来的效果是下面这样的
但是我们可能已经发现,在界面的右上角和底部有许多小的控件,我们来简单的标注一下
但是在我们实际开发过程当中,有时候需要对界面做一定的定制,这也就需要隐藏一部分界面中的元素,通常我们有两种方式来隐藏界面中的元素,首先我们需要知道,new Cesium.Viewer()
构造函数其实有两个参数
- 一个是实例挂载的元素,必选项
- 另一个则是
options
,也就是初始化配置对象,它是可选项
所以说,在 options
对象中,我们可以配置初始化的一些控件显示隐藏以及一些渲染配置,这里列举出一些常用的配置
1 | var options = { |
如上配置运行之后我们就可以发现界面上面的控件都已经被隐藏了,效果是下面这样的
但是可以发现,虽然控件已经没有了,但是屏幕下方还有 Cesium
的 logo
信息,我们也可以让它也不显示,只需要配置如下选项
1 | // 隐藏下方 Cesium logo |
如下,这样一来我们就可以获得一个干净的地球实例,效果图如下
其次如果不想这么复杂,我们也可以直接通过 CSS
的方式来对界面当中的控件进行隐藏,如下所示
1 | /* 不占据空间,无法点击 */ |
运行以后可以发现,跟我们通过配置项的方式实现的效果是一样的,不过有一点需要注意,全屏按钮不能通过 display: none
的方式来达到隐藏的目的,这是因为生成的按钮控件的行内样式设置了 display
属性,会覆盖引入的 CSS
属性
这里另外提及一点,那就是我们也可以配置显示帧速(FPS
),只需要添加下面这个配置即可
1 | viewer.scene.debugShowFramesPerSecond = true |
效果是下面这样的
小结
至此,关于 Cesium
入门的相关内容我们就介绍了的差不多了,现在我们对于 Cesium
也已经有了一个大体的认识,并且可以通过引用 Cesium
做一些初始化的场景了,在下一章当中我们将会介绍 Cesium
当中的数据加载相关内容,主要包括影像、地形、矢量、空间数据等
参考
下面有一些可以参考的网址
Cesium 官方教程 - Cesium
出的官方教程
Cesium API 英文官方文档 - Cesium
的 API
文档
Cesium API中文文档 - Cesium
的 API
中文文档
Cesium Sandcastle 沙盒示例 - Cesium
官方的一些示例程序
Cesium 中文网 - Cesium
中文网,主要是系列教程方面的内容