GDALBuildVRT异构波段的支持
简述
GDALBuildVRT工具和函数默认都是不支持异构波段的(即要建立虚拟影像目录的文件中有波段与其它有异的,少于指定波段等特征的),公司一个项目中需要支持这个特性,不足的以第1波段替代(除非波段数为0,那这在影像质检的时候就已经检查完了),这里记录一下修改方式。
修改源码
使用的GDAL版本是2.2.3,修改的源码文件为gdal-2.2.3\apps\gdalbuildvrt_lib.cpp。
1、修改DatasetProperty结构体
修改这个结构体,增加用于记录每个影像波段数的成员变量,修改结果如下
大致在源文件的75-90行
typedef struct
{
int isFileOK;
int nRasterXSize;
int nRasterYSize;
double adfGeoTransform[6];
int nBlockXSize;
int nBlockYSize;
GDALDataType firstBandType;
int* panHasNoData;
double* padfNoDataValues;
int bHasDatasetMask;
int nMaskBlockXSize;
int nMaskBlockYSize;
int nRasterBandCount; /*新增,记录影像波段数*/
} DatasetProperty;
2、修改VRTBuilder::AnalyseRaster函数
大致在源文件的406-789行
修改这个函数主要是去除对异构波段的检测,同时加上对来源影像波段数的记录。
将以下代码
大致在源文件的543行
int _nBands = GDALGetRasterCount(hDS);
修改为如下,记录来源影像的波段数
int _nBands = psDatasetProperties->nRasterBandCount =GDALGetRasterCount(hDS);
将以下代码注释掉,跳过波段数的检测
大致在源文件的685-690行
if (!bSeparate)
{
// if (nMaxBandNo > _nBands)
// {
// CPLError(CE_Warning, CPLE_NotSupported,
// "gdalbuildvrt does not support heterogeneous band numbers. Skipping %s",
// dsFileName);
// return FALSE;
// }
将以下代码注释,去掉对波段颜色特征信息的匹配
大致在源文件的695行
for(j=0;j<nMaxBandNo;j++)
{
int bandNo = j + 1;
if(bandNo > _nBands){ bandNo = 1;}
GDALRasterBandH hRasterBand = GDALGetRasterBand( hDS, bandNo );
/*去掉对波段颜色特征信息的比对*/
if (/* pasBandProperties[j].colorInterpretation != GDALGetRasterColorInterpretation(hRasterBand) || */
pasBandProperties[j].dataType != GDALGetRasterDataType(hRasterBand))
{
3、修改VRTBuilder::CreateVRTNonSeparate函数
因为我们不做每个影像单独一个波段的版本,所以这里只修改NonSeparate版本。
这里主要修改VRT波段配置源(poVRTBand->ConfigureSource)时候的来源影像波段的选择,修改的地方不多,这里贴出稍微完整点的带注释的代码。
大致在源文件的950-978行
for(int j=0;j<nBands;j++)
{
/* 获取VRT的第j+1波段 */
VRTSourcedRasterBandH hVRTBand =
(VRTSourcedRasterBandH)GDALGetRasterBand(hVRTDS, j + 1);
/* Place the raster band at the right position in the VRT 将栅格波段置于VRT中的正确位置 */
/* 获取源影像的波段索引,如果源影像的波段数小于j+1了,那就使用第一波段 */
int sourceBandIndex = (j + 1) > psDatasetProperties->nRasterBandCount ? 0 : j;
int nSelBand = panBandList[sourceBandIndex ] - 1; // 修改的位置也就这两行
VRTSourcedRasterBand* poVRTBand = (VRTSourcedRasterBand*)hVRTBand;
/* 检测源影像的Nodata信息 */
VRTSimpleSource* poSimpleSource;
if (bAllowSrcNoData && psDatasetProperties->panHasNoData[nSelBand])
{
poSimpleSource = new VRTComplexSource();
poSimpleSource->SetNoDataValue( psDatasetProperties->padfNoDataValues[nSelBand] );
}
else
poSimpleSource = new VRTSimpleSource();
if( pszResampling )
poSimpleSource->SetResampling(pszResampling);
/*对VRT波段配置正确的源信息*/
poVRTBand->ConfigureSource( poSimpleSource,
(GDALRasterBand*)GDALGetRasterBand((GDALDatasetH)hProxyDS, nSelBand + 1),
FALSE,
dfSrcXOff, dfSrcYOff,
dfSrcXSize, dfSrcYSize,
dfDstXOff, dfDstYOff,
dfDstXSize, dfDstYSize );
/*添加源*/
poVRTBand->AddSource( poSimpleSource );
}
GDALBuildVRT异构波段的支持的更多相关文章
- HPC高性能计算知识: 异构并行计算
版权声明:很多其它内容,请关注[架构师技术联盟]公众号 https://blog.csdn.net/BtB5e6Nsu1g511Eg5XEg/article/details/80059122 当摩尔定 ...
- 常见的MYSQL高可用解决方案
MySQL 是一种关系数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性.MySQL 软件采用了双授权政策(本词条"授权政策& ...
- 分享MYSQL中的各种高可用技术(源自姜承尧大牛)
分享MYSQL中的各种高可用技术(源自姜承尧大牛) 图片和资料来源于MYSQL大牛姜承尧老师(MYSQL技术内幕作者) 姜承尧: 网易杭州研究院 技术经理 主导INNOSQL的开发 mysql高可用各 ...
- Oracle 数据集成的实际解决方案
就针对市场与企业的发展的需求,Oracle公司提供了一个相对统一的关于企业级的实时数据解决方案,即Oracle数据集成的解决方案.以下的文章主要是对其解决方案的具体描述,望你会有所收获. Oracle ...
- 学习笔记之Java程序设计实用教程
Java程序设计实用教程 by 朱战立 & 沈伟 学习笔记之JAVA多线程(http://www.cnblogs.com/pegasus923/p/3995855.html) 国庆休假前学习了 ...
- Python中字典和集合
Python中字典和集合 映射类型: 表示一个任意对象的集合,且可以通过另一个几乎是任意键值的集合进行索引 与序列不同,映射是无序的,通过键进行索引 任何不可变对象都可用作字典的键,如字符串.数字.元 ...
- hadoop大数据技术架构详解
大数据的时代已经来了,信息的爆炸式增长使得越来越多的行业面临这大量数据需要存储和分析的挑战.Hadoop作为一个开源的分布式并行处理平台,以其高拓展.高效率.高可靠等优点越来越受到欢迎.这同时也带动了 ...
- Oracle数据库容灾备份技术探讨
Oracle数据库容灾备份技术探讨 三种Oracle灾备技术 对于Oracle数据库的灾备技术,我们可以从Data Guard,GoldenGate和CDP角度去考虑. Oracle Data Gua ...
- Tensorflow源码解析1 -- 内核架构和源码结构
1 主流深度学习框架对比 当今的软件开发基本都是分层化和模块化的,应用层开发会基于框架层.比如开发Linux Driver会基于Linux kernel,开发Android app会基于Android ...
随机推荐
- 聚类:层次聚类、基于划分的聚类(k-means)、基于密度的聚类、基于模型的聚类
一.层次聚类 1.层次聚类的原理及分类 1)层次法(Hierarchicalmethods)先计算样本之间的距离.每次将距离最近的点合并到同一个类.然后,再计算类与类之间的距离,将距离最近的类合并为一 ...
- Chapter 2 -- Preconditions
Using Guava's precondition checking utilities, explained. explained Updated Apr 23, 2012 by wasserma ...
- git: error while loading shared libraries: libiconv.so.2
git安装之后出现:git: error while loading shared libraries: libiconv.so.2: cannot open shared object file: ...
- 【转】 Qt如何设置自动补全快捷键
原文:https://blog.csdn.net/u014597198/article/details/52797435 在用Qt编程的时,它默认是以“CTRL+空格”来作为自动补全的快捷键的,但是这 ...
- 【转】Delphi"配置系统未能初始化"
好久没用DelphiXE8了,最近打开一看,在启动时报错了“配置系统未能初始化”,在网上一搜,有各种种样的说法,大体上是与.net的Framewok相关,照着一个一个地试了下,还是解决不了这个错误.有 ...
- 再看copy_on_write缩小临界区的例子
本例子是模拟的读者写者问题,采用shared_ptr+写时拷贝实现,其中我觉得一个比较值得注意的地方是考虑到对象可能在临界区析构而将析构移除临界区,这对于多线程来说要多看多思. #include< ...
- Go语言之进阶篇文件传输
一.文件传输 1.文件传输原理 2.文件传输 示例: 发送方: send_file.go package main import ( "fmt" "io" &q ...
- CentOS7安装openjdk、tomcat和mysql流程介绍
首先是前戏,推荐一个远程工具Xshell和Xftp搭配使用,以下是Xshell的官网 http://www.netsarang.com/products/xsh_overview.html 1.ope ...
- 服务器主体 "sa" 无法在当前安全上下文下访问数据库 XXX[SQLSTATE 08004] (错误 916). 该步骤失败。
作业脚本为use XXX go 修改为选择XXX数据库
- python对json的操作总结 zz
Json简介:Json,全名 JavaScript Object Notation,是一种轻量级的数据交换格式.Json最广泛的应用是作为AJAX中web服务器和客户端的通讯的数据格式.现在也常用于h ...