将DTED转换为其他格式

时间:2014-04-22 16:00:09

标签: c++ api gdal

我试图以其他格式转换DTED文件,以便我可以在应用程序中显示它,现在我正在以JPEG格式为目标。我需要的基本上是gdal_translate命令,但通过C ++ API。

我正在使用GDAL C ++ API,我可以读取输入的DTED文件并毫无问题地阅读它:

GDALAllRegister();

GDALDataset  *poDataset;

poDataset = (GDALDataset *) GDALOpen( "n43.dt2", GA_ReadOnly );
if( poDataset == NULL )
{
   return 0;
}

我也可以毫无问题地访问相应的乐队。

GDALRasterBand  *poBand;
int             nBlockXSize, nBlockYSize;
int             bGotMin, bGotMax;
double          adfMinMax[2];

poBand = poDataset->GetRasterBand( 1 );
poBand->GetBlockSize( &nBlockXSize, &nBlockYSize );
printf( "Block=%dx%d Type=%s, ColorInterp=%s\n",
        nBlockXSize, nBlockYSize,
        GDALGetDataTypeName(poBand->GetRasterDataType()),
        GDALGetColorInterpretationName(
            poBand->GetColorInterpretation()) );

adfMinMax[0] = poBand->GetMinimum( &bGotMin );
adfMinMax[1] = poBand->GetMaximum( &bGotMax );
if( ! (bGotMin && bGotMax) )
    GDALComputeRasterMinMax((GDALRasterBandH)poBand, TRUE, adfMinMax);

printf( "Min=%.3fd, Max=%.3f\n", adfMinMax[0], adfMinMax[1] );

if( poBand->GetOverviewCount() > 0 )
    printf( "Band has %d overviews.\n", poBand->GetOverviewCount() );

if( poBand->GetColorTable() != NULL )
    printf( "Band has a color table with %d entries.\n",
                     poBand->GetColorTable()->GetColorEntryCount() );

但我无法弄清楚如何使用想要的驱动程序在另一个数据集中添加此频段。当我尝试使用AddBand函数时,我的应用程序崩溃了。

float *pafScanline;
int   nXSize = poBand->GetXSize();

pafScanline = (float *) CPLMalloc(sizeof(float)*nXSize);
poBand->RasterIO( GF_Read, 0, 0, nXSize, 1,
                  pafScanline, nXSize, 1, GDT_Float32,
                  0, 0 );


GDALClose(poDataset);
GDALDataset  *resDataset;
GDALRasterBand  *resBand;
resDataset->AddBand (GDT_Float32, NULL);//<-application crashes here

/*resBand = resDataset->GetRasterBand(1);
resBand->RasterIO( GF_Write, 0, 0, nXSize, 1,
                  pafScanline, nXSize, 1, GDT_Float32,
                  0, 0 );*/

所以我想我想要做的不是做我需要的正确方法。你能解释一下我做错了吗?

1 个答案:

答案 0 :(得分:0)

好吧,我想我已经明白了:除非经过虚拟光栅,否则我不应该使用栅格波段,而只需使用CreatCopy。

这是我的工作代码:

#include <iostream>
#include "gdal_priv.h"
#include "cpl_conv.h" // for CPLMalloc()

using namespace std;

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();

GDALAllRegister();
GDALDatasetH  poDataset;

poDataset = (GDALDataset *) GDALOpenShared( "n43.dt2", GA_ReadOnly );
if( poDataset == NULL )
{
   return 0;
}

const char *pszFormat = "PNG";

GDALDatasetH  resDataset;

GDALProgressFunc    pfnProgress = GDALTermProgress;
GDALDriverH hDriver = GDALGetDriverByName( pszFormat );
const char *pszDest = "n43.png";
char **papszCreateOptions = NULL;

resDataset = GDALCreateCopy( hDriver, pszDest, poDataset,
                                 FALSE, papszCreateOptions,
                                 pfnProgress, NULL );

if( resDataset != NULL )
{
    GDALClose( resDataset );
}
else
{
    printf("Error creating output dataset.");
}

GDALClose(poDataset);
CSLDestroy( papszCreateOptions );

return 1;
}

这使得PNG图像比使用gdal_translate得到的图像略亮一些,我仍然需要弄清楚导致这种情况的原因。这适用于JPEG图像但结果无法读取(我认为这是一种特定于应用程序的格式,因为它被gdalinfo --formats称为“JPEG JTIF”)。