2014-04-22 6 views
0

DTED 파일을 다른 형식으로 변환하려고하므로 응용 프로그램에 표시 할 수 있습니다. 이제는 JPEG 형식을 대상으로합니다. 내가 필요한 것은 기본적으로 gdal_translate 명령이지만 C++ API를 사용하는 것입니다. 내가 GDAL C++ API를 사용하고 있는데 내가 입력 DTED 파일을 읽고 문제없이 읽을 수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);*/ 

그래서 내가하려는 것은 내가 원하는 것을하기위한 적절한 방법이 아니라는 것입니다. 내가 잘못하고있는 것을 나에게 설명해 주시겠습니까?

답변

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

이 내가 gdal_translate를 사용에서 얻는 것보다 약간 밝은 PNG 이미지를 제공, 난 아직도이 원인을 알아낼 필요가있다. 이것은 JPEG 이미지에서 작동하지만 결과를 읽을 수 없습니다 (gdalinfo --formats에 의해 "JPEG JTIF"라고 불리는 응용 프로그램 특정 형식이라고 생각합니다).

관련 문제