1. 引言

CTB(Cesium Terrain Builder)是一个用于地形切片的C++编写的命令行工具

GitHub地址为:GitHub - geo-data/cesium-terrain-builder: A C++ library and associated command line tools designed to create terrain tiles for use in the Cesium JavaScript library

目前CTB没有发布编译好的版本,需要使用者自己安装GDAL然后使用CMake编译,手动编译可以参考:

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并没有生成这个文件,参考:

以下版本的CTB和CTB docker解决了这个问题:

对应的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. 参考资料

[1]GitHub - geo-data/cesium-terrain-builder: A C++ library and associated command line tools designed to create terrain tiles for use in the Cesium JavaScript library

[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博客

[6]Layer.json is not generated with ctb-tile, should it? · Issue #73 · geo-data/cesium-terrain-builder · GitHub

[7]tumgis/ctb-quantized-mesh - Docker Image | Docker Hub

[8]GitHub - tum-gis/cesium-terrain-builder-docker: Dockerfile for the geo-data/cesium-terrain-builder app with quantized mesh support.

基于Docker使用CTB生成地形切片并加载的更多相关文章

  1. 一款基于jquery带百分比的响应式进度加载条

    今天要给大家带来一款基于jquery带百分比的响应式进度加载条.这款加载条非常漂亮,而且带有进度的百度比,且在不同的百分比用的是不同的颜色.而且这款加载条采用了响应式设计,在不同的分辨率的显示器下完美 ...

  2. create_module - 生成一条可加载模块记录

    总览 #include <linux/module.h> caddr_t create_module(const char *name, size_t size); 描述 create_m ...

  3. Spire.XLS,生成Excel文件、加载Excel文件

    一.组件介绍 Spire.XLS是E-iceblue开发的一套基于企业级的专业Office文档处理的组件之一,全称Spire.Office for .NET.旗下有Spire.Doc,Spire XL ...

  4. 基于FBX SDK的FBX模型解析与加载 -(一)

    http://blog.csdn.net/bugrunner/article/details/7210511 1. 简介 FBX是Autodesk的一个用于跨平台的免费三维数据交换的格式(最早不是由A ...

  5. Hololens生成与安装(旁加载)应用

    Hololens生成应用的几种方式: 一:HoloToolkit编辑器生成appx应用 二:Vistul Studio 2015 创建应用 旁加载概述: 你可以将应用旁加载到你的设备,而无需将它们提交 ...

  6. 基于spring的web项目启动时预加载数据到ServletContext

    1.要在web启动时预加载数据到ServletContext,实现方法有很多,一种比较简单的方案就是: 1)新建一个bean,定义其初始化方法: <bean id="beanId&qu ...

  7. 基于FBX SDK的FBX模型解析与加载 -(二)

    http://blog.csdn.net/bugrunner/article/details/7211515 5. 加载材质 Material是一个模型渲染时必不可少的部分,当然,这些信息也被存到了F ...

  8. c#生成动态库并加载

    下面这段代码生成dll文件,不能编译运行.点击项目右键,点击生成,这时会在debuge文件中生成相应的配置文件. using System; using System.Collections.Gene ...

  9. 构建基于Chromium的应用程序(Winform程序加载Html页面)

    chromium是google chrome浏览器所采用的内核,最开始由苹果的webkit发展而出,由于webkit在发展上存在分歧,而google希望在开发上有更大的自由度,2013年google决 ...

  10. 打包一个Docker镜像,让你的好友加载开启一个容器,并且每隔一秒输出hello,world到指定的文件中

    一.两个脚本代码 Dockerfile FROM bash COPY . /usr/herui/ WORKDIR /usr/herui/ CMD [ "sh", "hel ...

随机推荐

  1. Gradle 使用maven本地仓库 带来的思考

    Gradle 使用maven本地仓库 带来的思考 本篇主要探究一下 在使用Gradle 的时候一般会配置 maven 的本地仓库的,那是不是Gradle 可以直接使用 maven本地仓库的jar呢 ? ...

  2. 玩转 Go 生态|Hertz WebSocket 扩展简析

    WebSocket 是一种可以在单个 TCP 连接上进行全双工通信,位于 OSI 模型的应用层.WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据.在 W ...

  3. 强化学习调参技巧二:DDPG、TD3、SAC算法为例:

    1.训练环境如何正确编写 强化学习里的 env.reset() env.step() 就是训练环境.其编写流程如下: 1.1 初始阶段: 先写一个简化版的训练环境.把任务难度降到最低,确保一定能正常训 ...

  4. Windows搭建Git服务器

    Windows如何搭建Git服务器 1.安装java环境 (1)下载安装java 注意(java的版本需要在1.7及以上) (2)配置java的环境变量 (3)检验java环境是否安装成功 2.下载安 ...

  5. 大数据 - DWM层 业务实现

    DWM 建表,需要看 DWS 需求. DWS 来自维度(访客.商品.地区.关键词),为了出最终的指标 ADS 需求指标 DWT 为什么实时数仓没有DWT,因为它是历史的聚集,累积结果,实时数仓中不需要 ...

  6. 【Java】线程池梳理

    [Java]线程池梳理 前言 线程池:本质上是一种对象池,用于管理线程资源.在任务执行前,需要从线程池中拿出线程来执行.在任务执行完成之后,需要把线程放回线程池.通过线程的这种反复利用机制,可以有效地 ...

  7. TCS34725 颜色传感器设备驱动程序

    一.概述 以前的传感器是用过中断的方式进行计数的,现在已经有 I2C 通行的颜色传感器,不在需要我们像之前那样,通过计数的方式获取数据,直接通过I2C读取即可.当然有通过串口的方式获取采集数据的,串口 ...

  8. [C++标准模板库:自修教程与参考手册]关于auto_ptr

    什么是auto_ptr指针 auto_ptr是这样一种指针:它是"它所指的对象"的拥有者,所以,当身为对象拥有者的auto_ptr指针被摧毁时,该对象也会被摧毁,auto_ptr要 ...

  9. 推荐一款在浏览器编辑`Blazor`的`IDE`

    不知道是否有Blazor用户羡慕过React或者Vue用户,在一些组件库中,它们就提供了在当前的组件预览对于组件的实时编辑并且预览? 比如semi-design的这种 在比如codepen这种 由于B ...

  10. Hive删除分区名称中含有特殊字符

    先说方案:通过show partitions和hdfs url看到的都不是真正的分区名称,都是经过URI重新编码的,访问这些分区应该使用分区名称的原始字符串. 场景描述 当我们在SQL语句中使用变量时 ...