Cesium Terrain Builder 非压缩瓦片
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、增加非压缩支持。
- ctb-tile.cpp中TerrainBuild类,增加参数
// 内部变量
bool gzib;// 构造函数设置默认值
gzib(false)// 设置压缩参数
static void setGzib(command_t* command) {static_cast<TerrainBuild *>(Command::self(command))->gzib = true;
}
- ctb-tile.cpp中main函数解析参数
command.option("-G", "--gzip", "use zib compress file(defalut uncompress)", TerrainBuild::setGzib);
- 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;
}
- ctb-tile.cpp中buildMesh函数,修改为传递gzlib函数
//serializer.serializeTile(tile, writeVertexNormals);
serializer.serializeTile(tile, writeVertexNormals, command->gzib);
2、输出指定范围的瓦片
- 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);
}
- 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);
- 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);}
}
三、命令行说明
编译成功后,就支持非压缩切片和生成指定范围的切片功能了。
- 调用说明
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
- 完整参数说明
参数 | 说明 |
---|---|
-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 非压缩瓦片相关推荐
- Windows下 Cesium Terrain Builder(简称CTB) 编译安装指南
Windows下 Cesium Terrain Builder 编译安装指南 基本流程 软件 资源(全部公开免费) 编译与配置GDAL 编译与配置zlib 编译与配置CTB 检测安装是否成功 常见错误 ...
- Cesium terrain
Cesium terrain 生成 terrain 环境配置: 源码下载 下载地址:https://github.com/ahuarte47/cesium-terrain-builder/tree/m ...
- java压缩文件读取_用Java读取/写入压缩和非压缩文件
java压缩文件读取 这篇文章的主要原因是尝试不要重复自己( DRY ),因为通常,我会遇到递归的需求,即读写压缩的和非压缩的文件(主要是JSON和CSV). 首先让我们看看如何读取文本文件. 注意我 ...
- 用Java读取/写入压缩和非压缩文件
这篇文章的主要原因是尝试不重复自己( DRY ),因为通常,我会遇到读写压缩和非压缩文件(主要是JSON和CSV)的递归需求. 首先让我们看看如何读取文本文件. 注意我正在使用(相对较小的)文本文件, ...
- 数字非压缩光端机的选购原则
数字非压缩光端机主要应用于高速公路监控领域,可以保证实时性,指的是不经过压缩进行光传输的光端机,是在非压缩光端机基础上利用ADM电分插复用与TDM时分复用技术在一根光纤中实现多点多路(最大16个视频点 ...
- [SV]SystemVerilog压缩数组(Packed Array)和非压缩数组( Unpacked Array)
SystemVerilog压缩数组和非压缩数组 The term packed array is used to refer to the dimensions declared before the ...
- 【从零开始学习 SystemVerilog】2.8、SystemVerilog 数据类型—— Unpacked Arrays(非压缩数组)
非压缩数组用于引用变量名之后声明的维度. 非压缩数组可以是固定大小数组.动态数组.关联数组或队列. 文章目录 一维非压缩数组 多维非压缩数组 压缩+非压缩数组(混合数组) 一维非压缩数组 module ...
- 汇编--子程序设计(1)--非压缩bcd码和十进制的转换
输入四位十六进制数,显示对应的十进制数(还有位对应的值,以T作为结束符). ;PROGRAM GOES HERE;13:34 2023/4/15-------17:38 2023/4/16----17 ...
- 压缩BCD码和非压缩BCD码的区别
BCD码:用四个二进制位表示一个十进制数字:最常用的是8421 BCD码: 压缩型BCD码:一个字节可存放一个两位十进制数,其中高四位存放十位数字,低四位存放个位数字.如:56的 ...
- vant框架上传组件---上传身份证两面图片需求并且压缩图片质量,非压缩长宽——商城项目
场景 1.vant框架上传组件-上传身份证两面图片需求并且压缩图片质量,非压缩长宽--商城项目 2.压缩图片质量大小-- 3.压缩逻辑因为是正反两面单独压缩执行,所以我这里使用 Promise.all ...
最新文章
- listener.ora、sqlnet.ora、tnsnames.ora 详解
- 查看存储过程死锁的存储过程
- 一文看尽深度学习中的20种卷积(附源码整理和论文解读)
- Underscore _.template 方法使用详解
- Neural Networks神经网络编程入门
- SAP后台执行大数据量报表(鹦鹉学舌篇)
- JZOJ 5922. 【NOIP2018模拟10.23】sequence
- 3分钟练成SVN命令高手:SVN常用命令
- 聚类(part4)--多源数据聚类算法
- 34个省市自治区排序_freeCodeCamp的1,000多个学习小组现已完全自治
- 【Nginx】第一章 快速入门
- 无源波分和彩光模块_【光电通信】无源波分在 5G 场景中 的应用分析
- 在Red Hat Enterprise Linux 5 64-bit安装oracle11g r2
- 跨境电商erp系统一套多少钱,电商erp系统多少钱一年
- 微软笔试题-老鼠与毒药
- python 海龟 速度_Python中的高级turtle(海龟)作图
- 【渝粤教育】电大中专建设工程法规_1作业 题库
- 微信小程序中使用iconfont阿里巴巴矢量图标
- python的super函数详解
- 成为一个程序员要花多长时间
热门文章
- polymorphic-associations 多态关联实例 ruby on rails
- Android UI组件----ListView列表控件详解
- RH413-GRUB加密
- C/C++对文件的读写
- 开源框架Struts:FormBean滴那些事儿
- 项目中的文件夹与tomcat/webapp中manager文件夹重名
- 新氧ubuntu 9.04中文定制 Release 版(推荐)
- ruby环境变量的文件读取形式
- 7.Linux 高性能服务器编程 --- Linux 服务器程序规范
- 2.make file