Cesium笔记(4):terrainProvider地形控件STK World Terrain和Small Terrain
Author:zhoulujun Date:
Cesium支持流动的海洋与有真实高度差的山峰,这个就需要地形图
cesiumjs地形图
cesiumjs中的地形系统是一种由流式瓦片数据生成地形mesh的技术
cesiumjs支持两种类型的地形,STK World Terrain和Small Terrain。
http://cesiumjs.org/data-and-assets/terrain/formats/quantized-mesh-1.0.html
STK World Terrain
STK World 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可供因特网上调用,并提供了这种地形的格式细节,期待早日有高手作出一个转换工具。
Small Terrain
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 -p geodetic ‘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_tiles配置到webserver的Webroot下的一个子目录就行,同时要把.terrain这种文件的Content-Type设为'application/octet-stream'加到web服务器的配置中,服务器端就算搞定。
client端就更简单了,viewer中有个terrainProvider属性,直接new一个CesiumTerrainProvider就行。
var viewer = new Cesium.Viewer('cesiumContainer',{ terrainProvider:new Cesium.CesiumTerrainProvider({ url: "http://localhost:88/terrain_tiles" }) })
国内的有超图的:加载地形数据操作手册——
http://support.supermap.com.cn:8090/webgl/examples/TopicDoc/LoadTerrain_OperateTopic.htmlcesium添加山峰与海洋
//山峰山形地形 var mountainTerrainProvider = new Cesium.CesiumTerrainProvider({ url : 'https://assets.agi.com/stk-terrain/v1/tilesets/world/tiles', }); viewer.terrainProvider = mountainTerrainProvider; //水纹 var waterTerrainProvider = new Cesium.CesiumTerrainProvider({ url : 'https://assets.agi.com/stk-terrain/v1/tilesets/world/tiles', requestWaterMask: true////请求水波纹效果 }); viewer.terrainProvider = waterTerrainProvider; //光照 var terrainProvider = new Cesium.CesiumTerrainProvider({ url : 'https://assets.agi.com/stk-terrain/v1/tilesets/world/tiles', requestVertexNormals: true//请求照明 }); viewer.terrainProvider = terrainProvider; viewer.scene.globe.enableLighting = true;//开启照明
参看文章:
cesiumjs开发实践 (四) https://blog.csdn.net/happyduoduo1/article/details/51942849
Cesium学习笔记(三): 图像层(Imagery Layers)和地形(Terrain) https://blog.csdn.net/UmGsoil/article/details/74453402
转载本站文章《Cesium笔记(4):terrainProvider地形控件STK World Terrain和Small Terrain》,
请注明出处:https://www.zhoulujun.cn/html/GIS/cesium/8329.html