简述

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异构波段的支持的更多相关文章

  1. HPC高性能计算知识: 异构并行计算

    版权声明:很多其它内容,请关注[架构师技术联盟]公众号 https://blog.csdn.net/BtB5e6Nsu1g511Eg5XEg/article/details/80059122 当摩尔定 ...

  2. 常见的MYSQL高可用解决方案

    MySQL 是一种关系数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性.MySQL 软件采用了双授权政策(本词条"授权政策& ...

  3. 分享MYSQL中的各种高可用技术(源自姜承尧大牛)

    分享MYSQL中的各种高可用技术(源自姜承尧大牛) 图片和资料来源于MYSQL大牛姜承尧老师(MYSQL技术内幕作者) 姜承尧: 网易杭州研究院 技术经理 主导INNOSQL的开发 mysql高可用各 ...

  4. Oracle 数据集成的实际解决方案

    就针对市场与企业的发展的需求,Oracle公司提供了一个相对统一的关于企业级的实时数据解决方案,即Oracle数据集成的解决方案.以下的文章主要是对其解决方案的具体描述,望你会有所收获. Oracle ...

  5. 学习笔记之Java程序设计实用教程

    Java程序设计实用教程 by 朱战立 & 沈伟 学习笔记之JAVA多线程(http://www.cnblogs.com/pegasus923/p/3995855.html) 国庆休假前学习了 ...

  6. Python中字典和集合

    Python中字典和集合 映射类型: 表示一个任意对象的集合,且可以通过另一个几乎是任意键值的集合进行索引 与序列不同,映射是无序的,通过键进行索引 任何不可变对象都可用作字典的键,如字符串.数字.元 ...

  7. hadoop大数据技术架构详解

    大数据的时代已经来了,信息的爆炸式增长使得越来越多的行业面临这大量数据需要存储和分析的挑战.Hadoop作为一个开源的分布式并行处理平台,以其高拓展.高效率.高可靠等优点越来越受到欢迎.这同时也带动了 ...

  8. Oracle数据库容灾备份技术探讨

    Oracle数据库容灾备份技术探讨 三种Oracle灾备技术 对于Oracle数据库的灾备技术,我们可以从Data Guard,GoldenGate和CDP角度去考虑. Oracle Data Gua ...

  9. Tensorflow源码解析1 -- 内核架构和源码结构

    1 主流深度学习框架对比 当今的软件开发基本都是分层化和模块化的,应用层开发会基于框架层.比如开发Linux Driver会基于Linux kernel,开发Android app会基于Android ...

随机推荐

  1. MongoDB 分布式部署教程

    本文将介绍如何使用 MongoDB 提供的 Replica Set 和 Shards 功能构建一个分布式 MongoDB 集群. Replica Set 部署 我们先从部署一个三节点的 Replica ...

  2. 禁止MT在公式后面自动添加一个空格

    开始 > 运行,或者win+R,然后输入 regedit,打开注册表编辑器.展开到HKEY_CURRENT_USER\Software\Design Science\DSMT6\WordComm ...

  3. 动态SQL(章节摘要)

    1,使用动态SQL能够在依赖对象不存在时创建子程序. 2.动态SQL主要利用EXECUTE IMMEDIATE语句运行DML,DDL,DCL等语句操作. 3,假设使用了绑定变量,则必须在EXECUTE ...

  4. c#利用SWIG调用c++dll学习总结【转】

    开发环境: 操作系统:windows 7 IDE:Microsoft Visual Studio Professional 2015 SWIG: 3.0.12 swig的介绍 详细介绍可看官网,一下贴 ...

  5. query多选下拉框插件 jquery-multiselect(修改)

    其实网上关于该控件的使用教程已经很多了,其中 query多选下拉框插件 jquery-multiselect Jquery多选下拉列表插件jquery multiselect功能介绍及使用 这2个的介 ...

  6. JS读取XML文件数据并以table显示数据(兼容IE火狐)

    先看xml文件: <?xml version="1.0" standalone="yes"?> <student> <stuinf ...

  7. Java Math.sqrt()方法

    描述 java.lang.Math.sqrt(double a) 返回正确舍入的一个double值的正平方根.特殊情况: 如果参数是NaN或小于为零,那么结果是NaN. 如果参数是正无穷大,那么结果为 ...

  8. Nginx网站常见的跳转配置实例

    相信大家在日常运维工作中如果你用到nginx作为前端反向代理服务器的话,你会对nginx的rewrite又爱又恨,爱它是因为你搞定了它,完成了开发人员的跳转需求后你会觉得很爽,觉得真的很强大,恨它是因 ...

  9. Android -- Handling back button press Inside Fragments

    干货(1) 首先创建一个抽象类BackHandledFragment,该类有一个抽象方法onBackPressed(),所有BackHandledFragment的子类在onBackPressed方法 ...

  10. tensorflow项目构建流程

    https://blog.csdn.net/hjimce/article/details/51899683 一.构建路线 个人感觉对于任何一个深度学习库,如mxnet.tensorflow.thean ...