Cesium支持流式的、可视化的全球高程投影地形地势、水形数据,包括海洋、湖泊、河流、山峰、峡谷和其他能够被三维展示出来的且效果比二维好的地形数据。像图层数据一样,Cesium引擎会从一个服务器上请求流式地形数据,仅请求那些基于当前相机能看到的需要绘制的图层上的数据。
DEM是数字高程模型的英文简称(Digital Elevation Model),是研究分析地形、流域、地物识别的重要原始资料。由于DEM 数据能够反映一定分辨率的局部地形特征,因此通过DEM 可提取大量的地表形态信息,可用于绘制等高线、坡度图、坡向图、立体透视图、立体景观图,并应用于制作正射影像、立体地形模型与地图修测。在测绘、水文、气象、地貌、地质、土壤、工程建设、通讯、军事等国民经济和国防建设以及人文和自然科学领域有着广泛的应用。
Cesium 加载在线地形数据
Cesium ion提供了全球地形数据服务,可以通过token访问
var viewer = new Cesium.Viewer('cesiumContainer', {
terrainProvider: Cesium.createWorldTerrain()
});
Cesium 加载离线地形切片
CesiumLab 可直接将tif格式的数据转换为地形切片,是免费的转换工具。转换完成后可通过web容器(tomcat or nginx等)发布,调用demo如下:
var terrainLayer = new Cesium.CesiumTerrainProvider({
url: "http://localhost:6666/terrain_tiles",
requestVertexNormals: true, // 请求照明
requestWaterMask: true // 请求水波纹效果
});
var viewer = new Cesium.Viewer('cesiumContainer', {
terrainProvider: terrainLayer,
});
Cesium 支持的地形数据
Cesium有以下地形提供器
- EllipsoidTerrainProvider 普通椭球体,默认无高度,无需请求服务,但可用程序设置高度
- CesiumTerrainProvider 最常用地形提供器,加载相关地形数据服务
- VRTheWorldTerrainProvider 支持从VT MAK VR-TheWorld Server服务器请求的地形图
- GoogleEarthEnterpriseTerrainProvider 支持由Google Earth Enterprise服务器生成的地形服务
- ArcGISTiledElevationTerrainProvider ArcGIS的高程服务
地形提供器是用来结构化地形数据,内部是通过TerrainData来实际处理地形数据
TerrainData的接口由以下三个方法继承实现:
- HeightmapTerrainData 高度图
- QuantizedMeshTerrainData 量化网格
- GoogleEarthEnterpriseTerrainData 谷歌地球地形
Cesium支持的格式主要就是Heightmap和Quantized-Mesh,大体原理类似
地形瓦片(heightmap-1.0)格式的terrain瓦片集是根据TMS(瓦片地图服务)global-geodetic(全球大地坐标)规则进行切分。所有图块都具有后缀名.terrain
瓦片切分规则:
TMS特性简述:
TMS中一个瓦片地图(TileMap)由一组具有不同比例尺瓦片集(TileSet)组成,每个瓦片集由相同大小格式的规则瓦片平铺而成。下一级的瓦片集由上一级的四叉分割而来(整个地图就是个四叉树结构)。
对于一个瓦片地图(TileMap)只能支持一个空间参考系(SRS)和一种图像格式,如果需要支持多种就要做多个瓦片地图。
瓦片地图具有边界范围(BoundingBox)和原点(Origin),原点是0,0瓦片的左下角(也是-1,-1瓦片的右上角),也就是轴向是向左向上。
global-geodetic切分规则:
坐标系为WGS84大地坐标系(<SRS>EPSG:4326</SRS>)
对于任意级别(n),该级别瓦片集的瓦片像素分辨率为units-per-pixel = 0.703125/2^n
0级为覆盖全球的2个256x256像素大小(地理大小为180*180度)的图块,其Origin为-180,90
heightmap 1.0 特定规则:
所有图块都具有后缀名.terrain。
图块大小为65x65像素大小,实际上图块的最后一行和最后一列是相邻的 东边/南边 图块的第一行/第一列。因为其大小不是256x256,所以其对应级别的分辨率也有所不同。
图块获取URL示例如下:对于顶级的两个图块:
(-180°, -90°) - (0 °, 90 °) - /path/tilesets/terrain/smallterrain/0/0/0.terrain
( 0°, -90 °) - (180 °, 90 °) - /path/tilesets/terrain/smallterrain/0/1/0.terrain
往下一级的8个图块:(-180°,-90°) - ( -90°, 0°) - /path/tilesets/terrain/smallterrain/1/0/0.terrain
( -90°,-90°) - ( 0°, 0°) - /path/tilesets/terrain/smallterrain/1/1/0.terrain
( 0°,-90°) - ( 90°, 0°) - /path/tilesets/terrain/smallterrain/1/2/0.terrain
( 90°,-90°) - ( 180°, 0°) - /path/tilesets/terrain/smallterrain/1/3/0.terrain
(-180°, 0°) - ( -90°, 90°) - /path/tilesets/terrain/smallterrain/1/0/1.terrain
( -90°, 0°) - ( 0°, 90°) - /path/tilesets/terrain/smallterrain/1/1/1.terrain
( 0°, 0°) - ( 90°, 90°) - /path/tilesets/terrain/smallterrain/1/2/1.terrain
( 90°, 0°) - (180 °, 90 °) - /path/tilesets/terrain/smallterrain/1/3/1.terrain