基于Docker使用CTB生成地形切片并加载
1. 引言
CTB(Cesium Terrain Builder)是一个用于地形切片的C++编写的命令行工具
目前CTB没有发布编译好的版本,需要使用者自己安装GDAL然后使用CMake编译,手动编译可以参考:
- Windows下 Cesium Terrain Builder(简称CTB) 编译安装指南_Eligie的博客-CSDN博客_windows编译ctb
- Cesium 生成terrain地形数据----CTB方式及步骤_wizardjaja的博客-CSDN博客
CTB的README的说明中说到CTB有Docker的镜像,可以直接使用,镜像地址为:
另外,CTB的README的说明中说到有镜像提供了预览Cesium地形切片的便捷服务,其地址为:
因为这个镜像文件中存在错误,需要自己手动修改,但同时需要这个镜像里面提供的layer.json(CTB镜像没有生成)
- 后续将不选择这个官方提供的镜像以避免这些问题
本文描述基于Docker的方式使用CTB生成地形切片并加载
2. 切片并加载
下载CTB镜像:
docker pull homme/cesium-terrain-builder
笔者的数据目录为:E:\tmp\docker\rasters\ASTER_GDEM_V2_30m.tif,切片结果放置目录为:E:\tmp\docker\tilesets\terrain\test(需要手动建立目录)
根据说明文档:geodata/cesium-terrain-server - Docker Image | Docker Hub,进行镜像的启动与切片:
docker run -v E:\tmp\docker\:/data homme/cesium-terrain-builder ctb-tile --output-dir /data/tilesets/terrain/test /data/rasters/ASTER_GDEM_V2_30m.tif
根据说明文档和issue:Error in Docker image? · Issue #8 · geo-data/cesium-terrain-server · GitHub,启动地形服务:
docker run -p 8080:8000 -v E:\tmp\docker\tilesets\terrain:/data/tilesets/terrain geodata/cesium-terrain-server
编写地形加载代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
html,
body,
#cesiumContainer {
width: 100%;
height: 100%;
margin: 0;
padding: 0;
overflow: hidden;
}
</style>
<!-- Include the CesiumJS JavaScript and CSS files -->
<script src="https://cesium.com/downloads/cesiumjs/releases/1.101/Build/Cesium/Cesium.js"></script>
<link href="https://cesium.com/downloads/cesiumjs/releases/1.101/Build/Cesium/Widgets/widgets.css" rel="stylesheet">
</head>
<body>
<div id="cesiumContainer"></div>
<script>
Cesium.Ion.defaultAccessToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJlMTk4ZTYyNy00MjkxLTRmZWYtOTg1MS0wOThjM2YzMzIzYzEiLCJpZCI6NzEyMSwic2NvcGVzIjpbImFzciIsImdjIl0sImlhdCI6MTU0ODMxNzI5OX0.rKV8Ldl_bgR3lVvNsbHhTX62j8JH8ADCIWAwk7tXpr8';
const viewer = new Cesium.Viewer('cesiumContainer');
var terrainProvider = new Cesium.CesiumTerrainProvider({
url: 'http://localhost:8080/tilesets/test'
});
viewer.scene.terrainProvider = terrainProvider;
viewer.camera.flyTo({
destination: Cesium.Cartesian3.fromDegrees(107.6178, 33.9498, 2500)
});
</script>
</body>
</html>

3. 一些改进
3.1 容器复用
上述的切片命令:
docker run -v E:\tmp\docker\:/data homme/cesium-terrain-builder ctb-tile --output-dir /data/tilesets/terrain/test /data/rasters/ASTER_GDEM_V2_30m.tif
该命令每次都要创建一个容器,略显累赘
在笔者电脑上,创建过的容器难以复用,很难启动,启动后很快就关闭了
笔者参考:Cesium-terrain-builder(CTB)在Centos7中安装并生成地形数据_tiger-hcx的博客-CSDN博客,以下这个命令创建的容器可以复用:
docker run -v E:\tmp\docker\:/data -t -i homme/cesium-terrain-builder bash
创建该容器后,进入这个容器输入CTB指令即可
3.2 layer.json
layer.json是地形切片的元数据文件,然而上述CTB并没有生成这个文件,参考:
- Not generated layer.json · Issue #77 · geo-data/cesium-terrain-builder · GitHub
- Layer.json is not generated with ctb-tile, should it? · Issue #73 · geo-data/cesium-terrain-builder · GitHub
以下版本的CTB和CTB docker解决了这个问题:
- GitHub - ahuarte47/cesium-terrain-builder at master-quantized-mesh
- GitHub - tum-gis/cesium-terrain-builder-docker: Dockerfile for the geo-data/cesium-terrain-builder app with quantized mesh support.
对应的CTB镜像地址为:tumgis/ctb-quantized-mesh - Docker Image | Docker Hub
下载这个镜像:
docker pull tumgis/ctb-quantized-mesh
在容器内创建地形切片:
ctb-tile --output-dir /data/tilesets/terrain/test /data/rasters/ASTER_GDEM_V2_30m.tif
在容器内创建layer.json:
ctb-tile --output-dir /data/tilesets/terrain/test -l /data/rasters/ASTER_GDEM_V2_30m.tif
最后结果的目录形式如下:
test/
|-- 0
|-- 1
|-- 2
|-- 3
|-- 4
|-- 5
|-- 6
|-- 7
|-- 8
|-- 9
|-- 10
|-- 11
|-- 12
|-- 13
|-- 14
|-- layer.json
由于拥有了layer.json,直接加载文件是否可行呢?答案是不行


参考:Can not add the terrain data in cesium · Issue #96 · geo-data/cesium-terrain-builder · GitHub
可以推测是切片数据(.terrain)使用了gzip压缩格式,而浏览器并没有解压缩来解析

只需在响应头中设置压缩格式为gzip即可
笔者这里参考:Can not add the terrain data in cesium · Issue #96 · geo-data/cesium-terrain-builder · GitHub,使用Nginx,配置nginx.conf文件,设置响应头:
location ~* .terrain$ {
add_header Content-Encoding "gzip";
add_header Content-Type "application/octet-stream";
}


4. 参考资料
[2]Cesium 生成terrain地形数据----CTB方式及步骤_wizardjaja的博客-CSDN博客
[3]geodata/cesium-terrain-server - Docker Image | Docker Hub
[4]Error in Docker image? · Issue #8 · geo-data/cesium-terrain-server · GitHub
[5]Cesium-terrain-builder(CTB)在Centos7中安装并生成地形数据_tiger-hcx的博客-CSDN博客
[7]tumgis/ctb-quantized-mesh - Docker Image | Docker Hub
基于Docker使用CTB生成地形切片并加载的更多相关文章
- 一款基于jquery带百分比的响应式进度加载条
今天要给大家带来一款基于jquery带百分比的响应式进度加载条.这款加载条非常漂亮,而且带有进度的百度比,且在不同的百分比用的是不同的颜色.而且这款加载条采用了响应式设计,在不同的分辨率的显示器下完美 ...
- create_module - 生成一条可加载模块记录
总览 #include <linux/module.h> caddr_t create_module(const char *name, size_t size); 描述 create_m ...
- Spire.XLS,生成Excel文件、加载Excel文件
一.组件介绍 Spire.XLS是E-iceblue开发的一套基于企业级的专业Office文档处理的组件之一,全称Spire.Office for .NET.旗下有Spire.Doc,Spire XL ...
- 基于FBX SDK的FBX模型解析与加载 -(一)
http://blog.csdn.net/bugrunner/article/details/7210511 1. 简介 FBX是Autodesk的一个用于跨平台的免费三维数据交换的格式(最早不是由A ...
- Hololens生成与安装(旁加载)应用
Hololens生成应用的几种方式: 一:HoloToolkit编辑器生成appx应用 二:Vistul Studio 2015 创建应用 旁加载概述: 你可以将应用旁加载到你的设备,而无需将它们提交 ...
- 基于spring的web项目启动时预加载数据到ServletContext
1.要在web启动时预加载数据到ServletContext,实现方法有很多,一种比较简单的方案就是: 1)新建一个bean,定义其初始化方法: <bean id="beanId&qu ...
- 基于FBX SDK的FBX模型解析与加载 -(二)
http://blog.csdn.net/bugrunner/article/details/7211515 5. 加载材质 Material是一个模型渲染时必不可少的部分,当然,这些信息也被存到了F ...
- c#生成动态库并加载
下面这段代码生成dll文件,不能编译运行.点击项目右键,点击生成,这时会在debuge文件中生成相应的配置文件. using System; using System.Collections.Gene ...
- 构建基于Chromium的应用程序(Winform程序加载Html页面)
chromium是google chrome浏览器所采用的内核,最开始由苹果的webkit发展而出,由于webkit在发展上存在分歧,而google希望在开发上有更大的自由度,2013年google决 ...
- 打包一个Docker镜像,让你的好友加载开启一个容器,并且每隔一秒输出hello,world到指定的文件中
一.两个脚本代码 Dockerfile FROM bash COPY . /usr/herui/ WORKDIR /usr/herui/ CMD [ "sh", "hel ...
随机推荐
- 9V,12V输入充3.7V单节锂电池电路和芯片
锂电池充电管理电路中,普遍常用使用最多的的如PW4054这种的线性降压充电管理芯片,特点就是外围极简洁,但是只能支持USB口的输入5V了.当然也有稍微高点的PW4065,输入电压范围是4.7V-8V的 ...
- kali2021.4a安装angr(使用virtualenv)
在Linux中安装各种依赖python的软件时,最头疼的问题之一就是各个软件的python版本不匹配的问题,angr依赖python3,因此考虑使用virtualenv来安装angr Virtuale ...
- Crane如何做到利用率提升3倍稳定性还不受损?
作为云平台用户,我们都希望购买的服务器物尽其用,能够达到最大利用率.然而要达到理论上的节点负载目标是很的,计算节点总是存在一些装箱碎片和低负载导致的闲置资源.下图展示了某个生产系统的CPU资源现状,从 ...
- Python 文件操作(IO 技术)
目录 Python 文件操作(IO 技术) 文本文件和二进制文件 文件操作相关模块概述 建文件对象 open() 文本文件的写入 write()/writelines()写入数据 close()关闭文 ...
- Spark框架下均值漂移算法对舆情聚类的分析
知网链接 原文链接 张京坤, 王怡怡 软件导刊 2022年21卷第6期 页码:141-146 DOI:10.11907/rjdk.211889 中图分类号:TP274 纸质出版日期:202 ...
- MSIC总结取证分析——日志分析
MSIC总结取证分析 一.日志分析: 1.常见日志分析类型: 2.常见一些考点: (1)还原特定IP攻击手段(SQL注入.暴力破解.命令执行等),或还原最初攻击时间: (2)寻找flag或者特定文件解 ...
- 微软拼音长句模式恢复工具支持Win10 1803
4月份就有人留言旧微软拼音恢复工具不支持Win10 1803了,我自己也遇到了,但因为没时间搞,勉为其难使用了词组模式的微软拼音几个月,终于在八月份抽个空研究了下,解决了. 这次是因为傻逼大微软改了 ...
- 计算1+2!+3!+...+n!的和
计算1+2!+3!+...+n!的和 Code 点击查看代码 #include<iostream> #include<vector> using namespace std; ...
- BBS项目功能编写逻辑思路汇总
BBS项目功能编写逻辑思路汇总 一.BBS创数据表 二.BBS注册功能 三.BBS登录功能 四.BBS首页搭建 五.BBS修改密码 六.BBS个人站点 七.BBS文章详情 八.BBS导入模块 九.BB ...
- Educational Codeforces Round 142 (Rated for Div. 2) A-D
比赛链接 A 题解 知识点:贪心. 代码 #include <bits/stdc++.h> using namespace std; using ll = long long; bool ...