Cesium加载地形数据
- 一、什么是地形数据
- 二、TerrainProvider类
- 常用属性
- 常用方法
- 三、TerrainProvider子类
- CesiumTerrainProvider类
- 常用属性
- 常用方法
- CustomHeightmapTerrainProvider类
- ArcGISTiledElevationTerrainProvider类
- 常用属性
- 常用方法
- EllipsoidTerrainProvider类
- 常用属性
- 方法
- 四、使用CesiumTerrainProvider加载地形数据实例
一、什么是地形数据
地形数据是描述地球表面和地形高度的数字模型或图像。在三维可视化应用中,地形数据通常用于创建真实感强的地形表面,以便用户可以更好地了解地球表面的特征和地貌。
在Cesium中,可以使用TerrainProvider类的子类来加载地形数据,通过把某个子类实例化的TerrainProvider赋值给Viewer.terrainProvider来实现地形数据的显示
二、TerrainProvider类
TerrainProvider类是Cesium中用于加载地形数据的基本类。它定义了一组接口,用于请求和获取地形高度数据以及其他地形信息
常用属性
- availability : 可用性,表明地形数据是否可用,以及对于特定区域和层次的细节级别(LOD),哪些数据是可用的。可用性可以是常量或动态计算
- errorEvent : 事件对象,当加载地形数据出现错误时触发
- credit : 当前TerrainProvider的信息
- tilingScheme : 瓦片方案,描述了如何将地球表面划分为瓦片并创建坐标系
- hasVertexNormals : 指示该TerrainProvider是否提供每个顶点的法向量(垂直于表面)
- hasWaterMask : 指示该TerrainProvider是否提供水体区域掩码,即指示哪些区域是水体的二进制图像
常用方法
- requestTileGeometry(x, y, level, throttleRequests):请求一个指定层次级别(x, y, level)的瓦片的几何数据
- getLevelMaximumGeometricError(level):获取指定层次级别的最大几何误差
- getTileDataAvailable(x, y, level):获取瓦片是否可用
三、TerrainProvider子类
Cesium中的TerrainProvider有多个子类,每个子类都支持不同类型的地形数据源和/或渲染技术。Cesium中常见的TerrainProvider子类主要有下面几种:
- CesiumTerrainProvider:使用STK World Terrain数据源加载高程数据,支持地形纹理贴图。CesiumTerrainProvider是Cesium默认的地形提供者。
- CustomHeightmapTerrainProvider:Cesium中用于自定义高程数据的地形提供器,它允许开发人员使用程序生成或者从其他来源导入高程数据来创建自定义的地形。
- GoogleEarthEnterpriseTerrainProvider:加载Google Earth Enterprise服务器上的高程和图像数据。
- ArcGISTiledElevationTerrainProvider:使用ArcGIS Server提供的切片瓦片服务作为高程数据的地形。它可以访问由ArcGIS Server发布的预先生成的高程切片,并支持动态获取和缓存切片
- VRTheWorldTerrainProvider:加载VR-TheWorld的高程和图像数据。
- EllipsoidTerrainProvider:使用椭球体作为地形模型,不提供任何高程数据。
在Cesium中常用的TerrainProvider子类主要是CesiumTerrainProvider类
CesiumTerrainProvider类
CesiumTerrainProvider使用STK World Terrain数据源加载高程数据,支持地形纹理贴图。数据源提供全球30米分辨率的高程数据和地表覆盖材料图层。CesiumTerrainProvider支持动态地形数据获取、卸载和缓存,并可以在运行时更改LOD级别和地形贴图。CesiumTerrainProvider适用于需要高精度和高性能地形渲染的应用程序
常用属性
url
:加载地形数据的URL地址。requestVertexNormals
:布尔类型,表示是否请求顶点法线信息requestWaterMask
:一个布尔类型,表示是否请求水面遮罩信息hasVertexNormals
:只读布尔值,表示该地形提供器是否包含顶点法线信息hasWaterMask
:只读布尔值,表示该地形提供器是否包含水面遮罩信息errorEvent
:Event类型,当地形数据请求错误时触发availability
:定义地形数据可用性的TimeIntervalCollection对象
常用方法
requestTileGeometry(x, y, level, request)
:请求给定坐标和级别的地形几何数据。该方法返回Promise对象,可以在其完成时获得地形几何数据getLevelMaximumGeometricError(level)
:获取指定级别的最大地形几何误差getTileDataAvailable(x, y, level)
:查询给定坐标和级别的地形数据是否可用
CustomHeightmapTerrainProvider类
CustomHeightmapTerrainProvider继承自HeightmapTerrainProvider类,因此具有HeightmapTerrainProvider的所有功能,如同步和异步请求高程瓦片、获取最大几何误差等。此外,CustomHeightmapTerrainProvider还实现了requestHeightmapTerrain方法。这个方法应该由子类实现,以便返回自定义高程数据。
在自定义高程数据时,需要确定数据的分辨率、范围和格式。可以使用数字高程模型(DEM)文件、图像文件、数据库或其他格式存储高程数据,并将其转换为CustomHeightmapTerrainProvider可以处理的格式。
使用CustomHeightmapTerrainProvider可以实现各种自定义地形效果,例如在虚拟环境中加载真实世界的高程数据、制作类似Minecraft的方块式地形等
CustomHeightmapTerrainProvider类的常用属性和方法与CesiumTerrainProvider相似,这里不再赘述,详细内容请参考官方文档
ArcGISTiledElevationTerrainProvider类
ArcGISTiledElevationTerrainProvider是Cesium中用于加载ArcGIS Server提供的切片瓦片服务作为高程数据的地形提供器。
常用属性
errorEvent
:一个事件,当地形数据请求错误时触发credit
:一个Credit对象,描述了数据源和/或版权信息availability
:定义地形数据可用性的TimeIntervalCollection对象
常用方法
requestTileGeometry(x, y, level, request)
:请求给定坐标和级别的地形几何数据。该方法返回Promise对象,可以在其完成时获得地形几何数据getLevelMaximumGeometricError(level)
:获取指定级别的最大地形几何误差getTileDataAvailable(x, y, level)
:查询给定坐标和级别的地形数据是否可用
EllipsoidTerrainProvider类
EllipsoidTerrainProvider是Cesium中的一个内置地形提供器,它提供了一个基于椭球体的模型来呈现地球表面的近似几何形状。与其他地形提供器不同的是,EllipsoidTerrainProvider并不依赖于实际的地形数据,而是根据其定义的椭球体模型生成地球表面的高程网格。
EllipsoidTerrainProvider继承自TerrainProvider类,具有TerrainProvider的所有功能,例如异步加载地形数据、请求地形数据等
EllipsoidTerrainProvider适用于需要快速渲染地球表面的应用场景,例如在展示全球范围的卫星图像或者天气数据时,可以通过EllipsoidTerrainProvider快速生成一个近似的地球表面几何模型,并将数据贴合到这个模型上,从而实现快速、流畅的地球表面展示效果。
常用属性
tilingScheme
:一个TileTilingScheme对象,描述了该地形提供器使用的切片方案。ellipsoid
:描述地球近似几何形状的Ellipsoid对象
方法
getLevelMaximumGeometricError(level)
:获取指定级别的最大地形几何误差requestTileGeometry(x, y, level, request)
:请求给定坐标和级别的地形几何数据。该方法返回Promise对象,可以在其完成时获得地形几何数据
四、使用CesiumTerrainProvider加载地形数据实例
在Cesium中加载地形数据非常简单,只需要创建一个CesiumTerrainProvider对象,配置相关参数,并将其赋值给viewer.terrainProvider 就可以完成加载地形数据
// 加载地形数据
const terrainProvider = new Cesium.CesiumTerrainProvider({
url:Cesium.IonResource.fromAssetId(3956),
requestWaterMask:true,//请求水体效果所需要的海岸线数据
requestVertexNormals:true,//请求地形照明数据
})
viewer.terrainProvider = terrainProvider
刷新页面,将地球缩放的一定级别,可以看到地形数据已经加载进来了,起伏的山脉还是比较明显的。
OK,关于Cesium加载地形数据的内容,就介绍到这里了。