
文章中所有操作均是在 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 中也有几个自带的地形服务。
5378



被折叠的 条评论
为什么被折叠?



