地形介绍
cesiumjs中的地形系统是一种由流式瓦片数据生成地形的技术。
添加地形将视角放平时
地形显示wireframe
cesiumjs支持两种类型的地形,STK World Terrain和Small Terrain。
STKWorld Terrain是高分辨率, 基于quantized mesh的地形。这是一种基于网格的地形,可充分利用GL中的Shader来渲染,效果相当逼真。STK World Terrain使用了多种数据源,分别适应不同地区和不同精度时的情形。比如对于美国本土使用National Elevation Dataset (NED)的高程,精度3-30米;对于欧洲使用EU-DEM高程,精度30米;对于澳洲使用Australia SRTM-derived 1 Second DEM高程,精度30米;对于-60至60纬度段使用CGIAR SRTM高程,精度90米;对于整个地球使用GTOPO30,精度1000米。STK World Terrain地形是怎样生成的是不公开的,如需应用于封闭的局域网时,则需购买AGI的STK terrain server。但是AGI提供了一个webapi可供因特网上调用,并提供了这种地形的格式细节,期待早日有高手作出一个转换工具。
http://cesiumjs.org/data-and-assets/terrain/formats/quantized-mesh-1.0.html
Small Terrain是中等高分辨率,基于heightmap的地形,渲染出的地形效果不如quantized mesh的地形,但也基本能接受。网上已经有一些开源的生成工具可以由DEM数据生成这种规范的.terrain文件,因此我们重点讨论这种类型的地形。
生成工具是cesium googlegroup里一个俄国人提供的gdal2srtmtiles.py(https://groups.google.com/forum/#!topic/cesium-dev/rBieaEBJHiU),需要gdal库和numpy。
具体用法 python gdal2srtmtiles.py --cesium -z 0-15 -pgeodetic ‘YN_DEM.tif', 'I:\\tilesCache\\terrain_tiles'
YN_DEM.tif是输入地形源文件,是一个geotiff格式的高程数据,网络上有很多免费的高程数据,比较著名的SRTM90的,ASTER30的,都可以用作输入的地形数据源。terrain_tiles是生成的地形瓦片所在的目标目录,
-z 0-15参数表示zoom为0到15级,级别越高越详细,数据量也越大。-p geodetic暂时不知道,估计与投影相关,--cesium表示生成cesium特定的地形。生成过程时间长短与源数据的大小有关,楼主的YN_DEM.tif覆盖云南全境的30米精度ASTER DEM,1G多大小,头一天下班时运行,第二天下午生成完毕,8G多的瓦片,0-15级。
每个目录下都有.terrain,.hdr,.kml三种文件,我们只用到.terrain文件。
发布为地形服务很简单,不需要任何服务器端编程知识,把terrain_tiles配置到webserver的Webroot下的一个子目录就行,同时要把.terrain这种文件的Content-Type设为'application/octet-stream'加到web服务器的配置中,服务器端就算搞定。
client端就更简单了,viewer中有个terrainProvider属性,直接new一个CesiumTerrainProvider就行。
1 2 3 4 5 | var viewer = new Cesium.Viewer('cesiumContainer',{ terrainProvider:new Cesium.CesiumTerrainProvider({ url: "http://localhost:88/terrain_tiles" }) }); |
PS:heightmap的地形总体上来说基本还原了地球表面应有的高低起伏,有些区域会有一些横断面像刀切一样失真,在一些对细节不是很在意的应用中还是很有吸引力的。
在截稿时突然想到一个办法,既然AGI开放了STK World Terrain的webapi,那何不把这些高精度quantized mesh瓦片按所需区域下载下来存到数据库或文件系统上,这样本地局域网也能应用到高精度地形了,反正地形几十年也不变,不存在更新什么的。
本篇到此结束,下一篇《cesiumjs开发实践(五) 坐标系统》