调用GDALFillNodata()的C++代码运行崩溃问题求助
问题:C++调用GDALFillNodata()崩溃,进程返回值255
我原本用Python+GDAL实现的GDALFillNodata()处理1.5GB的高程DEM数据,但速度太慢,所以尝试编写C++版本调用该算法。我写了一个命令行程序(文件路径暂为硬编码),在CodeBlocks 16.1/MinGW环境下编译通过,但运行时直接崩溃,进程返回值为255。
我并非C程序员,仅具备中等Python水平,推测可能遗漏了C的基础知识点。代码中包含一些测试时注释掉的内容。
我的C++代码
#include <iostream> #include "gdal.h" #include "gdal_priv.h" #include "cpl_conv.h" #include "gdal_alg.h" int main() { GDALAllRegister(); //CPLPushErrorHandler(CPLQuietErrorHandler); // Read/Write Files const char *input = "D:/myIn.tif"; GDALDataset *pSrcDataset; //GDALRasterBandH hMaskBand; GDALRasterBand *poBand; //CPLErr maskBand; int maskFlags; int noData; double maxSearch = 10.0; int maxInt = 1; int nBlockXSize, nBlockYSize; double adfGeoTransform[6]; //CPLErr eErr; pSrcDataset = (GDALDataset*) GDALOpen(input, GA_Update); CPLAssert( pSrcDataset != NULL ); poBand = pSrcDataset->GetRasterBand( 1 ); poBand->GetBlockSize( &nBlockXSize, &nBlockYSize ); printf( "Block=%dx%d Type=%s, ColorInterp=%s\n", nBlockXSize, nBlockYSize, GDALGetDataTypeName(poBand->GetRasterDataType()), GDALGetColorInterpretationName( poBand->GetColorInterpretation()) ); noData = pSrcDataset->GetRasterBand(1)->GetNoDataValue(); printf( "No Data Value = %i\n",noData ); printf( "Driver: %s/%s\n", pSrcDataset->GetDriver()->GetDescription(), pSrcDataset->GetDriver()->GetMetadataItem( GDAL_DMD_LONGNAME ) ); printf( "Size is %dx%dx%d\n", pSrcDataset->GetRasterXSize(), pSrcDataset->GetRasterYSize(), pSrcDataset->GetRasterCount() ); if( pSrcDataset->GetProjectionRef() != NULL ) printf( "Projection is `%s'\n", pSrcDataset->GetProjectionRef() ); if( pSrcDataset->GetGeoTransform( adfGeoTransform ) == CE_None ) printf( "Origin = (%.6f,%.6f)\n", adfGeoTransform[0], adfGeoTransform[3] ); printf( "Pixel Size = (%.6f,%.6f)\n",adfGeoTransform[1], adfGeoTransform[5] ); //maskBand = pSrcDataset->GetRasterBand(1)->GetMaskBand(); //hMaskBand = GDALGetMaskBand( maskBand ); //hMaskBand = pSrcDataset->GetRasterBand(1)->GetNoDataValue(); maskFlags = pSrcDataset->GetRasterBand(1)->GetMaskFlags(); printf ( "Mask Flags = %i\n", maskFlags ); printf ( "Processing image\n" ); // Ignore that this is on two lines here GDALFillNodata(pSrcDataset, pSrcDataset->GetRasterBand(1)->GetMaskBand(), maxSearch, 0, maxInt, NULL, NULL, NULL); //CPLAssert( eErr == CE_None); GDALClose(pSrcDataset); return 0; }
运行崩溃情况
程序运行时直接崩溃,进程返回值为255。
可用的Python实现代码
#Run the gdal fill ET = gdal.Open(infile, GA_Update) ETband = ET.GetRasterBand(1) result = gdal.FillNodata(targetBand = ETband, maskBand = None, maxSearchDist = 500, smoothingIterations = 1) print result # return 0 ET = None
我不确定Python中的None是否等价于C++中的NULL,之前使用NULL作为hMaskBand时也出现过错误。推测问题可能出在构建环境上,若需要更多信息请告知。谢谢!
内容的提问来源于stack exchange,提问作者jheathharwood
相关产品推荐
相关产品推荐

