Необработанное исключение в 0x000007FEDF2C9120 (gdal202.dll) в GdalTest.exe: 0xC0000005: расположение чтения нарушения доступа 0x0000000000000058 - PullRequest
0 голосов
/ 14 ноября 2018

Я пытаюсь использовать CreateCopy (), кажется, что я выбрасываю исключение при запуске программы

Необработанное исключение в 0x000007FEDF2C9120 (gdal202.dll) в GdalTest.exe: 0xC0000005: расположение чтения нарушения доступа 0x0000000000000058.

введите описание изображения здесь

Он отобразит этот вывод на консоли:

введите описание изображения здесь

Я пытаюсь выполнить отладку при возникновении исключения, в стеке вызовов он перейдет на новую вкладку, а затем не отобразит загруженный символ

введите описание изображения здесь

Я надеюсь, что кто-то может объяснить мне, какой файл не загружается, и если консоль может просматривать растровую карту, она выдаст ошибку или исключение? Ниже приведен мой код, если кто-то хочет скопировать и сделать ссылку на него, просто у меня есть проблемы в части «Использование CreateCopy ()».

Спасибо и всего наилучшего,

// GdalTest.cpp : Defines the entry point for the console application.
//



#include "cpl_conv.h" // for CPLMalloc()
#include "stdafx.h"
#include "gdal.h"
#include <stdlib.h>
#include <stdio.h>
#include "iostream"
#include "cpl_string.h"
#include "gdal_priv.h"




class GDALMajorObject;
class GDALDataset;
class GDALRasterBand;
class GDALDriver;
class GDALRasterAttributeTable;
class GDALProxyDataset;
class GDALProxyRasterBand;
class GDALAsyncReader;




int main(int argc,char* argv)
{

    ///*/*/*/*/*/*/*/*/*/*Getting Dataset Information*/*/*/*/*/*/*/*/*/*/

    GDALDataset *poDataset;


    //GDALDatasetH *poDatasetH;
    const char* Raster = new char[256];
    double  adfGeoTransform[6];


    GDALAllRegister();  

    Raster = "C:\\Users\\User\\Desktop\\DSI REFERENCE\\Map Data\\Raster\\4257.tif";

    poDataset = (GDALDataset *) GDALOpen(Raster, GA_ReadOnly )CPL_WARN_UNUSED_RESULT;
    //poDataset = (GDALDataset *) GDALOpen(Raster, GA_ReadOnly );

    if( poDataset == NULL )
    {
        printf("Not found");
    }         
    else
    {
        printf( "Driver: %s/%s\n",
        poDataset->GetDriver()->GetDescription(),
        poDataset->GetDriver()->GetMetadataItem( GDAL_DMD_LONGNAME ) );

        printf( "Size is %dx%dx%d\n",
        poDataset->GetRasterXSize(), poDataset->GetRasterYSize(),
        poDataset->GetRasterCount() );

    if( poDataset->GetProjectionRef()  != NULL )
        printf( "Projection is `%s'\n", poDataset->GetProjectionRef() );

    if( poDataset->GetGeoTransform( adfGeoTransform ) == CE_None )
    {
        printf( "Origin = (%.6f,%.6f)\n",
            adfGeoTransform[0], adfGeoTransform[3] );
        printf( "Pixel Size = (%.6f,%.6f)\n",
            adfGeoTransform[1], adfGeoTransform[5] );

    }

    }

    ///*/*/*/*/*/*/*/*/*/*  Fetching a Raster Band*/*/*/*/*/*/*/*/*/*/

    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() );

    // make it 256 bytes for a string length of 255 plus null (\0) terminator

    ///*/*/*/*/*/*/*/*/*/*/*Reading Raster Data*/*/*/*/*/*/*/*/*/*/*/

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

    ///*/*/*/*/*/*/*/*/*/*/*Techniques for Creating Files (determine whether it supports Create() and/or CreateCopy().) */*/*/*/*/*/*/*/*/*/*/

    const char *pszFormat = "GTiff";
    GDALDriver *poDriver;
    char **papszMetadata;
    poDriver = GetGDALDriverManager()->GetDriverByName(pszFormat);

    if( poDriver == NULL )
        exit( 1 );

    papszMetadata = poDriver->GetMetadata();
    if( CSLFetchBoolean( papszMetadata, GDAL_DCAP_CREATE, FALSE ) )
        printf( "Driver %s supports Create() method.\n", pszFormat );

    if( CSLFetchBoolean( papszMetadata, GDAL_DCAP_CREATECOPY, FALSE ) )
        printf( "Driver %s supports CreateCopy() method.\n", pszFormat );

    ///*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*Using CreateCopy()*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/

    const char*pszDstFilename= new char[256];

    GDALDataset *poSrcDS =(GDALDataset *) GDALOpen( pszDstFilename, GA_ReadOnly );
    GDALDataset *poDstDS;
    poDstDS = poDriver->CreateCopy( pszDstFilename, poSrcDS, FALSE,NULL, NULL, NULL );
    /* Once we're done, close properly the dataset */
    if( poDstDS != NULL )
    GDALClose( (GDALDatasetH) poDstDS );
    GDALClose( (GDALDatasetH) poSrcDS );

    std::cin.get();

    //delete[] Raster;// release the memory VERY IMPORTANT


}

1 Ответ

0 голосов
/ 14 ноября 2018

Вы не установили для переменной pszDstFilename ничего значащего.Вы выделили его, но он просто содержит случайный мусор.Вам нужно поместить в него действующий существующий набор данных, чтобы что-то полезное произошло при вызове GDALOpen().Документация гласит:

После регистрации драйверов приложение должно вызвать автономную функцию GDALOpen (), чтобы открыть набор данных, передавая имя набора данных. и требуемый доступ (GA_ReadOnly или GA_Update).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...