文章中所有操作均是在 Cesium 1.91 版本下进行的,其它版本差异请自行适配
地形服务
一些应用场景中我们需要操作地形数据,为此 Cesium 还提供方便的地形服务 TerrainProvider 基类,基于此类,Cesium 封装了5个现成的继承类操作地形图层数据。
可以通过帮助文档搜索 TerrainProvider 可以看到 Cesium 提供的一些接口,如下图:
其中针对 TerrainProvider 基类还要一些比较关键的属性和函数:
- tilingScheme,Provider 内部地球网格的剖分方式,通常是 WGS84 坐标,也可以选择墨卡托坐标系。
- hasWaterMask,是否支持水面效果。
- hasVertexNormals,地形数据中是否包含法向量(光照是否支持)。
- heightmapTerrainQuality,地形显示的精度。
在介绍地形服务之前,需要简单的说一下坐标系,地形,影像图层的之前的差异。Cesium 中目前支持 WGS1984和墨卡托投影两种。地形 Terrain 和影像 Imagery 分别采用自己的坐标系,比如 Terrain 默认采用 WGS1984 的坐标系,这和经纬高的差不多,而目前 Imagery 影像服务基本都是墨卡托投影。
EllipsoidTerrainProvider
EllipsoidTerrainProvider 是 Globe 默认采用的地形 Provider,该 Provider 不支持水面,没有法向量,开启光照对 Tile 也是无效的。它提供了一个全球范围内高度为 0 的地形,不需要额外的地形文件,就可以实时的自己来构建这个高度为 0 的 Mesh。对那些没有网络环境,或网络不理想,或不需要地形的应用,EllipsoidTerrainProvider 提供了最简单的,无需额外负担的地形数据来构网。EllipsoidTerrainProvider 具有其它 TerrainProvider 不具备的属性 tileScheme,支持 WGS1984 和墨卡托投影两种。一般情况下,可以让 Terrain 的坐标系和 Imagery 的保持一致,都设置成墨卡托投影。
代码片段:
const viewer = new Cesium.Viewer("cesiumContainer");
var terrainProvider = new Cesium.EllipsoidTerrainProvider();
viewer.terrainProvider = terrainProvider;
//设置初始位置 喜马拉雅山随便找了一个地方
viewer.camera.setView({
destination: Cesium.Cartesian3.fromDegrees(89.26886, 27.58251, 10000.0),
orientation:{
//北为0度,90指的是向正东方
heading: Cesium.Math.toRadians(0),
//平视为0度,-90指的是俯视
pitch: Cesium.Math.toRadians(-30),
roll: 0.0
}
});
效果如下:
CesiumTerrainProvider
Cesium 标准地形,支持量化网格地形切片,兼容 Cesium ion 所服务的地形数据。
代码片段:
const viewer = new Cesium.Viewer("cesiumContainer");
var terrainProvider = new Cesium.CesiumTerrainProvider({
url: Cesium.IonResource.fromAssetId(3956),
requestWaterMask: true, //请求水体效果所需要的海岸线数据
requestVertexNormals: true //请求地形照明数据
});
viewer.terrainProvider = terrainProvider;
//设置初始位置 喜马拉雅山随便找了一个地方
viewer.camera.setView({
destination: Cesium.Cartesian3.fromDegrees(89.26886, 27.58251, 10000.0),
orientation:{
//北为0度,90指的是向正东方
heading: Cesium.Math.toRadians(0),
//平视为0度,-90指的是俯视
pitch: Cesium.Math.toRadians(-30),
roll: 0.0
}
});
效果如下:
CesiumTerrainProvider 还可以处理离线地形数据,作者手里没有现成的地形数据,所以就不在演示了。
VRTheWorldTerrainProvider
可以通过细分高度图来生成地形几何,一般都是从 VT MAK VR-TheWorld Server 服务器调取服务。这里就不进行太多阐述了,用的实在不多(作者找不到太好的示例)。
GoogleEarthEnterpriseTerrainProvider
使用 Google Earth Enterprise REST API 提供地形服务,需要翻墙,也不进行演示。
另外:ArcGISTiledElevationTerrainProvider
ArcGIS 的地形,和 EllipsoidTerrainProvider 差不多,因此同样的不支持法线,水面,但可以选择坐标系,与 EllipsoidTerrainProvider 不一样之处在于每一个切片会根据 ArcGIS 规范请求一张图片。调用 ArcGIS 在线服务需要授权的 token,这里也不演示了。
最后
地形服务,和影像服务不太一样,相对操作简单一些,可以直接某个 TerrainProvider 直接赋值给 Viewer.terrainProvider 即可,需要单独控制它们的显示或隐藏,因为 Cesium 中的地形图层只能有一个。
另外还有基于 Cesium ion 的地形服务,可参考《基于Cesium ion的添加地形》,并且在内置的 BaseLayerPicker 中也有几个自带的地形服务。