第一次写博客,有点紧张和激动。GIS群里的小伙伴都在猜我是谁,先留个悬念吧,哈哈。
最近正好在工作换挡期,又想把三维捡起来倒腾一下,就记录一下如何用Cesium构建三维场景。这个有很多前辈都已经实现过,但是自己尝试很多次,这次算是成功,也算是一个小小的里程碑。
首先是数据的准备
三维场景需要地形数据和叠加正摄影像,而Cesium支持的地形数据有两种,一种为STK World Terrain ,另一种是 Small Terrain。具体这两种的区别可参见前辈们的文章。
在Cesium群中,有群友Wonder贡献出一个getTerrain.py,用Python2.x来运行,可以下载.terrain的文件,但是用gallery中的Terrain示例却无法调用。
查找原因后无果,准备用Python3添加请求头再试试。
对请求头添加请求头,其中包括User-Agent、Accept、Accept-Encoding、Accept-Language等,请求地址为
https://assets.agi.com/stk-terrain/world/0/0/0.terrain?v=1.31376.0&f=TerrainTile
注意,下载下来的文件大小为3896字节,而请求页面上显示为2035字节。原来下载下来的文件经过gzip解压了,所以必须在python代码中添加gzip解压这段代码进去,否则下载下来的文件只有2035字节并且Cesium中无法使用
下载完terrain后,还需要下载layer.json这个可以找个STKTerrain的例子,获得该文件。
打开该layer.json并格式化(在线格式化工具http://tool.oschina.net/codeformat/js/),可以看出,现在的数据版本变化了
Small Terrain 是中等高分辨率,基于heightmap的地形,渲染出的地形效果不如quantized mesh的地形,但也基本能接受。
网上已经有一些开源的生成工具可以由DEM 数据生成这种规范的.terrain文件,因此我们下面重点说明这种类型的地形生成。
在易至天工开源的tiff转terrain源码中,有这样一段话
//前7层建议自己到到CES上去下,下载地址 string url = "http://cesiumjs.org/smallterrain/" + layer.ToString() + "/" + x.ToString() + "/" + y.ToString() + ".terrain";
所以前0-6级我们也可以通过python进行爬取
将上面的代码地址换一下即可,同样它也是需要gzip解压的。
接下来可以到SRTM(http://srtm.csi.cgiar.org/index.asp)上下载90m分辨率的DEM数据,并通过易至天工开源的源码进行转换成terrain文件,注意输入等级时候要按照以下格式
其次,通过Cesium加载三维场景
在Cesium 上加载本地地形Provider