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 ...
随机推荐
- Python集合模块collections
collections collections是Python内建的一个集合模块,提供了许多有用的集合类. namedtuple 我们知道tuple可以表示不变集合,例如,一个点的二维坐标就可以表示成: ...
- 标准输出中stderr和stdout的区别
一.首先介绍一下三者printf,sprintf,fprintf的功能 1,printf就是标准输出,在屏幕上打印出一段字符串来. 2,sprintf就是把格式化的数据写入到某个字符串中.返回值字符串 ...
- verilog语法实例学习(1)
本文档中通过verilog实例来学习verilog语法.Verilog是一种硬件描述语言,它具有并发性和时序性.并发性是指不同硬件模块的同时操作,时序性是指信号的赋值或操作在时钟的边沿进行.由于作者本 ...
- 手把手实现腾讯qq拖拽删去效果(一)
qq拖拽删除的效果,简单又好用,今天我就叫大家实现吧. 这个滑动效果,有何难点了,就是响应每行的点击事件了,为了完成这个任务,并且能够实现动画的效果了,我重写了一个slideview这个控件,这个控件 ...
- VS2010如何生成ActiveX控件测试容器
VS2010中默认没有ActiveX控件测试容器TSTCON.exe,而是微软把这个文件放到了例子程序中,需要用户自己编译: 具体方法为: 在VS2010的安装目录中找到以下目录Samples\205 ...
- 神经网络激活函数sigmoid relu tanh 为什么sigmoid 容易梯度消失
https://blog.csdn.net/danyhgc/article/details/73850546 什么是激活函数 为什么要用 都有什么 sigmoid ,ReLU, softmax 的比较 ...
- WPF装饰元素
Border: <Style TargetType="Border"> <Setter Property="CornerRadius" Val ...
- Total Commander如何设置自定义快捷键在当前目录打开ConEmu
Total Commander,简称TC,原名Windows Commander,是Windows平台下功能最强大的全能文件管理器. 自从使用了TC基本上就很少再打开Window的文件夹了,因为TC不 ...
- 浅谈压缩感知(十六):感知矩阵之RIP
在压缩感知中,总是看到"矩阵满足RIP"之类的字眼,没错,这是一个压缩感知绕不开的术语,有限等距性质(Restricted Isometry Property, RIP). 注意: ...
- springside
springside安装:http://www.oschina.net/question/582149_75623 1 安装maven,配置环境变量2 下载springside4 https://gi ...