学习 Cesium (五):加载离线高程数据
前言
通过前面的学习,Cesium 最基本的应用已经可以了。但是,在实际项目中我们还需要加入高程数据,才能显示真实的地形。下面我就一步一步介绍如何加载真实的高程数据。
本文的测试环境
- OS: Window 10 家庭版
- Cesium: v1.78.0
- Web Browser: Chrome v88.0.4324.150
基本的构建流程
获取高程数据
高程数据从哪里来呢?现在市面上有些卫星地图下载软件,比如水经注、BIGEMAP等,其中一些也包含高程数据下载。我没有试过,具体好不好用不清楚。也可以到CGIAR CSI的网站下载。
这里介绍最原始的方法,就是去 NASA 的 EarthData 网站下载。这里有很多全球地理数据,大家可以找自己想要的下载。
-
我这里选择了 ASTGTM v003 的数据,可以在这个网址 https://lpdaac.usgs.gov/products/astgtmv003/ 查看。
-
点击页面的【ACCESS DATA】按钮,在弹出对话框中可以看到有多种下载方式。我选择了从 NASA Earthdata Search 下载。
-
点击弹出窗口 NASA Earthdata Search 的【Download Data】按钮,进入下载流程。这里提醒需要先注册 Earthdata 的账户。请注册登录账户后进行下载。建议选用脚本的方式下载,因为是国外网站,数据量大,经常会因为网络不稳定导致下载中断。使用脚本可以在中断后重新执行脚本,继续下载。
高程数据处理
高程数据一般是 .tif 文件格式,在应用到 Cesium 前,需要将其转换成瓦片文件。cesium目前支持的格式有下面的两种地形格式,分别是:
- Quantized-Mesh(推荐使用)
- HeightMap
在heightmap 1.0 terrain format说明页面上,官方明确指出这种格式已经废弃了,推荐使用quantized-mesh。
地形文件制作有三种途径:
- 使用 Cesium 实验室的 Cesiumlab2 工具进行处理,开箱即用。
- 使用 gdal2srtmtiles.py 脚本进行处理,需要安装依赖工具库。
- 使用 Cesium Terrain Builder 开源工具进行处理,需要编译安装相关软件。
使用 Cesiumlab 制作地形文件
- 下载 Cesiumlab 安装文件,我使用的的 Cesiumlab v2.0.8 版本。
- 注册账户,登录使用。
该软件可生产 Quantized-Mesh 和 HeightMap 两种格式的地形文件。软件界面友好,详细制作过程无需说明,在此略过。
使用 gdal2srtmtiles.py 脚本制作heightmap-1.0 格式地形文件
请先下载工具包 https://download.csdn.net/download/LeoOthello/15911813 ,可将文件解压到 C:\terrain 目录下。
安装 Python 2.7
双击安装 T1-python-2.7.11.msi,默认即可。默认安装到 C:\Python27,安装完成后配
置环境变量,在系统环境变量 path 中添加 C:\Python27 。
注册 Python 2.7
在 cmd 控制台执行
> python C:\terrain\T2-reg.py
执行成功后会提示
=== Python 2.7 is now registered!
安装 PIL
双击安装 T3-PIL-1.1.7.win32-py2.7.exe 程序,默认即可。
安装 GDAL
双击安装 T4-gdal-111-1800-core.msi 程序,默认即可。如果默认安装路径为
C:\Program Files (x86)\GDAL\ ,增加或修改系统环境变量:
- 增加环境变量 GDAL_DATA 值为 C:\Program Files (x86)\GDAL\gdal-data\
- 修改环境变量 path,在 path 中增加 C:\Program Files (x86)\GDAL 。
安装 numpy
双击安装 T5-numpy-1.8.1-win32-superpack-python2.7.exe 程序,默认即可。
安装 GDAL py2.7版
双击安装 T6-GDAL-1.11.4.win32-py2.7.msi 程序,默认即可。
生成 .terrain 数据
- 拷贝 T7-gdal2srtmtiles-demo.py 文件,将克隆文件改名为 T7-gdal2srtmtiles.py 。
- 打开 T7-gdal2srtmtiles.py 进行编辑,找到文档最后
面几行(第 2592 行),修改 T7-gdal2srtmtiles.py 的位置为你机器上的位置,修改
tif 的位置和输出文件的位置。-z 后面可以输入生成的级数如 0-8 或 0-15 等,级数越大越慢。修改完成后保存。 - 在 cmd 中输入
python C:\terrain\T7-gdal2srtmtiles.py
如果不报错,应该休息片刻就可以看生成的文件了。生成的文件每个目录下都有.terrain,.hdr,.kml 三种文件,我们只用到.terrain 文件。
4. 拷贝“覆盖至生成 tiles 结果”目录中的 layer.json 文件和 0 文件夹至生成结果目录下,比如我当前是 terrain_tiles 目录下。
5. 目前这套工具只能处理单个 tif 文件,如果涉及多个 tif 文件,可将每次生成的 terrain_tiles 文件夹覆盖添加到一个文件夹中。
使用 Cesium Terrain Builder 工具制作 Quantized-Mesh-1.0 格式地形文件
在 Cesium Terrain Builder 的网页上介绍了两种使用该工具的方式。一种是源码编译安装,一种是使用 Docker 安装 CTB 的镜像文件。下面进行分别介绍。
源码编译安装及使用
准备
- 下载 CTB 工具源文件
- 安装 VS2015
- 安装 CMake
- 下载依赖库 GDAL 源文件 https://download.osgeo.org/gdal/2.4.4/gdal-2.4.4.tar.gz
- 下载依赖库 zlib 压缩包 http://zlib.net/zlib1211.zip
编译安装GDAL
- 解压gdal压缩包
- 进入解压后的目录,修改./nmake.opt文件(最好使用vs2015打开),将57行的GDAL_HOME改成解压后的GDAL的实际路径,将191行的#WIN64=YES改为WIN64=YES(即把#去掉)。
- 管理员运行x64 Native Tools Command Prompt for VS 2015工具,输入
nmake -f makefile.vc MSVC_VER=1900 WIN64=1
开始编译,喝杯咖啡,完成后,依次输入
nmake -f makefile.vc install
nmake -f makefile.vc devinstall
最后,配置环境变量,将./data配置为GDAL_DATA。
编译安装zlib
- 解压zlib压缩包
- 使用管理员打开vs2015,然后打开./contrib/vstudio/vc14/zlibvc.sln解决方案,解决方案配置改为release,平台改为x64,右键zlibvc项目,找到生成事件,把命令行的bat文件路径改成绝对路径,最后直接右键解决方案,选择生成。
- 创建include和lib/release/x64目录,复制./zconf.h、./zlib.h到include目录下;复制./contrib/vstudio/vc14/x64/ZlibDllRelease/zlibwapi.dll、./contrib/vstudio/vc14/x64/ZlibDllRelease/zlibwapi.lib到x64目录下。
编译CTB
- 打开 cmake gui,配置 source code 路径到 /path/to/cesium-terrain-builder/src。
- 在 cesium-terrain-builder 目录下创建 build 目录,配置 cmake 的 build 路径到该目录,勾选Advanced。
- 点击 Configure 按钮。
- 配置 GDAL_INCLUDE_DIR 为GDAL编译后的 include 文件夹,GDAL_LIBRARY 为 GDAL 编译后的.lib文件。
- 配置 ZLIB_INCLUDE_DIR 是 zlib 动态库所在文件夹,ZLIB_LIBRARY_DEBUG , ZLIB_LIBRARY_RELEASE 是 zlib 的 .lib 文件。
- 选择编译平台为 MSVC2015,然后点击 Generate,即可在build路径下生成 MSVC2015 的 sln 工程文件。
- 点击 Open Project ,使用 VS2015 打开项目。
- 右键 ALL_BUILD 项目,点击生成。
- 创建 bin 文件夹,将 build/src/Release、build/tools/Release 两个文件夹下的所有文件拷贝到 bin 文件夹里;将 gdal、zlib 等 dll 拷贝到 bin 文件夹里。将 gdal 的工具 gdalbuildvrt.exe 文件拷贝到 bin 文件夹里。
PS: CTB工具生成的 Quantized-Mesh 地形文件默认是 gzip 压缩的 terrain 文件。这种文件在下面的集成中会报错找不到文件。因此,在编译 CTB 工具前需要对源代码进行修改。
使用 CTB
- 测试 CTB
> tile-info.exe --version
- 使用 gdalbuildvrt.exe 工具,将多个 tif 文件合并为 vrt 文件
> gdalbuildvrt.exe D:/temp/temp.vrt D:/temp/N29E106.tif
- 使用 CTB,命令如下
> ctb-tile -o D:/temp/terrain_tiles -f Mesh D:/temp/temp.vrt -c 4
- 生成 layer.json 文件,命令如下
> ctb-tile -o D:/temp/terrain_tiles -f Mesh D:/temp/temp.vrt -c 1 -l
Docker 安装 CTB 及使用
- 安装 Docker Desktop
- 启动 Docker ,拉取 CTB 镜像
$ docker pull tumgis/ctb-quantized-mesh
- 创建一个新容器,启动 ctb 环境
$ docker run -v D:/temp:/data -ti -i tumgis/ctb-quantized-mesh:latest bash
- 合并tiffs,生成.vrt文件
/data# gdalbuildvrt ./temp.vrt ./*.tif
- 运行ctb-tile生成瓦片
/data# ctb-tile -f Mesh -C -N -v -o ./terrain_tiles ./temp.vrt
- 最后创建Cesium layer.json描述文件
/data# ctb-tile -f Mesh -C -N -v -o ./terrain_tiles ./temp.vrt -l
如前所述,这个镜像版生成的 Quantized-Mesh 格式地形文件也是 gzip 压缩过的。
集成到Cesium
- 将高程数据 terrain_tiles 文件夹放在 HelloWorld 项目目录的 Assets 目录下。
- 在 Cesium 应用代码中添加地形提供者 terrainProvider。
// 创建地形提供者
var terrainProvider=new Cesium.CesiumTerrainProvider({
url: Cesium.buildModuleUrl("Assets/terrain_tiles") // 指定地形文件的路径
});
// 在观察器中指定地形提供者
let viewer = new Cesium.Viewer("cesiumContainer",{
geocoder:false, // 关闭查找位置工具
homeButton:false, // 禁用Home按钮
sceneModePicker:false, // 禁用视景模式拾取器
baseLayerPicker:false, // 禁用数据层拾取器
terrainProvider:terrainProvider, // 启用地形提供者
navigationHelpButton:false, // 禁用导航按钮
animation:false, // 禁用动画部件
timeline:false, // 禁用时间线
fullscreenButton:false, // 禁用全屏按钮
// 使用自带的离线影像作为纹理贴图
imageryProvider: new Cesium.TileMapServiceImageryProvider({
url: Cesium.buildModuleUrl("Assets/TMS/tiles")
}),
});
- HeightMap 格式地形的最终效果如下图
- Quantized-Mesh 格式地形的最终效果如下图