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. listener.ora、sqlnet.ora、tnsnames.ora 详解
  2. 查看存储过程死锁的存储过程
  3. 一文看尽深度学习中的20种卷积(附源码整理和论文解读)
  4. Underscore _.template 方法使用详解
  5. Neural Networks神经网络编程入门
  6. SAP后台执行大数据量报表(鹦鹉学舌篇)
  7. JZOJ 5922. 【NOIP2018模拟10.23】sequence
  8. 3分钟练成SVN命令高手:SVN常用命令
  9. 聚类(part4)--多源数据聚类算法
  10. 34个省市自治区排序_freeCodeCamp的1,000多个学习小组现已完全自治
  11. 【Nginx】第一章 快速入门
  12. 无源波分和彩光模块_【光电通信】无源波分在 5G 场景中 的应用分析
  13. 在Red Hat Enterprise Linux 5 64-bit安装oracle11g r2
  14. 跨境电商erp系统一套多少钱,电商erp系统多少钱一年
  15. 微软笔试题-老鼠与毒药
  16. python 海龟 速度_Python中的高级turtle(海龟)作图
  17. 【渝粤教育】电大中专建设工程法规_1作业 题库
  18. 微信小程序中使用iconfont阿里巴巴矢量图标
  19. python的super函数详解
  20. 成为一个程序员要花多长时间

热门文章

  1. polymorphic-associations 多态关联实例 ruby on rails
  2. Android UI组件----ListView列表控件详解
  3. RH413-GRUB加密
  4. C/C++对文件的读写
  5. 开源框架Struts:FormBean滴那些事儿
  6. 项目中的文件夹与tomcat/webapp中manager文件夹重名
  7. 新氧ubuntu 9.04中文定制 Release 版(推荐)
  8. ruby环境变量的文件读取形式
  9. 7.Linux 高性能服务器编程 --- Linux 服务器程序规范
  10. 2.make file