目录

  • 学习 Cesium (五):加载离线高程数据
    • 前言
      • 本文的测试环境
      • 基本的构建流程
    • 获取高程数据
    • 高程数据处理
      • 使用 Cesiumlab 制作地形文件
      • 使用 gdal2srtmtiles.py 脚本制作heightmap-1.0 格式地形文件
        • 安装 Python 2.7
        • 注册 Python 2.7
        • 安装 PIL
        • 安装 GDAL
        • 安装 numpy
        • 安装 GDAL py2.7版
        • 生成 .terrain 数据
      • 使用 Cesium Terrain Builder 工具制作 Quantized-Mesh-1.0 格式地形文件
        • 源码编译安装及使用
          • 准备
          • 编译安装GDAL
          • 编译安装zlib
          • 编译CTB
          • 使用 CTB
        • Docker 安装 CTB 及使用
    • 集成到Cesium

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

前言

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

本文的测试环境

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

基本的构建流程

#mermaid-svg-IZqpAUFMTnctixjH .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-IZqpAUFMTnctixjH .label text{fill:#333}#mermaid-svg-IZqpAUFMTnctixjH .node rect,#mermaid-svg-IZqpAUFMTnctixjH .node circle,#mermaid-svg-IZqpAUFMTnctixjH .node ellipse,#mermaid-svg-IZqpAUFMTnctixjH .node polygon,#mermaid-svg-IZqpAUFMTnctixjH .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-IZqpAUFMTnctixjH .node .label{text-align:center;fill:#333}#mermaid-svg-IZqpAUFMTnctixjH .node.clickable{cursor:pointer}#mermaid-svg-IZqpAUFMTnctixjH .arrowheadPath{fill:#333}#mermaid-svg-IZqpAUFMTnctixjH .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-IZqpAUFMTnctixjH .flowchart-link{stroke:#333;fill:none}#mermaid-svg-IZqpAUFMTnctixjH .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-IZqpAUFMTnctixjH .edgeLabel rect{opacity:0.9}#mermaid-svg-IZqpAUFMTnctixjH .edgeLabel span{color:#333}#mermaid-svg-IZqpAUFMTnctixjH .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-IZqpAUFMTnctixjH .cluster text{fill:#333}#mermaid-svg-IZqpAUFMTnctixjH div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-IZqpAUFMTnctixjH .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-IZqpAUFMTnctixjH text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-IZqpAUFMTnctixjH .actor-line{stroke:grey}#mermaid-svg-IZqpAUFMTnctixjH .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-IZqpAUFMTnctixjH .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-IZqpAUFMTnctixjH #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-IZqpAUFMTnctixjH .sequenceNumber{fill:#fff}#mermaid-svg-IZqpAUFMTnctixjH #sequencenumber{fill:#333}#mermaid-svg-IZqpAUFMTnctixjH #crosshead path{fill:#333;stroke:#333}#mermaid-svg-IZqpAUFMTnctixjH .messageText{fill:#333;stroke:#333}#mermaid-svg-IZqpAUFMTnctixjH .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-IZqpAUFMTnctixjH .labelText,#mermaid-svg-IZqpAUFMTnctixjH .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-IZqpAUFMTnctixjH .loopText,#mermaid-svg-IZqpAUFMTnctixjH .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-IZqpAUFMTnctixjH .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-IZqpAUFMTnctixjH .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-IZqpAUFMTnctixjH .noteText,#mermaid-svg-IZqpAUFMTnctixjH .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-IZqpAUFMTnctixjH .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-IZqpAUFMTnctixjH .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-IZqpAUFMTnctixjH .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-IZqpAUFMTnctixjH .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-IZqpAUFMTnctixjH .section{stroke:none;opacity:0.2}#mermaid-svg-IZqpAUFMTnctixjH .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-IZqpAUFMTnctixjH .section2{fill:#fff400}#mermaid-svg-IZqpAUFMTnctixjH .section1,#mermaid-svg-IZqpAUFMTnctixjH .section3{fill:#fff;opacity:0.2}#mermaid-svg-IZqpAUFMTnctixjH .sectionTitle0{fill:#333}#mermaid-svg-IZqpAUFMTnctixjH .sectionTitle1{fill:#333}#mermaid-svg-IZqpAUFMTnctixjH .sectionTitle2{fill:#333}#mermaid-svg-IZqpAUFMTnctixjH .sectionTitle3{fill:#333}#mermaid-svg-IZqpAUFMTnctixjH .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-IZqpAUFMTnctixjH .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-IZqpAUFMTnctixjH .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-IZqpAUFMTnctixjH .grid path{stroke-width:0}#mermaid-svg-IZqpAUFMTnctixjH .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-IZqpAUFMTnctixjH .task{stroke-width:2}#mermaid-svg-IZqpAUFMTnctixjH .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-IZqpAUFMTnctixjH .taskText:not([font-size]){font-size:11px}#mermaid-svg-IZqpAUFMTnctixjH .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-IZqpAUFMTnctixjH .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-IZqpAUFMTnctixjH .task.clickable{cursor:pointer}#mermaid-svg-IZqpAUFMTnctixjH .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-IZqpAUFMTnctixjH .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-IZqpAUFMTnctixjH .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-IZqpAUFMTnctixjH .taskText0,#mermaid-svg-IZqpAUFMTnctixjH .taskText1,#mermaid-svg-IZqpAUFMTnctixjH .taskText2,#mermaid-svg-IZqpAUFMTnctixjH .taskText3{fill:#fff}#mermaid-svg-IZqpAUFMTnctixjH .task0,#mermaid-svg-IZqpAUFMTnctixjH .task1,#mermaid-svg-IZqpAUFMTnctixjH .task2,#mermaid-svg-IZqpAUFMTnctixjH .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-IZqpAUFMTnctixjH .taskTextOutside0,#mermaid-svg-IZqpAUFMTnctixjH .taskTextOutside2{fill:#000}#mermaid-svg-IZqpAUFMTnctixjH .taskTextOutside1,#mermaid-svg-IZqpAUFMTnctixjH .taskTextOutside3{fill:#000}#mermaid-svg-IZqpAUFMTnctixjH .active0,#mermaid-svg-IZqpAUFMTnctixjH .active1,#mermaid-svg-IZqpAUFMTnctixjH .active2,#mermaid-svg-IZqpAUFMTnctixjH .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-IZqpAUFMTnctixjH .activeText0,#mermaid-svg-IZqpAUFMTnctixjH .activeText1,#mermaid-svg-IZqpAUFMTnctixjH .activeText2,#mermaid-svg-IZqpAUFMTnctixjH .activeText3{fill:#000 !important}#mermaid-svg-IZqpAUFMTnctixjH .done0,#mermaid-svg-IZqpAUFMTnctixjH .done1,#mermaid-svg-IZqpAUFMTnctixjH .done2,#mermaid-svg-IZqpAUFMTnctixjH .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-IZqpAUFMTnctixjH .doneText0,#mermaid-svg-IZqpAUFMTnctixjH .doneText1,#mermaid-svg-IZqpAUFMTnctixjH .doneText2,#mermaid-svg-IZqpAUFMTnctixjH .doneText3{fill:#000 !important}#mermaid-svg-IZqpAUFMTnctixjH .crit0,#mermaid-svg-IZqpAUFMTnctixjH .crit1,#mermaid-svg-IZqpAUFMTnctixjH .crit2,#mermaid-svg-IZqpAUFMTnctixjH .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-IZqpAUFMTnctixjH .activeCrit0,#mermaid-svg-IZqpAUFMTnctixjH .activeCrit1,#mermaid-svg-IZqpAUFMTnctixjH .activeCrit2,#mermaid-svg-IZqpAUFMTnctixjH .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-IZqpAUFMTnctixjH .doneCrit0,#mermaid-svg-IZqpAUFMTnctixjH .doneCrit1,#mermaid-svg-IZqpAUFMTnctixjH .doneCrit2,#mermaid-svg-IZqpAUFMTnctixjH .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-IZqpAUFMTnctixjH .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-IZqpAUFMTnctixjH .milestoneText{font-style:italic}#mermaid-svg-IZqpAUFMTnctixjH .doneCritText0,#mermaid-svg-IZqpAUFMTnctixjH .doneCritText1,#mermaid-svg-IZqpAUFMTnctixjH .doneCritText2,#mermaid-svg-IZqpAUFMTnctixjH .doneCritText3{fill:#000 !important}#mermaid-svg-IZqpAUFMTnctixjH .activeCritText0,#mermaid-svg-IZqpAUFMTnctixjH .activeCritText1,#mermaid-svg-IZqpAUFMTnctixjH .activeCritText2,#mermaid-svg-IZqpAUFMTnctixjH .activeCritText3{fill:#000 !important}#mermaid-svg-IZqpAUFMTnctixjH .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-IZqpAUFMTnctixjH g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-IZqpAUFMTnctixjH g.classGroup text .title{font-weight:bolder}#mermaid-svg-IZqpAUFMTnctixjH g.clickable{cursor:pointer}#mermaid-svg-IZqpAUFMTnctixjH g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-IZqpAUFMTnctixjH g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-IZqpAUFMTnctixjH .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-IZqpAUFMTnctixjH .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-IZqpAUFMTnctixjH .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-IZqpAUFMTnctixjH .dashed-line{stroke-dasharray:3}#mermaid-svg-IZqpAUFMTnctixjH #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-IZqpAUFMTnctixjH #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-IZqpAUFMTnctixjH #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-IZqpAUFMTnctixjH #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-IZqpAUFMTnctixjH #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-IZqpAUFMTnctixjH #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-IZqpAUFMTnctixjH #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-IZqpAUFMTnctixjH #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-IZqpAUFMTnctixjH .commit-id,#mermaid-svg-IZqpAUFMTnctixjH .commit-msg,#mermaid-svg-IZqpAUFMTnctixjH .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-IZqpAUFMTnctixjH .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-IZqpAUFMTnctixjH .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-IZqpAUFMTnctixjH g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-IZqpAUFMTnctixjH g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-IZqpAUFMTnctixjH g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-IZqpAUFMTnctixjH g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-IZqpAUFMTnctixjH g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-IZqpAUFMTnctixjH g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-IZqpAUFMTnctixjH .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-IZqpAUFMTnctixjH .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-IZqpAUFMTnctixjH .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-IZqpAUFMTnctixjH .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-IZqpAUFMTnctixjH .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-IZqpAUFMTnctixjH .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-IZqpAUFMTnctixjH .edgeLabel text{fill:#333}#mermaid-svg-IZqpAUFMTnctixjH .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-IZqpAUFMTnctixjH .node circle.state-start{fill:black;stroke:black}#mermaid-svg-IZqpAUFMTnctixjH .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-IZqpAUFMTnctixjH #statediagram-barbEnd{fill:#9370db}#mermaid-svg-IZqpAUFMTnctixjH .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-IZqpAUFMTnctixjH .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-IZqpAUFMTnctixjH .statediagram-state .divider{stroke:#9370db}#mermaid-svg-IZqpAUFMTnctixjH .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-IZqpAUFMTnctixjH .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-IZqpAUFMTnctixjH .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-IZqpAUFMTnctixjH .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-IZqpAUFMTnctixjH .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-IZqpAUFMTnctixjH .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-IZqpAUFMTnctixjH .note-edge{stroke-dasharray:5}#mermaid-svg-IZqpAUFMTnctixjH .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-IZqpAUFMTnctixjH .error-icon{fill:#522}#mermaid-svg-IZqpAUFMTnctixjH .error-text{fill:#522;stroke:#522}#mermaid-svg-IZqpAUFMTnctixjH .edge-thickness-normal{stroke-width:2px}#mermaid-svg-IZqpAUFMTnctixjH .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-IZqpAUFMTnctixjH .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-IZqpAUFMTnctixjH .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-IZqpAUFMTnctixjH .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-IZqpAUFMTnctixjH .marker{fill:#333}#mermaid-svg-IZqpAUFMTnctixjH .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}#mermaid-svg-IZqpAUFMTnctixjH {color: rgba(0, 0, 0, 0.75);font: ;}

获取源 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 格式地形的最终效果如下图
  2. Quantized-Mesh 格式地形的最终效果如下图

学习 Cesium (五):加载离线高程数据相关推荐

  1. 第四章 Cesium学习入门之加载离线影像图(tif)

    从0开始的Cesium 第一章 Cesium学习入门之搭建Vite+Vue3+Cesium开发环境 第二章 Cesium学习入门之搭建Cesium界面预览和小控件隐藏 第三章 Cesium学习入门之地 ...

  2. arcgis xml 下载 切片_vue/cli3整合Cesium,加载离线arcgis 切片

    最開始使用webpack進行cesium 集成, 出现了问题一大堆,最后只好选择传统的方法直接引入了,具体操作如下 一.安装cesium 首选创建一个测试项目 vue create vue-join- ...

  3. 【UE4 Cesium】加载离线地图

    主体思路:先使用水经注软件下载瓦片数据,再使用Python转换瓦片数据格式(TMS),使用Nginx发布网络服务,最后将网络服务加载到UE中. 步骤: 使用水经注下载瓦片数据,这里下载的是全球七级地图 ...

  4. Cesium加载离线地图和离线地形

    文章目录 前言 一.Cesium加载离线地图 1.1 下载数据 2.2 数据处理 2.3 地图发布 2.4下载速度改进 二.Cesium加载离线地形 2.1 下载数据 2.2 数据处理 2.3 地形发 ...

  5. Cesium本地加载地形(dem高程)数据

    cesium本地加载dem数据,首先需要下载地区的高程数据,一般通常在地理空间数据云里面下载:http://www.gscloud.cn/ 这里一般可以下载到90m和30m精度的数据,当然也可以用自己 ...

  6. cesium 3dtiles 加载本地数据_深入echarts学习:加载跨域、异步、本地json数据的防坑录

    1 说明: ===== 1.1 推荐指数:★★★★ 1.2 网上这方面说明,大多模棱两可,坑很多,讲透彻的不多,故本人做一个小结. 1.3 我曾介绍echarts的简单基本用法: <Echart ...

  7. cesium 3dtiles 加载本地数据_记一次Cesium地形数据生成过程

    问题描述 有一小块带高程值的点状数据,需要根据该数据生成Cesium支持的3dtiles数据,在Cesium中显示.经过一周多时间的摸索,终于能够在Cesium中加载成功.现将数据处理流程做个记录,以 ...

  8. ceisum 加载geojson,使用 Cesium 动态加载 GeoJSON 数据

    前言 需求是这样的,我需要在地图中显示 08 年到现在的地震情况,地震都是发生在具体的时间点的,那么问题就来了,如何实现地震情况按照时间动态渲染而不是一次全部加载出来. 一. 方案分析 这里面牵扯到两 ...

  9. Cesium 加载 离线的天地图影像瓦片

    Cesium 加载 离线的天地图影像瓦片 一.下载 天地图影像 通过水经注软件下载天地图影像(也许有其他下载方式). 1.下载 水经注软件 链接:http://www.rivermap.cn/down ...

  10. Cesium 加载离线地图服务

    Cesium 可以加载自定义的地图服务,一般在私有云上应用比较广. 原始地图数据有很多地方都可以下载.比如常用的下载工具,付费的有水经注.91助手等,还有国家空间地理服务的官网上也有可用的数据.假设你 ...

最新文章

  1. PHP中常见的几种运行代码的方式
  2. J2EE搭建Dynamic web SpringMVC工程404错误分析(三)
  3. 图片安全保护(未启动)
  4. 工业交换机常见问题汇总!
  5. HttpModules 管道过滤 自定义页面
  6. android studio方法的调用树,Android Studio 多层级 Module 对 aar 引用问题解决方法
  7. 客户流失预警模型怎么做?
  8. Gandi下配置Github pages的自定义域名
  9. [转载] python更新numpy_Python numpy从1.6更新到1.8
  10. 如何找到稳定的网站空间
  11. pycharm 无法安装模块 nothing to show
  12. 使用JMeter测试post请求
  13. 变量的存在意义和底层逻辑(《Java与Python学习通法》)
  14. 用uni-app制作首页幻灯片
  15. Unity的五个窗口面板
  16. emouse思·睿—评论与观点整理之二
  17. 英国火箭设计者计划组建第一家私有太空游公司
  18. 处理mysql启动报错Table 'mysql.plugin' doesn't exis
  19. [极客大挑战 2020]Roamphp 1、2、4
  20. volvo手机能用鸿蒙系统吗,不是华为手机,也能用上鸿蒙系统

热门文章

  1. USB协议详解第28讲(USB硬件设计和热拔插原理)
  2. win7如何启用计算机的无线功能,win7笔记本怎么打开无线-win7打开无线功能,win7已关闭无线功能 未修复...
  3. Coding and Paper Letter(五十七)
  4. 在哪里可以找水系图_请问在哪可以找到广西的水系图
  5. 点云数据增强及预处理
  6. oracle与mysql语法区别_mysql和oracle语法异同
  7. SuperMap iClient3D for WebGL实现三维管线分析
  8. python模拟银行取号叫号系统
  9. VS2015卸载重装之后点击没有反应
  10. 声卡性能测试软件,RightMark Audio Analyzer音频声卡测试软件