14 Cesium—地形服务

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WorkLee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值