简述

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. spring boot整合slf4j-log日志

    原文地址:https://blog.csdn.net/u011271894/article/details/75735915 版权声明:本文为博主原创文章,未经博主允许不得转载. https://bl ...

  2. 迭代器模式(Iterator)

    @@@模式定义: 提供一种方法顺序访问一个聚合对象中的各个元素,而又不需暴露该对象的内部表示. @@@练习示例:  工资表数据的整合 @@@示例代码: \pattern\PayModel.java ~ ...

  3. go语言之进阶篇error接口的使用

    1.error接口的使用 示例: package main import "fmt" import "errors" func main() { //var e ...

  4. 0mq 入门 (转)

    最近做后台发现很多地方需要队列,我用东西一般有两个要求:     1) 够傻够简单.    2) 有源码,能看又能改.    最后相中了0mq,下面介绍如何安装和写个简单的例子.一. linux平台: ...

  5. 用jstl标签判断一个字符串是否包含了另一个字符串

    <c:if test="${fn:contains(str1,str2)}">

  6. elasticsearch6.0版本安装head插件

    ES6.0版本安装head插件 1.1 前言 不知道是我电脑问题还是最近的开源软件都比较**,mysql和elasticsearch新版本变动都比较大. elasticsearch6.0貌似已经不支持 ...

  7. Delphi获取默认打印机名称及端口

    Delphi获取默认打印机名称及端口 在前段时间写的收银系统中由于目前市场上很多电脑主板上已经没有并口,而POS机却又需要并口,所以目前需要用PCI转接卡,这个就导致不同门店使用的端口就有可能不同,这 ...

  8. Concurrent HTTP connections in Node.js

    原文: https://fullstack-developer.academy/concurrent-http-connections-in-node-js/ -------------------- ...

  9. 转: gcc 指定运行时动态库路径

    gcc 指定运行时动态库路径 Leave a reply 由于种种原因,Linux 下写 c 代码时要用到一些外部库(不属于标准C的库),可是由于没有权限,无法将这写库安装到系统目录,只好安装用户目录 ...

  10. (转) Unity3D 使用Texturepacker打包工具制作NGUI(Atlas)图集

    转自:http://www.unitymanual.com/thread-37485-1-1.html 由于NGUI AtlasMaker对打包的优化不好,容易打出很大的图集,很多部分都是浪费的,所有 ...