简述

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. BZOJ1337: 最小圆覆盖

    题目:求n个点的最小圆覆盖. 题解:最小圆覆盖,上模板.复杂度证明可以戳:这里 代码: #include<cstdio> #include<cstdlib> #include& ...

  2. sql server 复制,镜像,日志传输及故障转移集群区别

    一, 数据库复制 SQL Server 2008数据库复制是通过发布/订阅的机制进行多台服务器之间的数据同步,我们把它用于数据库的同步备份.这里的同步备份指的是备份服务器与主服务器进行 实时数据同步, ...

  3. Linux下的串口编程实例

    //串口相关的头文件  #include<stdio.h>      /*标准输入输出定义*/  #include<stdlib.h>     /*标准函数库定义*/  #in ...

  4. ArcGisServer根据最大最小坐标换算瓦片行列号【转】

    1.前言 在上一节中我们知道了屏幕上一像素等于实际中多少单位长度(米或经纬度)的换算方法,而知道这个原理后,接下来我们要怎么用它呢?它和我们前端显示地图有什么关联呢?这一节,我会尽量详细的将这两个问题 ...

  5. [leetcode]Sort Colors @ Python

    原题地址:https://oj.leetcode.com/problems/sort-colors/ 题意: Given an array with n objects colored red, wh ...

  6. IntelIj IDEA运行JUnit Test OutOfMemoryError

    好久没看到OutOfMemoryError这种错误了,今天跑测试的时候发现总是报错.针对IDEA需要修改几个配置. JUnit Test在运行前,IDEA会build整个项目,这个是喜欢eclipse ...

  7. 【Java】Java-ShutDownHook-优雅关闭系统资源

    Java-ShutDownHook-优雅关闭系统资源 java shuadownhook_百度搜索 Java应用中使用ShutdownHook友好地清理现场 - 残雪余香 - 博客园 java kil ...

  8. Red Hat 配置ip地址

    red hat 的网卡配置文件位于:/etc/sysconfig/network-scripts目录下,如ifcfg-eth0,ifcfg-eth1等等,下面进行配置: 1)DEVICE=eth0 定 ...

  9. 如何在编辑器里添加CSS或JS代码

    //编辑器里代码模式下的代码 <scripttype="text/javascript"> //my code.... </script> //编辑器里可视 ...

  10. IDEA初使用:解决搜狗输入法不跟随BUG

    IDEA初使用:解决搜狗输入法不跟随BUG https://blog.csdn.net/qq_27905183/article/details/79119237 嗯,学习了: 然而,效果不明显: