博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
GDALBuildVRT异构波段的支持
阅读量:6720 次
发布时间:2019-06-25

本文共 3165 字,大约阅读时间需要 10 分钟。

目录

简述

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
_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
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 ); }

转载地址:http://sxcmo.baihongyu.com/

你可能感兴趣的文章
python3 Django 报错RuntimeWarning的解决办法
查看>>
【转】sql server 重命名表字段
查看>>
sql server 2008学习之存储过程
查看>>
Linux 硬盘分区、格式化、自动挂载配置
查看>>
Linux下mysql的安装与mysql一机多实例
查看>>
could not open virtual machine
查看>>
wordpress 3.8.1更改上传附件或图片大小限制
查看>>
IIS FTP 出现 530 User cannot log in, home Directory Inaccessible 错误
查看>>
DM6467T开发板领航——串口烧写程序
查看>>
微软谷歌推自有平板 挑战苹果难度大
查看>>
PHP中SQL注入与跨站***的防范
查看>>
Java中的异常处理
查看>>
egret--列表组件(list)
查看>>
mysql总结8----游标的学习
查看>>
java操作cookie的学习
查看>>
用sql语句对access数据库进行多条件查询
查看>>
Eclipse常用设置及快捷键
查看>>
DotNetTextBox V3.0 所见即所得编辑器控件Ver3.3.2 Free(免费版)
查看>>
php操作ini配置文件
查看>>
虚函数的应用以及实现机制
查看>>