学习 Cesium (五):加载离线高程数据

学习 Cesium (五):加载离线高程数据

前言

通过前面的学习,Cesium 最基本的应用已经可以了。但是,在实际项目中我们还需要加入高程数据,才能显示真实的地形。下面我就一步一步介绍如何加载真实的高程数据。

本文的测试环境

  • OS: Window 10 家庭版
  • Cesium: v1.78.0
  • Web Browser: Chrome v88.0.4324.150

基本的构建流程

获取源 DEM 文件如 SRTM 的 tif 文件
使用 tif 文件生成地形瓦片
托管静态瓦片资源
配置 Cesium TerrainProvider

获取高程数据

高程数据从哪里来呢?现在市面上有些卫星地图下载软件,比如水经注、BIGEMAP等,其中一些也包含高程数据下载。我没有试过,具体好不好用不清楚。也可以到CGIAR CSI的网站下载。

这里介绍最原始的方法,就是去 NASA 的 EarthData 网站下载。这里有很多全球地理数据,大家可以找自己想要的下载。

  1. 我这里选择了 ASTGTM v003 的数据,可以在这个网址 https://lpdaac.usgs.gov/products/astgtmv003/ 查看。

  2. 点击页面的【ACCESS DATA】按钮,在弹出对话框中可以看到有多种下载方式。我选择了从 NASA Earthdata Search 下载。

  3. 点击弹出窗口 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 制作地形文件

  1. 下载 Cesiumlab 安装文件,我使用的的 Cesiumlab v2.0.8 版本。
  2. 注册账户,登录使用。

该软件可生产 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\ ,增加或修改系统环境变量:

  1. 增加环境变量 GDAL_DATA 值为 C:\Program Files (x86)\GDAL\gdal-data\
  2. 修改环境变量 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 数据
  1. 拷贝 T7-gdal2srtmtiles-demo.py 文件,将克隆文件改名为 T7-gdal2srtmtiles.py 。
  2. 打开 T7-gdal2srtmtiles.py 进行编辑,找到文档最后
    面几行(第 2592 行),修改 T7-gdal2srtmtiles.py 的位置为你机器上的位置,修改
    tif 的位置和输出文件的位置。-z 后面可以输入生成的级数如 0-8 或 0-15 等,级数越大越慢。修改完成后保存。
  3. 在 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 的镜像文件。下面进行分别介绍。

源码编译安装及使用
准备
  1. 下载 CTB 工具源文件
  2. 安装 VS2015
  3. 安装 CMake
  4. 下载依赖库 GDAL 源文件 https://download.osgeo.org/gdal/2.4.4/gdal-2.4.4.tar.gz
  5. 下载依赖库 zlib 压缩包 http://zlib.net/zlib1211.zip
编译安装GDAL
  1. 解压gdal压缩包
  2. 进入解压后的目录,修改./nmake.opt文件(最好使用vs2015打开),将57行的GDAL_HOME改成解压后的GDAL的实际路径,将191行的#WIN64=YES改为WIN64=YES(即把#去掉)。
  3. 管理员运行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
  1. 解压zlib压缩包
  2. 使用管理员打开vs2015,然后打开./contrib/vstudio/vc14/zlibvc.sln解决方案,解决方案配置改为release,平台改为x64,右键zlibvc项目,找到生成事件,把命令行的bat文件路径改成绝对路径,最后直接右键解决方案,选择生成。
  3. 创建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
  1. 打开 cmake gui,配置 source code 路径到 /path/to/cesium-terrain-builder/src。
  2. 在 cesium-terrain-builder 目录下创建 build 目录,配置 cmake 的 build 路径到该目录,勾选Advanced。
  3. 点击 Configure 按钮。
  4. 配置 GDAL_INCLUDE_DIR 为GDAL编译后的 include 文件夹,GDAL_LIBRARY 为 GDAL 编译后的.lib文件。
  5. 配置 ZLIB_INCLUDE_DIR 是 zlib 动态库所在文件夹,ZLIB_LIBRARY_DEBUG , ZLIB_LIBRARY_RELEASE 是 zlib 的 .lib 文件。
  6. 选择编译平台为 MSVC2015,然后点击 Generate,即可在build路径下生成 MSVC2015 的 sln 工程文件。
  7. 点击 Open Project ,使用 VS2015 打开项目。
  8. 右键 ALL_BUILD 项目,点击生成。
  9. 创建 bin 文件夹,将 build/src/Release、build/tools/Release 两个文件夹下的所有文件拷贝到 bin 文件夹里;将 gdal、zlib 等 dll 拷贝到 bin 文件夹里。将 gdal 的工具 gdalbuildvrt.exe 文件拷贝到 bin 文件夹里。

PS: CTB工具生成的 Quantized-Mesh 地形文件默认是 gzip 压缩的 terrain 文件。这种文件在下面的集成中会报错找不到文件。因此,在编译 CTB 工具前需要对源代码进行修改。

使用 CTB
  1. 测试 CTB
> tile-info.exe --version
  1. 使用 gdalbuildvrt.exe 工具,将多个 tif 文件合并为 vrt 文件
> gdalbuildvrt.exe D:/temp/temp.vrt D:/temp/N29E106.tif
  1. 使用 CTB,命令如下
> ctb-tile -o D:/temp/terrain_tiles -f Mesh D:/temp/temp.vrt -c 4
  1. 生成 layer.json 文件,命令如下
> ctb-tile -o D:/temp/terrain_tiles -f Mesh D:/temp/temp.vrt -c 1 -l
Docker 安装 CTB 及使用
  1. 安装 Docker Desktop
  2. 启动 Docker ,拉取 CTB 镜像
$ docker pull tumgis/ctb-quantized-mesh
  1. 创建一个新容器,启动 ctb 环境
$ docker run -v D:/temp:/data -ti -i tumgis/ctb-quantized-mesh:latest bash
  1. 合并tiffs,生成.vrt文件
/data# gdalbuildvrt ./temp.vrt ./*.tif
  1. 运行ctb-tile生成瓦片
/data# ctb-tile -f Mesh -C -N -v -o ./terrain_tiles ./temp.vrt
  1. 最后创建Cesium layer.json描述文件
/data# ctb-tile -f Mesh -C -N -v -o ./terrain_tiles ./temp.vrt -l

如前所述,这个镜像版生成的 Quantized-Mesh 格式地形文件也是 gzip 压缩过的。

集成到Cesium

  1. 将高程数据 terrain_tiles 文件夹放在 HelloWorld 项目目录的 Assets 目录下。
  2. 在 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")
      }),

    });
  1. HeightMap 格式地形的最终效果如下图
    HeightMap 格式地形
  2. Quantized-Mesh 格式地形的最终效果如下图
    Quantized-Mesh 格式地形
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值