Cesium Terrain Builder
输出瓦片默认是zib压缩后的,在业务中如果传输不是问题,反而增加浏览器的解压处理,希望能支持输出非压缩瓦片。
针对此需求,修改代码并重新编译。

一、代码分析

1、输出数据对象
文件格式:主要为heightmap-1.0、quantized-mesh-1.0,其类图结构如下:

  • MeshTile为quantized-mesh-1.0格式数据对象。
  • TerrainTile为heightmap-1.0格式数据对象。


2、瓦片生成器

  • Meshtiler 用来生成MeshTile对象。
  • TerrainTiler 用来生成TerrainTile对象。

3、迭代器和序列化器

4、ctb-tile.exe的主要流程

二、功能扩展

1、增加非压缩支持。

  1. ctb-tile.cpp中TerrainBuild类,增加参数
// 内部变量
bool gzib;// 构造函数设置默认值
gzib(false)// 设置压缩参数
static void setGzib(command_t* command) {static_cast<TerrainBuild *>(Command::self(command))->gzib = true;
}
  1. ctb-tile.cpp中main函数解析参数
command.option("-G", "--gzip", "use zib compress file(defalut uncompress)", TerrainBuild::setGzib);
  1. CTBFileTileSerializer.cpp中,serializeTile函数增加zibFlag参数。根据gzibFlag决定是否使用CTBZFileOutputStream(压缩)或者CTBFileOutputStream(非压缩)
/*** @details * Serialize a MeshTile to the Directory store* 增加zibFlag,是否输出压缩格式文件*/
bool
ctb::CTBFileTileSerializer::serializeTile(const ctb::MeshTile *tile, bool writeVertexNormals, bool gzibFlag) {const TileCoordinate *coordinate = tile;const string filename = getTileFilename(coordinate, moutputDir, "terrain");const string temp_filename = concat(filename, ".tmp");if (gzibFlag) {CTBZFileOutputStream ostream(temp_filename.c_str());tile->writeFile(ostream, writeVertexNormals);ostream.close();} else {FILE *fp = fopen(temp_filename.c_str(), "wb");CTBFileOutputStream ostream(fp);tile->writeFile(ostream, writeVertexNormals);fclose(fp);}if (VSIRename(temp_filename.c_str(), filename.c_str()) != 0) {throw new CTBException("Could not rename temporary file");}return true;
}
  1. ctb-tile.cpp中buildMesh函数,修改为传递gzlib函数
//serializer.serializeTile(tile, writeVertexNormals);
serializer.serializeTile(tile, writeVertexNormals, command->gzib);

2、输出指定范围的瓦片

  1. ctb-tile.cpp中TerrainBuild类,增加参数
// 内部变量
int layerStartX, layerStartY, layerEndX, layerEndY;// 构造函数设置默认值
layerStartX(-1),
layerStartY(-1),
layerEndX(-1),
layerEndY(-1)//设置参数函数
static void setLayerStartX(command_t *command) {static_cast<TerrainBuild *>(Command::self(command))->layerStartX = atoi(command->arg);
}
static void setLayerStartY(command_t *command) {static_cast<TerrainBuild *>(Command::self(command))->layerStartY = atoi(command->arg);
}
static void setLayerEndX(command_t *command) {static_cast<TerrainBuild *>(Command::self(command))->layerEndX = atoi(command->arg);
}
static void setLayerEndY(command_t *command) {static_cast<TerrainBuild *>(Command::self(command))->layerEndY = atoi(command->arg);
}
  1. ctb-tile.cpp中main函数解析参数
command.option("-A", "--start-x <sx>", "tile’s start x ", TerrainBuild::setLayerStartX);
command.option("-D", "--end-x <ex>", "tile’s end x", TerrainBuild::setLayerEndX);
command.option("-W", "--start-y <sy>", "tile’s start y", TerrainBuild::setLayerStartY);
command.option("-S", "--end-y <ey>", "tile’s end y", TerrainBuild::setLayerEndY);
  1. ctb-tile.cpp修改buildMesh方法
/// Output mesh tiles represented by a tiler to a directory
static void buildMesh(MeshSerializer &serializer, const MeshTiler &tiler, TerrainBuild *command, TerrainMetadata *metadata, bool writeVertexNormals = false) {i_zoom startZoom = (command->startZoom < 0) ? tiler.maxZoomLevel() : command->startZoom,endZoom = (command->endZoom < 0) ? 0 : command->endZoom;// 取得参数中瓦片坐标int layerStartX = (command->layerStartX < 0)? 0: command->layerStartX,layerStartY = (command->layerStartY < 0) ? 0 : command->layerStartY,layerEndX = (command->layerEndX < 0) ? 0 : command->layerEndX,layerEndY = (command->layerEndY < 0) ? 0 : command->layerEndY;MeshIterator iter(tiler, startZoom, endZoom);int currentIndex = incrementIterator(iter, 0);setIteratorSize(iter);GDALDatasetReaderWithOverviews reader(tiler);while (!iter.exhausted()) {const TileCoordinate *coordinate = iter.GridIterator::operator*();if (metadata) metadata->add(tiler.grid(), coordinate);// 如果没有指定瓦片坐标或zoom级别不是一个,使用原来逻辑if (layerStartX == 0 && layerEndX == 0 && startZoom != endZoom) {if (serializer.mustSerializeCoordinate(coordinate)) {MeshTile *tile = iter.operator*(&reader);serializer.serializeTile(tile, writeVertexNormals, command->gzib);delete tile;}}else {// 如果有瓦片坐标,只生成瓦片坐标范围内的文件if (coordinate->x >= layerStartX && coordinate->x <= layerEndX && coordinate->y >= layerStartY && coordinate->y <= layerEndY) {if (serializer.mustSerializeCoordinate(coordinate)) {MeshTile *tile = iter.operator*(&reader);serializer.serializeTile(tile, writeVertexNormals, command->gzib);delete tile;}}}currentIndex = incrementIterator(iter, currentIndex);showProgress(currentIndex);}
}

三、命令行说明

编译成功后,就支持非压缩切片和生成指定范围的切片功能了。

  1. 调用说明
ctb-tile.exe -o D:/test/tile D:/test/dem.tif -f Mesh -s 6 -e 6 -A 105 -D 107 -W 45 -S 47
  1. 完整参数说明
参数 说明
-V 输出程序版本。
-h 输出帮助信息。
-o 切片输出路径。
-p 切片规则。默认geodetic,可以指定mercator
-f 切片格式。默认Terrain,可以指定Mesh
-c 使用线程数。默认同cpu数
-t 瓦片像素大小。默认65*65
-s 瓦片开始级别。
-e 瓦片结束级别。注意:开始级别 > 结束级别
-r 重采样方法。默认平均值,可以指定min,max,average,nearest,bilinear,cubic等。
-R 不覆盖现有文件。
-G 生成zib压缩切片。
-A 切片范围,x开始索引。
-D 切片范围,x结束索引。
-W 切片范围,y开始索引。
-S 切片范围,y结束索引。

Cesium Terrain Builder 非压缩瓦片相关推荐

  1. Windows下 Cesium Terrain Builder(简称CTB) 编译安装指南

    Windows下 Cesium Terrain Builder 编译安装指南 基本流程 软件 资源(全部公开免费) 编译与配置GDAL 编译与配置zlib 编译与配置CTB 检测安装是否成功 常见错误 ...

  2. Cesium terrain

    Cesium terrain 生成 terrain 环境配置: 源码下载 下载地址:https://github.com/ahuarte47/cesium-terrain-builder/tree/m ...

  3. java压缩文件读取_用Java读取/写入压缩和非压缩文件

    java压缩文件读取 这篇文章的主要原因是尝试不要重复自己( DRY ),因为通常,我会遇到递归的需求,即读写压缩的和非压缩的文件(主要是JSON和CSV). 首先让我们看看如何读取文本文件. 注意我 ...

  4. 用Java读取/写入压缩和非压缩文件

    这篇文章的主要原因是尝试不重复自己( DRY ),因为通常,我会遇到读写压缩和非压缩文件(主要是JSON和CSV)的递归需求. 首先让我们看看如何读取文本文件. 注意我正在使用(相对较小的)文本文件, ...

  5. 数字非压缩光端机的选购原则

    数字非压缩光端机主要应用于高速公路监控领域,可以保证实时性,指的是不经过压缩进行光传输的光端机,是在非压缩光端机基础上利用ADM电分插复用与TDM时分复用技术在一根光纤中实现多点多路(最大16个视频点 ...

  6. [SV]SystemVerilog压缩数组(Packed Array)和非压缩数组( Unpacked Array)

    SystemVerilog压缩数组和非压缩数组 The term packed array is used to refer to the dimensions declared before the ...

  7. 【从零开始学习 SystemVerilog】2.8、SystemVerilog 数据类型—— Unpacked Arrays(非压缩数组)

    非压缩数组用于引用变量名之后声明的维度. 非压缩数组可以是固定大小数组.动态数组.关联数组或队列. 文章目录 一维非压缩数组 多维非压缩数组 压缩+非压缩数组(混合数组) 一维非压缩数组 module ...

  8. 汇编--子程序设计(1)--非压缩bcd码和十进制的转换

    输入四位十六进制数,显示对应的十进制数(还有位对应的值,以T作为结束符). ;PROGRAM GOES HERE;13:34 2023/4/15-------17:38 2023/4/16----17 ...

  9. 压缩BCD码和非压缩BCD码的区别

    BCD码:用四个二进制位表示一个十进制数字:最常用的是8421   BCD码:          压缩型BCD码:一个字节可存放一个两位十进制数,其中高四位存放十位数字,低四位存放个位数字.如:56的 ...

  10. vant框架上传组件---上传身份证两面图片需求并且压缩图片质量,非压缩长宽——商城项目

    场景 1.vant框架上传组件-上传身份证两面图片需求并且压缩图片质量,非压缩长宽--商城项目 2.压缩图片质量大小-- 3.压缩逻辑因为是正反两面单独压缩执行,所以我这里使用 Promise.all ...

最新文章

  1. MySQL5.5复制新特性
  2. 访问数据库_访问数据库
  3. 将计算机设置成交换机主机名,CISCO2950交换机的配置(设置密码、IP地址、主机名)...
  4. MongoDB 命令速查表
  5. linux 文件夹的颜色代表什么意思
  6. JAVA集合框架及其常用方法
  7. 给数据库减负的八个思路,盘它!
  8. 【Android Developers Training】 20. 创建一个Fragment
  9. mysql gtid坑_数据库mysqldump的坑
  10. discuz x2.5 mysql_DiscuzMySQL 优化 - Discuz! X2.5 效率机制 - 1314学习网
  11. MySQL 8 安装教程
  12. 主成分分析(PCA)步骤及代码
  13. Flash闪存的有关术语
  14. 微信公共平台开发接口(一)
  15. 怎么将flac文件转成mp3文件?
  16. 腾讯云Centos安装python3教程
  17. 第二章网络网络技术基础计算题及其解析[计算机网络]
  18. mysql hash索引 btree索引_B-Tree索引与Hash索引的比较
  19. Ubuntu20数字键盘(小键盘)输入无响应或变方向键
  20. vue使用百度统计埋点

热门文章

  1. python list的+=操作
  2. CDMA,GSM,WCDMA,TD-SCDMA,CDMA2000,3G的区别
  3. [转]ffmpeg库音频解码示例
  4. Java容器工具类Arrays
  5. 笔记7:winfrom的一些知识点(一)
  6. 让Windows 7变成WIFI热点
  7. 迫切想要成功之后的喜悦感,失败太久有点心灵上小小的打击,还需要继续前进。...
  8. C++笔试题 String类的实现 三大复制控制函数
  9. 15.卷2(进程间通信)---门
  10. 6. /proc/cpuinfo