You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:20:31