òÕËÏ×ÏÄÓÔ×Ï ÐÏ ÉÓÐÏÌØÚÏ×ÁÎÉÀ GDAL

ïÔËÒÙÔÉÅ ÆÁÊÌÁ

ðÅÒÅÄ ÔÅÍ, ËÁË ÏÔËÒÙÔØ ÎÁÂÏÒ ÄÁÎÎÙÈ, ÐÏÄÄÅÒÖÉ×ÁÅÍÙÊ GDAL, ÎÅÏÂÈÏÄÉÍÏ ÚÁÒÅÇÉÓÔÒÉÒÏ×ÁÔØ ÄÒÁÊ×ÅÒÙ. äÌÑ ËÁÖÄÏÇÏ ÐÏÄÄÅÒÖÉ×ÁÅÍÏÇÏ ÆÏÒÍÁÔÁ ÓÕÝÅÓÔ×ÕÅÔ ÏÔÄÅÌØÎÙÊ ÄÒÁÊ×ÅÒ. ÷ ÂÏÌØÛÉÎÓÔ×Å ÓÌÕÞÁÅ× ÜÔÏ ÍÏÖÎÏ ÓÄÅÌÁÔØ Ó ÐÏÍÏÝØÀ ÆÕÎËÃÉÉ GDALAllRegister(), ËÏÔÏÒÁÑ ÐÙÔÁÅÔÓÑ ÚÁÒÅÇÉÓÔÒÉÒÏ×ÁÔØ ×ÓÅ ÉÚ×ÅÓÔÎÙÅ ÄÒÁÊ×ÅÒÙ, ×ËÌÀÞÁÑ ÔÅ, ÞÔÏ ÚÁÇÒÕÖÅÎÙ ÉÚ ÄÉÎÁÍÉÞÅÓËÉ ÐÏÄÇÒÕÖÁÅÍÙÈ ÍÏÄÕÌÅÊ .so, ÉÓÐÏÌØÚÕÑ GDALDriverManager::AutoLoadDrivers(). éÍÅÅÔÓÑ ×ÏÚÍÏÖÎÏÓÔØ ÏÇÒÁÎÉÞÉÔØ ÎÁÂÏÒ ÄÒÁÊ×ÅÒÏ×, ÄÏÓÔÕÐÎÙÈ × ÐÒÉÌÏÖÅÎÉÉ; ÐÒÉÍÅÒÏÍ ÍÏÖÅÔ ÓÌÕÖÉÔØ ËÏÄ ÍÏÄÕÌÑ gdalallregister.cpp.

ëÁË ÔÏÌØËÏ ÄÒÁÊ×ÅÒÙ ÚÁÒÅÇÉÓÔÒÉÒÏ×ÁÎÙ, ÐÒÉÌÏÖÅÎÉÅ ÄÏÌÖÎÏ ×ÙÚ×ÁÔØ ÆÕÎËÃÉÀ GDALOpen() ÄÌÑ ÏÔËÒÙÔÉÑ ÎÁÂÏÒÁ ÄÁÎÎÙÈ. ÷ ËÁÞÅÓÔ×Å ÐÁÒÁÍÅÔÒÏ× ÆÕÎËÃÉÑ ÐÒÉÎÉÍÁÅÔ ÎÁÚ×ÁÎÉÅ ÎÁÂÏÒÁ ÄÁÎÎÙÈ É ÒÅÖÉÍ ÄÏÓÔÕÐÁ (GA_ReadOnly ÉÌÉ GA_Update).

îÁ ÑÚÙËÅ C++:

#include "gdal_priv.h"

int main()
{
    GDALDataset  *poDataset;

    GDALAllRegister();

    poDataset = (GDALDataset *) GDALOpen( pszFilename, GA_ReadOnly );
    if( poDataset == NULL )
    {
        ...;
    }

îÁ ÑÚÙËÅ C:

#include "gdal.h"

int main()
{
    GDALDatasetH  hDataset;

    GDALAllRegister();

    hDataset = GDALOpen( pszFilename, GA_ReadOnly );
    if( hDataset == NULL )
    {
        ...;
    }

îÁ ÑÚÙËÅ Python:

    import gdal
    from gdalconst import *

    dataset = gdal.Open( filename, GA_ReadOnly )
    if dataset is None:
        ...

åÓÌÉ GDALOpen() ×ÏÚ×ÒÁÝÁÅÔ NULL, ÜÔÏ ÏÚÎÁÞÁÅÔ, ÞÔÏ ÏÐÅÒÁÃÉÑ ÎÅ ÕÄÁÌÁÓØ É ÞÔÏ ÓÏÏÂÝÅÎÉÑ Ï ÏÛÉÂËÅ ÂÙÌÉ ÐÏÓÌÁÎÙ Ó ÐÏÍÏÝØÀ ÆÕÎËÃÉÉ CPLError(). åÓÌÉ ×Ù ÈÏÔÉÔÅ ÕÐÒÁ×ÌÑÔØ ÐÒÏÃÅÓÓÏÍ ×ÙÄÁÞÉ ÐÏÌØÚÏ×ÁÔÅÌÀ ÓÏÏÂÝÅÎÉÊ Ï ÏÛÉÂËÁÈ, ÔÏ ÏÂÒÁÔÉÔÅÓØ Ë ÄÏËÕÍÅÎÔÁÃÉÉ ÎÁ ÆÕÎËÃÉÀ CPLError(). ÷ÏÏÂÝÅ ÇÏ×ÏÒÑ, CPLError() ÐÒÉÍÅÎÑÅÔÓÑ ×Ï ×ÓÅÈ ËÏÍÐÏÎÅÎÔÁÈ GDAL ÄÌÑ ×ÙÄÁÞÉ ÓÏÏÂÝÅÎÉÊ Ï ÏÛÉÂËÁÈ. úÁÍÅÔÉÍ ÔÁËÖÅ, ÞÔÏ pszFilename ÎÅ ÄÏÌÖÎÁ ÏÂÑÚÁÔÅÌØÎÏ ÂÙÔØ ÉÍÅÎÅÍ ÆÁÊÌÁ ÎÁ ÆÉÚÉÞÅÓËÏÍ ÎÏÓÉÔÅÌÅ (ÈÏÔÑ ÏÂÙÞÎÏ ÜÔÏ ÔÁË). éÎÔÅÒÐÒÅÔÁÃÉÑ ÜÔÏÇÏ ÐÁÒÁÍÅÔÒÁ ÚÁ×ÉÓÉÔ ÏÔ ÄÒÁÊ×ÅÒÁ, ÜÔÏ ÍÏÖÅÔ ÂÙÔØ URL ÉÌÉ ÉÍÑ ÆÁÊÌÁ Ó ÄÏÐÏÌÎÉÔÅÌØÎÙÍÉ ÐÁÒÁÍÅÔÒÁÍÉ, ÕÐÒÁ×ÌÑÀÝÉÍÉ ÐÒÏÃÅÓÓÏÍ ÞÔÅÎÉÑ, ÌÉÂÏ ÞÅÍ-ÔÏ ÉÎÙÍ. ðÏÖÁÌÕÊÓÔÁ, ÎÅ ÏÇÒÁÎÉÞÉ×ÁÊÔÅ ÄÉÁÌÏÇÉ ×ÙÂÏÒÁ ÎÁÂÏÒÁ ÄÁÎÎÙÈ ÄÌÑ ÏÔËÒÙÔÉÑ ÔÏÌØËÏ ÌÉÛØ ÆÁÊÌÁÍÉ ÎÁ ÆÉÚÉÞÅÓËÉÈ ÎÏÓÉÔÅÌÑÈ.

þÔÅÎÉÅ ÉÎÆÏÒÍÁÃÉÉ Ï ÎÁÂÏÒÅ ÄÁÎÎÙÈ

ëÁË ÂÙÌÏ ÏÐÉÓÁÎÏ × ÒÁÚÄÅÌÅ íÏÄÅÌØ ÄÁÎÎÙÈ GDAL, ÎÁÂÏÒ ÄÁÎÎÙÈ GDALDataset ÓÏÄÅÒÖÉÔ ÓÐÉÓÏË ÒÁÓÔÒÏ×ÙÈ ËÁÎÁÌÏ×, ÐÏËÒÙ×ÁÀÝÉÈ ÏÄÎÕ É ÔÕ ÖÅ ÔÅÒÒÉÔÏÒÉÀ É ÉÍÅÀÝÉÈ ÏÄÉÎÁËÏ×ÏÅ ÒÁÚÒÅÛÅÎÉÅ. ïÎ ÔÁËÖÅ ÓÏÄÅÒÖÉÔ ÍÅÔÁÄÁÎÎÙÅ, ËÏÏÒÄÉÎÁÔÎÕÀ ÓÉÓÔÅÍÕ, ÇÅÏÇÒÁÆÉÞÅÓËÕÀ ÐÒÉ×ÑÚËÕ, ÒÁÚÍÅÒ ÒÁÓÔÒÁ É ÎÅËÏÔÏÒÕÀ ÄÏÐÏÌÎÉÔÅÌØÎÕÀ ÉÎÆÏÒÍÁÃÉÀ.

    adfGeoTransform[0] /* ËÏÏÒÄÉÎÁÔÁ x ×ÅÒÈÎÅÇÏ ÌÅ×ÏÇÏ ÕÇÌÁ */
    adfGeoTransform[1] /* ÛÉÒÉÎÁ ÐÉËÓÅÌÁ */
    adfGeoTransform[2] /* ÐÏ×ÏÒÏÔ, 0, ÅÓÌÉ ÉÚÏÂÒÁÖÅÎÉÅ ÏÒÉÅÎÔÉÒÏ×ÁÎÏ ÎÁ ÓÅ×ÅÒ */
    adfGeoTransform[3] /* ËÏÏÒÄÉÎÁÔÁ y ×ÅÒÈÎÅÇÏ ÌÅ×ÏÇÏ ÕÇÌÁ */
    adfGeoTransform[4] /* ÐÏ×ÏÒÏÔ, 0, ÅÓÌÉ ÉÚÏÂÒÁÖÅÎÉÅ ÏÒÉÅÎÔÉÒÏ×ÁÎÏ ÎÁ ÓÅ×ÅÒ */
    adfGeoTransform[5] /* ×ÙÓÏÔÁ ÐÉËÓÅÌÁ */

åÓÌÉ ÍÙ ÈÏÔÉÍ ×Ù×ÅÓÔÉ ÎÅËÏÔÏÒÕÀ ÏÂÝÕÀ ÉÎÆÏÒÍÁÃÉÀ Ï ÎÁÂÏÒÅ ÄÁÎÎÙÈ, ÔÏ ÍÏÖÎÏ ÓÄÅÌÁÔØ ÓÌÅÄÕÀÝÅÅ:

îÁ ÑÚÙËÅ C++:

    double        adfGeoTransform[6];

    printf( "äÒÁÊ×ÅÒ: %s/%s\n",
            poDataset->GetDriver()->GetDescription(), 
            poDataset->GetDriver()->GetMetadataItem( GDAL_DMD_LONGNAME ) );

    printf( "òÁÚÍÅÒ %dx%dx%d\n", 
            poDataset->GetRasterXSize(), poDataset->GetRasterYSize(),
            poDataset->GetRasterCount() );

    if( poDataset->GetProjectionRef()  != NULL )
        printf( "ðÒÏÅËÃÉÑ \"%s\"\n", poDataset->GetProjectionRef() );

    if( poDataset->GetGeoTransform( adfGeoTransform ) == CE_None )
    {
        printf( "îÁÞÁÌÏ ËÏÏÒÄÉÎÁÔ (%.6f,%.6f)\n",
                adfGeoTransform[0], adfGeoTransform[3] );

        printf( "òÁÚÍÅÒ ÐÉËÓÅÌÁ (%.6f,%.6f)\n",
                adfGeoTransform[1], adfGeoTransform[5] );
    }

îÁ ÑÚÙËÅ C:

    GDALDriverH   hDriver;
    double        adfGeoTransform[6];

    hDriver = GDALGetDatasetDriver( hDataset );
    printf( "äÒÁÊ×ÅÒ: %s/%s\n",
            GDALGetDriverShortName( hDriver ),
            GDALGetDriverLongName( hDriver ) );

    printf( "òÁÚÍÅÒ %dx%dx%d\n",
            GDALGetRasterXSize( hDataset ), 
            GDALGetRasterYSize( hDataset ),
            GDALGetRasterCount( hDataset ) );

    if( GDALGetProjectionRef( hDataset ) != NULL )
        printf( "ðÒÏÅËÃÉÑ \"%s\"\n", GDALGetProjectionRef( hDataset ) );

    if( GDALGetGeoTransform( hDataset, adfGeoTransform ) == CE_None )
    {
        printf( "îÁÞÁÌÏ ËÏÏÒÄÉÎÁÔ (%.6f,%.6f)\n",
                adfGeoTransform[0], adfGeoTransform[3] );

        printf( "òÁÚÍÅÒ ÐÉËÓÅÌÁ (%.6f,%.6f)\n",
                adfGeoTransform[1], adfGeoTransform[5] );
    }

îÁ ÑÚÙËÅ Python:

    print 'äÒÁÊ×ÅÒ: ', dataset.GetDriver().ShortName,'/', \
          dataset.GetDriver().LongName
    print 'òÁÚÍÅÒ ',dataset.RasterXSize,'x',dataset.RasterYSize, \
          'x',dataset.RasterCount
    print 'ðÒÏÅËÃÉÑ ',dataset.GetProjection()
    
    geotransform = dataset.GetGeoTransform()
    if not geotransform is None:
        print 'îÁÞÁÌÏ ËÏÏÒÄÉÎÁÔ (',geotransform[0], ',',geotransform[3],')'
        print 'òÁÚÍÅÒ ÐÉËÓÅÌÁ = (',geotransform[1], ',',geotransform[5],')'

þÔÅÎÉÅ ÒÁÓÔÒÏ×ÏÇÏ ËÁÎÁÌÁ

ïÄÎÉÍ ÉÚ ÓÐÏÓÏÂÏ× ÞÔÅÎÉÑ ÒÁÓÔÒÏ×ÙÈ ÄÁÎÎÙÈ Ó ÐÏÍÏÝØÀ GDAL Ñ×ÌÑÅÔÓÑ ÐÏËÁÎÁÌØÎÙÊ ÄÏÓÔÕÐ. ðÒÉ ÜÔÏÍ ÐÒÉ ÐÏÓÌÅÄÏ×ÁÔÅÌØÎÏÍ ÞÔÅÎÉÉ ËÁÎÁÌÏ× ÄÏÓÔÕÐÎÙ ÍÅÔÁÄÁÎÎÙÅ, ÐÁÒÁÍÅÔÒÙ ÂÌÏËÏ×, Á ÔÁËÖÅ ÒÁÚÌÉÞÎÁÑ ÄÒÕÇÁÑ ÉÎÆÏÒÍÁÃÉÑ. äÁÌÅÅ ÐÒÉ×ÅÄÅÎÙ ÐÒÉÍÅÒÙ ËÏÄÁ, ÉÚ×ÌÅËÁÀÝÅÇÏ ÏÂßÅËÔ GDALRasterBand ÉÚ ÎÁÂÏÒÁ ÄÁÎÎÙÈ (ËÁÎÁÌÙ ÎÕÍÅÒÕÀÔÓÑ ÏÔ 1 É ÄÏ GetRasterCount()) É ×Ù×ÏÄÑÝÅÇÏ ÎÅËÏÔÏÒÕÀ ÉÎÆÏÒÍÁÃÉÀ Ï ËÁÎÁÌÅ.

îÁ ÑÚÙËÅ C++:

        GDALRasterBand  *poBand;
        int             nBlockXSize, nBlockYSize;
        int             bGotMin, bGotMax;
        double          adfMinMax[2];
        
        poBand = poDataset->GetRasterBand( 1 );
        poBand->GetBlockSize( &nBlockXSize, &nBlockYSize );
        printf( "òÁÚÍÅÒ ÂÌÏËÁ %dx%d, ÔÉÐ ÄÁÎÎÙÈ %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( "ëÁÎÁÌ ÓÏÄÅÒÖÉÔ %d ÏÂÚÏÒÎÙÈ ÉÚÏÂÒÁÖÅÎÉÊ.\n",
                    poBand->GetOverviewCount() );

        if( poBand->GetColorTable() != NULL )
            printf( "ëÁÎÁÌ ÓÏÄÅÒÖÉÔ ÔÁÂÌÉÃÕ Ã×ÅÔÏ× Ó %d ÚÁÐÉÓÑÍÉ.\n", 
                     poBand->GetColorTable()->GetColorEntryCount() );

In C:

        GDALRasterBandH hBand;
        int             nBlockXSize, nBlockYSize;
        int             bGotMin, bGotMax;
        double          adfMinMax[2];
        
        hBand = GDALGetRasterBand( hDataset, 1 );
        GDALGetBlockSize( hBand, &nBlockXSize, &nBlockYSize );
        printf( "òÁÚÍÅÒ ÂÌÏËÁ %dx%d, ÔÉÐ ÄÁÎÎÙÈ %s, ColorInterp=%s\n",
                nBlockXSize, nBlockYSize,
                GDALGetDataTypeName(GDALGetRasterDataType(hBand)),
                GDALGetColorInterpretationName(
                    GDALGetRasterColorInterpretation(hBand)) );

        adfMinMax[0] = GDALGetRasterMinimum( hBand, &bGotMin );
        adfMinMax[1] = GDALGetRasterMaximum( hBand, &bGotMax );
        if( ! (bGotMin && bGotMax) )
            GDALComputeRasterMinMax( hBand, TRUE, adfMinMax );

        printf( "Min=%.3fd, Max=%.3f\n", adfMinMax[0], adfMinMax[1] );
        
        if( GDALGetOverviewCount(hBand) > 0 )
            printf( "ëÁÎÁÌ ÓÏÄÅÒÖÉÔ %d ÏÂÚÏÒÎÙÈ ÉÚÏÂÒÁÖÅÎÉÊ.\n",
                    GDALGetOverviewCount(hBand));

        if( GDALGetRasterColorTable( hBand ) != NULL )
            printf( "ëÁÎÁÌ ÓÏÄÅÒÖÉÔ ÔÁÂÌÉÃÕ Ã×ÅÔÏ× Ó %d ÚÁÐÉÓÑÍÉ.\n", 
                     GDALGetColorEntryCount(
                         GDALGetRasterColorTable( hBand ) ) );

îÁ ÑÚÙËÅ Python:

        band = dataset.GetRasterBand(1)

        print 'ôÉÐ ÄÁÎÎÙÈ',gdal.GetDataTypeName(band.DataType)

        min = band.GetMinimum()
        max = band.GetMaximum()
        if min is not None and max is not None:
            (min,max) = ComputeRasterMinMax(1)
        print 'Min=%.3f, Max=%.3f' % (min,max)

        if band.GetOverviewCount() > 0:
            print 'ëÁÎÁÌ ÓÏÄÅÒÖÉÔ ', band.GetOverviewCount(), \
            ' ÏÂÚÏÒÎÙÈ ÉÚÏÂÒÁÖÅÎÉÊ.'

        if not band.GetRasterColorTable() is None:
            print 'ëÁÎÁÌ ÓÏÄÅÒÖÉÔ ÔÁÂÌÉÃÕ Ã×ÅÔÏ× Ó ', \
            band.GetRasterColorTable().GetCount(), ' ÚÁÐÉÓÑÍÉ.'

þÔÅÎÉÅ ÒÁÓÔÒÏ×ÙÈ ÄÁÎÎÙÈ

óÕÝÅÓÔ×ÕÅÔ ÎÅÓËÏÌØËÏ ÓÐÏÓÏÂÏ× ÞÔÅÎÉÑ ÒÁÓÔÒÏ×ÙÈ ÄÁÎÎÙÈ, ÏÄÎÁËÏ ÎÁÉÂÏÌÅÅ ÏÂÝÉÍ Ñ×ÌÑÅÔÓÑ ÉÓÐÏÌØÚÏ×ÁÎÉÅ ÍÅÔÏÄ GDALRasterBand::RasterIO(). üÔÏÔ ÍÅÔÏÄ Á×ÔÏÍÁÔÉÞÅÓËÉ ÐÒÏÉÚ×ÏÄÉÔ ËÏÎ×ÅÒÔÁÃÉÀ ÔÉÐÏ× ÄÁÎÎÙÈ, ÍÁÓÛÔÁÂÉÒÏ×ÁÎÉÅ É ×ÙÒÅÚËÕ ÏÂÌÁÓÔÉ ÉÎÔÅÒÅÓÁ. óÌÅÄÕÀÝÉÊ ËÏÄ ÞÉÔÁÅÔ ÐÅÒ×ÕÀ ÓÔÒÏËÕ ÄÁÎÎÙÈ × ÂÕÆÅÒ ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÅÇÏ ÒÁÚÍÅÒÁ, ÐÒÅÏÂÒÁÚÏ×Ù×ÁÑ ÉÈ ÐÒÉ ÜÔÏÍ × ×ÅÝÅÓÔ×ÅÎÎÙÊ ÔÉÐ ÏÄÉÎÁÒÎÏÊ ÔÏÞÎÏÓÔÉ.

îÁ ÑÚÙËÅ C++:

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

îÁ ÑÚÙËÅ C:

        float *pafScanline;
        int   nXSize = GDALGetRasterBandXSize( hBand );

        pafScanline = (float *) CPLMalloc(sizeof(float)*nXSize);
        GDALRasterIO( hBand, GF_Read, 0, 0, nXSize, 1, 
                      pafScanline, nXSize, 1, GDT_Float32, 
                      0, 0 );

îÁ ÑÚÙËÅ Python:

        scanline = band.ReadRaster( 0, 0, band.XSize, 1, \
                                     band.XSize, 1, GDT_Float32 )

úÄÅÓØ ×ÏÚ×ÒÁÝÁÅÍÁÑ ÓÔÒÏËÁ ÉÍÅÅÔ ÔÉÐ string, É ÓÏÄÅÒÖÉÔ xsize*4 ÂÁÊÔ ×ÅÝÅÓÔ×ÅÎÎÙÈ ÄÁÎÎÙÈ. üÔÁ ÓÔÒÏËÁ ÍÏÖÅÔ ÂÙÔØ ÐÒÅÏÂÒÁÚÏ×ÁÎÁ × ÂÁÚÏ×ÙÅ ÔÉÐÙ ÑÚÙËÁ Python Ó ÐÏÍÏÝØÀ ÍÏÄÕÌÑ struct ÉÚ ÓÔÁÎÄÁÒÔÎÏÊ ÂÉÂÌÉÏÔÅËÉ:

        import struct

        tuple_of_floats = struct.unpack('f' * b2.XSize, scanline)

÷ÙÚÏ× ÆÕÎËÃÉÉ The RasterIO ÐÒÏÉÚ×ÏÄÉÔÓÑ ÓÏ ÓÌÅÄÕÀÝÉÍÉ ÁÒÇÕÍÅÎÔÁÍÉ:

CPLErr GDALRasterBand::RasterIO( GDALRWFlag eRWFlag,
                                 int nXOff, int nYOff, int nXSize, int nYSize,
                                 void * pData, int nBufXSize, int nBufYSize,
                                 GDALDataType eBufType,
                                 int nPixelSpace,
                                 int nLineSpace )

úÁÍÅÔÉÍ, ÞÔÏ ÏÄÉÎ É ÔÏÔ ÖÅ ×ÙÚÏ× RasterIO() ÐÒÉÍÅÎÑÅÔÓÑ ËÁË ÄÌÑ ÞÔÅÎÉÑ, ÔÁË É ÄÌÑ ÚÁÐÉÓÉ, × ÚÁ×ÉÓÉÍÏÓÔÉ ÏÔ ÚÎÁÞÅÎÉÑ ÆÌÁÇÁ eRWFlag (GF_Read ÉÌÉ GF_Write). áÒÇÕÍÅÎÔÙ nXOff, nYOff, nXSize, nYSize ÏÐÉÓÙ×ÁÀÔ ÏËÎÏ ÒÁÓÔÒÁ ÄÌÑ ÞÔÅÎÉÑ (ÉÌÉ ÚÁÐÉÓÉ). üÔÏ ÏËÎÏ ÎÅÏÂÑÚÁÔÅÌØÎÏ ÄÏÌÖÎÏ ÓÏ×ÐÁÄÁÔØ Ó ÇÒÁÎÉÃÁÍÉ ÓÍÅÖÎÙÈ ÂÌÏËÏ×, ÏÄÎÁËÏ ÓÞÉÔÙ×ÁÎÉÅ ÍÏÖÅÔ ÂÙÔØ ÂÏÌÅÅ ÜÆÆÅËÔÉ×ÎÙÍ, ÅÓÌÉ ÇÒÁÎÉÃÙ ÓÏ×ÐÁÄÁÀÔ.

pData --- ÜÔÏ ÕËÁÚÁÔÅÌØ ÎÁ ÂÕÆÅÒ × ÐÁÍÑÔÉ, ËÕÄÁ ÄÏÌÖÎÙ ÂÙÔØ ÐÒÏÞÉÔÁÎÙ (ÉÌÉ ÏÔËÕÄÁ ÚÁÐÉÓÁÎÙ) ÄÁÎÎÙÅ. æÁËÔÉÞÅÓËÉÊ ÔÉÐ ÜÔÏÇÏ ÂÕÆÅÒÁ ÄÏÌÖÅÎ ÓÏ×ÐÁÄÁÔØ Ó ÔÉÐÏÍ, ÐÅÒÅÄÁ×ÁÅÍÙÍ × ÐÁÒÁÍÅÔÒÅ eBufType, ÎÁÐÒÉÍÅÒ, GDT_Float32 ÉÌÉ GDT_Byte. æÕÎËÃÉÑ RasterIO() ×ÏÚØÍ£Ô ÎÁ ÓÅÂÑ ÐÒÅÏÂÒÁÚÏ×ÁÎÉÅ ÍÅÖÄÕ ÔÉÐÏÍ ÄÁÎÎÙÈ ÂÕÆÅÒÁ É ÔÉÐÏÍ ÄÁÎÎÙÈ ËÁÎÁÌÁ. ïÂÒÁÔÉÔÅ ×ÎÉÍÁÎÉÅ, ÞÔÏ ÐÒÉ ÐÒÅÏÂÒÁÚÏ×ÁÎÉÉ ×ÅÝÅÓÔ×ÅÎÎÙÈ ÄÁÎÎÙÈ × ÃÅÌÙÅ RasterIO() ÏËÒÕÇÌÑÅÔ × ÍÅÎØÛÕÀ ÓÔÏÒÏÎÕ, Á ÅÓÌÉ ÚÎÁÞÅÎÉÅ ×ÙÈÏÄÉÔ ÚÁ ÒÁÍËÉ ÄÏÐÕÓÔÉÍÏÇÏ ÄÉÁÐÁÚÏÎÁ, ÏÎÏ ÐÒÅÏÂÒÁÚÕÅÔÓÑ × ÂÌÉÖÁÊÛÅÅ ÄÏÐÕÓÔÉÍÏÅ ÚÎÁÞÅÎÉÅ. üÔÏ, ÎÁÐÒÉÍÅÒ, ÏÚÎÁÞÁÅÔ, ÞÔÏ ÐÒÉ ÞÔÅÎÉÉ 16-ÂÉÔÎÙÈ ÄÁÎÎÙÈ × ÂÕÆÅÒ ÔÉÐÁ GDT_Byte ×ÓÅ ÚÎÁÞÅÎÉÑ, ÐÒÅ×ÙÛÁÀÝÉÅ 255 ÂÕÄÕÔ ÏÔÏÂÒÁÖÅÎÙ × ÚÎÁÞÅÎÉÅ 255, ÍÁÓÛÔÁÂÉÒÏ×ÁÎÉÑ ÄÁÎÎÙÈ ÎÅ ÐÒÏÉÚÏÊÄ£Ô!

ðÁÒÁÍÅÔÒÙ nBufXSize É nBufYSize ÚÁÄÁÀÔ ÒÁÚÍÅÒ ÂÕÆÅÒÁ. ðÒÉ ÚÁÇÒÕÚËÅ ÄÁÎÎÙÈ × ÐÏÌÎÏÍ ÒÁÚÒÅÛÅÎÉÉ ÏÎ ÂÕÄÅÔ ÓÏ×ÐÁÄÁÔØ Ó ÒÁÚÍÅÒÏÍ ÏËÎÁ. ïÄÎÁËÏ ÄÌÑ ÚÁÇÒÕÚËÉ ÕÍÅÎØÛÅÎÎÏÇÏ ÏÂÚÏÒÎÏÇÏ ÉÚÏÂÒÁÖÅÎÉÑ ÒÁÚÍÅÒ ÂÕÆÅÒÁ ÍÏÖÎÏ ÕÓÔÁÎÏ×ÉÔØ ÍÅÎØÛÉÍ, ÞÅÍ ÒÁÚÍÅÒ ÏËÎÁ. ÷ ÜÔÏÍ ÓÌÕÞÁÅ RasterIO() ÂÕÄÅÔ ÉÓÐÏÌØÚÏ×ÁÔØ ÐÏÄÈÏÄÑÝÉÅ ÏÂÚÏÒÎÙÅ ÉÚÏÂÒÁÖÅÎÉÑ (ÐÉÒÁÍÉÄÕ) ÄÌÑ ÂÏÌÅÅ ÜÆÆÅËÔÉ×ÎÏÇÏ ××ÏÄÁ/×Ù×ÏÄÁ.

ðÁÒÁÍÅÔÒÙ nPixelSpace É nLineSpace ÏÂÙÞÎÏ ÒÁ×ÎÙ ÎÕÌÀ, ÞÔÏ ÐÒÉ×ÏÄÉÔ Ë ÉÓÐÏÌØÚÏ×ÁÎÉÀ ÚÎÁÞÅÎÉÊ ÐÏ ÕÍÏÌÞÁÎÉÀ. ïÄÎÁËÏ ÏÎÉ ÍÏÇÕÔ ÂÙÔØ ÉÓÐÏÌØÚÏ×ÁÎÙ ÄÌÑ ÕÐÒÁ×ÌÅÎÉÑ ÄÏÓÔÕÐÏÍ Ë ÂÕÆÅÒÕ ÄÁÎÎÙÈ, ÄÁ×ÁÑ ×ÏÚÍÏÖÎÏÓÔØ ÞÉÔÁÔØ × ÂÕÆÅÒ, ËÏÔÏÒÙÊ ÕÖÅ ÓÏÄÅÒÖÉÔ ÄÒÕÇÉÅ ÄÁÎÎÙÅ, ÞÅÒÅÄÕÑ ÐÉËÓÅÌÉ ÉÌÉ ÓÔÒÏËÉ.

úÁËÒÙÔÉÅ ÎÁÂÏÒÁ ÄÁÎÎÙÈ

ðÏÖÁÌÕÊÓÔÁ, ÐÏÓÔÏÑÎÎÏ ÐÏÍÎÉÔÅ, ÞÔÏ ÏÂßÅËÔÙ GDALRasterBand ÐÒÉÎÁÄÌÅÖÁÔ Ë Ó×ÏÅÍÕ ÎÁÂÏÒÕ ÄÁÎÎÙÈ É ÏÎÉ ÎÉËÏÇÄÁ ÎÅ ÄÏÌÖÎÙ ÕÄÁÌÑÔØÓÑ Ó ÐÏÍÏÝØÀ ÏÐÅÒÁÔÏÒÁ delete ÑÚÙËÁ C++. îÁÂÏÒÙ ÄÁÎÎÙÈ GDALDataset ÍÏÇÕÔ ÂÙÔØ ÚÁËÒÙÔÙ ÌÉÂÏ Ó ÐÏÍÏÝØÀ ×ÙÚÏ×Á ÆÕÎËÃÉÉ GDALClose(), ÌÉÂÏ Ó ÉÓÐÏÌØÚÏ×ÁÎÉÅÍ ÏÐÅÒÁÔÏÒÁ delete ÄÌÑ ÏÂßÅËÔÁ GDALDataset. ìÀÂÏÊ ×ÁÒÉÁÎÔ ÐÒÉ×ÅÄ£Ô Ë ËÏÒÒÅËÔÎÏÍÕ ÏÓ×ÏÂÏÖÄÅÎÉÀ ÐÁÍÑÔÉ É ÓÂÒÏÓÕ ÎÁ ÄÉÓË ×ÓÅÈ ÎÅÚÁÐÉÓÁÎÎÙÈ ÄÁÎÎÙÈ.

óÐÏÓÏÂÙ ÓÏÚÄÁÎÉÑ ÆÁÊÌÏ×

îÏ×ÙÅ ÆÁÊÌÙ × ÆÏÒÍÁÔÁÈ, ÐÏÄÄÅÒÖÉ×ÁÅÍÙÈ GDAL, ÍÏÇÕÔ ÂÙÔØ ÓÏÚÄÁÎÙ × ÔÏÍ ÓÌÕÞÁÅ, ÅÓÌÉ ÄÒÁÊ×ÅÒ ÆÏÒÍÁÔÁ ÐÏÄÄÅÒÖÉ×ÁÅÔ ÓÏÚÄÁÎÉÅ. óÕÝÅÓÔ×ÕÅÔ Ä×Á ÏÓÎÏ×ÎÙÈ ÓÐÏÓÏÂÁ ÓÏÚÄÁÔØ ÆÁÊÌ: CreateCopy() É Create().

óÐÏÓÏ CreateCopy ÐÒÅÄÐÏÌÁÇÁÅÔ ×ÙÚÏ× ÆÕÎËÃÉÉ CreateCopy() Ó ÕËÁÚÁÎÉÅÍ ÔÒÅÂÕÅÍÏÇÏ ÄÒÁÊ×ÅÒÁ ×ÙÈÏÄÎÏÇÏ ÆÏÒÍÁÔÁ É ÐÅÒÅÄÁÞÅÊ ÉÓÈÏÄÎÏÇÏ ÎÁÂÏÒÁ ÄÁÎÎÙÈ, ËÏÐÉÑ ËÏÔÏÒÏÇÏ ÄÏÌÖÎÁ ÂÙÔØ ÓÏÚÄÁÎÁ. óÐÏÓÏ Create ÐÒÅÄÐÏÌÁÇÁÅÔ ×ÙÚÏ× ÍÅÔÏÄÁ Create() Ó ÕËÁÚÁÎÉÅÍ ÎÅÏÂÈÏÄÉÍÏÇÏ ÄÒÁÊ×ÅÒÁ, Á ÚÁÔÅÍ ÎÅÐÏÓÒÅÄÓÔ×ÅÎÎÏÊ ÚÁÐÉÓØÀ ×ÓÅÈ ÍÅÔÁÄÁÎÎÙÈ É ÉÚÏÂÒÁÖÅÎÉÑ ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÉÍÉ ÏÔÄÅÌØÎÙÍÉ ×ÙÚÏ×ÁÍÉ. ÷ÓÅ ÄÒÁÊ×ÅÒÙ, ËÏÔÏÒÙÅ ÍÏÇÕÔ ÓÏÚÄÁ×ÁÔØ ÎÏ×ÙÅ ÆÁÊÌÙ, ÐÏÄÄÅÒÖÉ×ÁÀÔ ÍÅÔÏÄ CreateCopy(), ÏÄÎÁËÏ ÎÅ ×ÓÅ ÐÏÄÄÅÒÖÉ×ÁÀÔ ÍÅÔÏÄ Create().

äÌÑ ÔÏÇÏ, ÞÔÏÂÙ ÏÐÒÅÄÅÌÉÔØ, ËÁËÏÊ ÍÅÔÏÄ ÐÏÄÄÅÒÖÉ×ÁÅÔ ËÏÎËÒÅÔÎÙÊ ÄÒÁÊ×ÅÒ, ÍÏÖÎÏ ÐÒÏ×ÅÒÉÔØ ÍÅÔÁÄÁÎÎÙÅ DCAP_CREATE É DCAP_CREATECOPY Õ ÏÂßÅËÔÁ ÄÒÁÊ×ÅÒÁ. õÂÅÄÉÔÅÓØ, ÞÔÏ ÆÕÎËÃÉÑ GDALAllRegister() ÂÙÌÁ ×ÙÚ×ÁÎÁ ÐÒÅÖÄÅ, ÞÅÍ ×ÙÚÙ×ÁÔØ ÆÕÎËÃÉÀ GetDriverByName(). îÁ ÐÒÉÍÅÒÅ:

îÁ ÑÚÙËÅ C++:

#include "cpl_string.h"
...
    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( "äÒÁÊ×ÅÒ %s ÐÏÄÄÅÒÖÉ×ÁÅÔ ÍÅÔÏÄ Create().\n", pszFormat );
    if( CSLFetchBoolean( papszMetadata, GDAL_DCAP_CREATECOPY, FALSE ) )
        printf( "äÒÁÊ×ÅÒ %s ÐÏÄÄÅÒÖÉ×ÁÅÔ ÍÅÔÏÄ CreateCopy().\n", pszFormat );

îÁ ÑÚÙËÅ C:

#include "cpl_string.h"
...
    const char *pszFormat = "GTiff";
    GDALDriver hDriver = GDALGetDriverByName( pszFormat );
    char **papszMetadata;

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

    papszMetadata = GDALGetMetadata( hDriver, NULL );
    if( CSLFetchBoolean( papszMetadata, GDAL_DCAP_CREATE, FALSE ) )
        printf( "äÒÁÊ×ÅÒ %s ÐÏÄÄÅÒÖÉ×ÁÅÔ ÍÅÔÏÄ Create().\n", pszFormat );
    if( CSLFetchBoolean( papszMetadata, GDAL_DCAP_CREATECOPY, FALSE ) )
        printf( "äÒÁÊ×ÅÒ %s ÐÏÄÄÅÒÖÉ×ÁÅÔ ÍÅÔÏÄ CreateCopy().\n", pszFormat );

îÁ ÑÚÙËÅ Python:

    format = "GTiff"
    driver = gdal.GetDriverByName( format )
    metadata = driver.GetMetadata()
    if metadata.has_key(gdal.DCAP_CREATE) \
       and metadata[gdal.DCAP_CREATE] == 'YES':
        print 'äÒÁÊ×ÅÒ %s ÐÏÄÄÅÒÖÉ×ÁÅÔ ÍÅÔÏÄ Create().' % format
    if metadata.has_key(gdal.DCAP_CREATECOPY) \
       and metadata[gdal.DCAP_CREATECOPY] == 'YES':
        print 'äÒÁÊ×ÅÒ %s ÐÏÄÄÅÒÖÉ×ÁÅÔ ÍÅÔÏÄ CreateCopy().' % format

úÁÍÅÔÉÍ, ÞÔÏ ÎÅËÏÔÏÒÙÅ ÄÒÁÊ×ÅÒÙ ÍÏÇÕÔ ÔÏÌØËÏ ÞÉÔÁÔØ ÄÁÎÎÙÅ É ÎÅ ÐÏÄÄÅÒÖÉ×ÁÀÔ ÎÉ ÍÅÔÏÄ Create(), ÎÉ CreateCopy().

éÓÐÏÌØÚÏ×ÁÎÉÅ ÍÅÔÏÄÁ CreateCopy()

éÓÐÏÌØÚÏ×ÁÎÉÅ ÍÅÔÏÄÁ GDALDriver::CreateCopy() ÔÒÉ×ÉÁÌØÎÏ, ÐÏÓËÏÌØËÕ ÂÏÌØÛÁÑ ÞÁÓÔØ ÉÎÆÏÒÍÁÃÉÉ ÞÉÔÁÅÔÓÑ ÉÚ ×ÈÏÄÎÏÇÏ ÎÁÂÏÒÁ ÄÁÎÎÙÈ. ôÅÍ ÎÅ ÍÅÎÅÅ, íÅÔÏÄ ÐÏÚ×ÏÌÑÅÔ ÐÅÒÅÄÁ×ÁÔØ ÐÁÒÁÍÅÔÒÙ, ÓÐÅÃÉÆÉÞÎÙÅ ÄÌÑ ÓÏÚÄÁ×ÁÅÍÏÇÏ ×ÙÈÏÄÎÏÇÏ ÆÏÒÍÁÔÁ, Á ÔÁËÖÅ ÉÍÅÅÔ ×ÏÚÍÏÖÎÏÓÔØ ÏÔÏÂÒÁÖÁÔØ ÈÏÄ ÐÒÏÃÅÓÓÁ ËÏÐÉÒÏ×ÁÎÉÑ ÐÏÌØÚÏ×ÁÔÅÌÀ. ðÒÏÓÔÅÊÛÁÑ ÏÐÅÒÁÃÉÑ ËÏÐÉÒÏ×ÁÎÉÑ ÉÚ ÆÁÊÌÁ Ó ÉÍÅÎÅÍ pszSrcFilename × ÎÏ×ÙÊ ÆÁÊÌ pszDstFilename Ó ÐÁÒÁÍÅÔÒÁÍÉ ÐÏ ÕÍÏÌÞÁÎÉÀ É × ÆÏÒÍÁÔÅ, ÄÒÁÊ×ÅÒ ËÏÔÏÒÏÇÏ ÂÙÌ ÐÒÅÄ×ÁÒÉÔÅÌØÎÏ ×ÙÂÒÁÎ, ÍÏÖÅÔ ×ÙÇÌÑÄÅÔØ ÓÌÅÄÕÀÝÉÍ ÏÂÒÁÚÏÍ:

îÁ ÑÚÙËÅ C++:

    GDALDataset *poSrcDS = 
       (GDALDataset *) GDALOpen( pszSrcFilename, GA_ReadOnly );
    GDALDataset *poDstDS;

    poDstDS = poDriver->CreateCopy( pszDstFilename, poSrcDS, FALSE, 
                                    NULL, NULL, NULL );
    if( poDstDS != NULL )
        delete poDstDS;

îÁ ÑÚÙËÅ C:

    GDALDatasetH hSrcDS = GDALOpen( pszSrcFilename, GA_ReadOnly );
    GDALDatasetH hDstDS;

    hDstDS = GDALCreateCopy( hDriver, pszDstFilename, hSrcDS, FALSE, 
                             NULL, NULL, NULL );
    if( hDstDS != NULL )
        GDALClose( hDstDS );

îÁ ÑÚÙËÅ Python:

    src_ds = gdal.Open( src_filename )
    dst_ds = driver.CreateCopy( dst_filename, src_ds, 0 )

úÁÍÅÔÉÍ, ÞÔÏ ÍÅÔÏÄ CreateCopy() ×ÏÚ×ÒÁÝÁÅÔ ÎÁÂÏÒ ÄÁÎÎÙÈ, ÐÒÉÇÏÄÎÙÊ ÄÌÑ ÚÁÐÉÓÉ É ÏÎ ÄÏÌÖÅÎ ÂÙÔØ ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÉÍ ÏÂÒÁÚÏÍ ÚÁËÒÙÔ ÄÌÑ ÚÁ×ÅÒÛÅÎÉÑ ÚÁÐÉÓÉ É ÓÂÒÏÓÁ ÄÁÎÎÙÈ ÎÁ ÄÉÓË. ÷ ÓÌÕÞÁÅ ÑÚÙËÁ Python ÜÔÏ ÐÒÏÉÚÏÊÄ£Ô Á×ÔÏÍÁÔÉÞÅÓËÉ, ËÏÇÄÁ "dst_ds" ×ÙÊÄÅÔ ÉÚ ÏÂÌÁÓÔÉ ×ÉÄÉÍÏÓÔÉ. úÎÁÞÅÎÉÅ FALSE (ÉÌÉ 0), ÉÓÐÏÌØÚÕÅÍÏÅ ÄÌÑ ÐÁÒÁÍÅÔÒÁ bStrict, ÓÌÅÄÕÀÝÅÇÏ ÓÒÁÚÕ ÚÁ ÉÍÅÎÅÍ ×ÙÈÏÄÎÏÇÏ ÎÁÂÏÒÁ ÄÁÎÎÙÈ × ×ÙÚÏ×Å CreateCopy(), ÐÏËÁÚÙ×ÁÅÔ, ÞÔÏ CreateCopy() ÄÏÌÖÅÎ ÚÁ×ÅÒÛÉÔØÓÑ ÂÅÚ ÆÁÔÁÌØÎÏÊ ÏÛÉÂËÉ ÄÁÖÅ × ÓÌÕÞÁÅ, ÅÓÌÉ ÓÏÚÄÁ×ÁÅÍÙÊ ÎÁÂÏÒ ÄÁÎÎÙÈ ÎÅ ÍÏÖÅÔ ÂÙÔØ ÉÄÅÎÔÉÞÅÎ ×ÈÏÄÎÏÍÕ ÎÁÂÏÒÕ. ôÁËÏÅ ÍÏÖÅÔ ÐÒÏÉÚÏÊÔÉ, ÎÁÐÒÉÍÅÒ, ÐÏÓËÏÌØËÕ ×ÙÈÏÄÎÏÊ ÆÏÒÍÁÔ ÎÅ ÐÏÄÄÅÒÖÉ×ÁÅÔ ÔÉÐ ÄÁÎÎÙÈ ×ÈÏÄÎÏÇÏ ÆÏÒÍÁÔÁ, ÉÌÉ ÐÏÔÏÍÕ, ÞÔÏ ×ÙÈÏÄÎÏÊ ÆÏÒÍÁÔ ÎÅ ÐÏÄÄÅÒÖÉ×ÁÅÔ ÇÅÏÇÒÁÆÉÞÅÓËÕÀ ÐÒÉ×ÑÚËÕ.

âÏÌÅÅ ÓÌÏÖÎÙÊ ÓÌÕÞÁÊ ÍÏÖÅÔ ×ËÌÀÞÁÔØ ÕËÁÚÁÎÉÅ ÐÁÒÁÍÅÔÒÏ× ÄÌÑ ÓÏÚÄÁÎÉÑ ×ÙÈÏÄÎÏÇÏ ÆÁÊÌÁ É ÉÓÐÏÌØÚÏ×ÁÎÉÅ ÉÎÄÉËÁÔÏÒÁ ÈÏÄÁ ÒÁÂÏÔÙ:

îÁ ÑÚÙËÅ C++:

#include "cpl_string.h"
...
    const char **papszOptions = NULL;
    
    papszOptions = CSLSetNameValue( papszOptions, "TILED", "YES" );
    papszOptions = CSLSetNameValue( papszOptions, "COMPRESS", "PACKBITS" );
    poDstDS = poDriver->CreateCopy( pszDstFilename, poSrcDS, FALSE, 
                                    papzOptions, GDALTermProgress, NULL );
    if( poDstDS != NULL )
        delete poDstDS;

îÁ ÑÚÙËÅ C:

#include "cpl_string.h"
...
    const char **papszOptions = NULL;
    
    papszOptions = CSLSetNameValue( papszOptions, "TILED", "YES" );
    papszOptions = CSLSetNameValue( papszOptions, "COMPRESS", "PACKBITS" );
    hDstDS = GDALCreateCopy( hDriver, pszDstFilename, hSrcDS, FALSE, 
                             papzOptions, GDALTermProgres, NULL );
    if( hDstDS != NULL )
        GDALClose( hDstDS );

îÁ ÑÚÙËÅ Python:

    src_ds = gdal.Open( src_filename )
    dst_ds = driver.CreateCopy( dst_filename, src_ds, 0, 
                                [ 'TILED=YES', 'COMPRESS=PACKBITS' ] )

éÓÐÏÌØÚÏ×ÁÎÉÅ ÍÅÔÏÄÁ Create()

÷ ÔÅÈ ÓÌÕÞÁÑÈ, ËÏÇÄÁ ×Ù ÎÅ ÐÒÏÓÔÏ ÜËÓÐÏÒÔÉÒÕÅÔÅ ÓÕÝÅÓÔ×ÕÀÝÉÊ ÆÁÊÌ × ÎÏ×ÙÊ ÆÏÒÍÁÔ, ÍÏÖÅÔ ÂÙÔØ ÎÅÏÂÈÏÄÉÍÏ ÐÒÉÍÅÎÉÔØ ÍÅÔÏÄ GDALDriver::Create() (ËÒÏÍÅ ÜÔÏÇÏ ÎÅÓËÏÌØËÏ ÉÎÔÅÒÅÓÎÙÈ ×ÁÒÉÁÎÔÏ× ×ÏÚÍÏÖÎÙ ÐÒÉ ÉÓÐÏÌØÚÏ×ÁÎÉÉ ×ÉÒÔÕÁÌØÎÙÈ ÆÁÊÌÏ× ÉÌÉ ÆÁÊÌÏ× × ÐÁÍÑÔÉ). íÅÔÏÄ Create() ÐÒÉÎÉÍÁÅÔ ÓÐÉÓÏË ÐÁÒÁÍÅÔÒÏ×, ÐÏÈÏÖÉÊ ÎÁ ÔÁËÏÊ ÖÅ ÄÌÑ CreateCopy(), ÏÄÎÁËÏ ÒÁÚÍÅÒÙ ÉÚÏÂÒÁÖÅÎÉÑ, ÞÉÓÌÏ ËÁÎÁÌÏ× É ÔÉÐ ÄÁÎÎÙÈ ÄÏÌÖÅÎ ÂÙÔØ ÚÁÄÁÎ ÎÅÐÏÓÒÅÄÓÔ×ÅÎÎÏ.

îÁ ÑÚÙËÅ C++:

    GDALDataset *poDstDS;       
    char **papszOptions = NULL;

    poDstDS = poDriver->Create( pszDstFilename, 512, 512, 1, GDT_Byte, 
                                papszOptions );

îÁ ÑÚÙËÅ C:

    GDALDatasetH hDstDS;        
    char **papszOptions = NULL;

    hDstDS = GDALCreate( hDriver, pszDstFilename, 512, 512, 1, GDT_Byte, 
                         papszOptions );

îÁ ÑÚÙËÅ Python:

    dst_ds = driver.Create( dst_filename, 512, 512, 1, gdal.GDT_Byte )

ëÁË ÔÏÌØËÏ ÎÁÂÏÒ ÄÁÎÎÙÈ ÂÕÄÅÔ ÕÓÐÅÛÎÏ ÓÏÚÄÁÎ, ×ÓÅ ÎÅÏÂÈÏÄÉÍÙÅ ÍÅÔÁÄÁÎÎÙÅ É ÓÏÂÓÔ×ÅÎÎÏ ÉÚÏÂÒÁÖÅÎÉÅ ÄÏÌÖÎÙ ÂÙÔØ ÚÁÐÉÓÁÎÙ × ÆÁÊÌ. ëÏÎËÒÅÔÎÁÑ ÒÅÁÌÉÚÁÃÉÑ ÏÞÅÎØ ÓÉÌØÎÏ ÚÁ×ÉÓÉÔ ÏÔ ÚÁÄÁÞÉ, ÎÏ × ÐÒÏÓÔÅÊÛÅÍ ÓÌÕÞÁÅ, ×ËÌÀÞÁÀÝÅÍ ÚÁÐÉÓØ ÐÒÏÅËÃÉÉ, ÇÅÏÇÒÁÆÉÞÅÓËÏÊ ÐÒÉ×ÑÚËÉ É ÒÁÓÔÒÏ×ÏÇÏ ÉÚÏÂÒÁÖÅÎÉÑ, ÍÏÖÅÔ ×ÙÇÌÑÄÅÔØ ÔÁË:

îÁ ÑÚÙËÅ C++:

    double adfGeoTransform[6] = { 444720, 30, 0, 3751320, 0, -30 };
    OGRSpatialReference oSRS;
    char *pszSRS_WKT = NULL;
    GDALRasterBand *poBand;
    GByte abyRaster[512*512];

    poDstDS->SetGeoTransform( adfGeoTransform );
    
    oSRS.SetUTM( 11, TRUE );
    oSRS.SetWellKnownGeogCS( "NAD27" );
    oSRS.exportToWkt( &pszSRS_WKT );
    poDstDS->SetProjection( pszSRS_WKT );
    CPLFree( pszSRS_WKT );

    poBand = poDstDS->GetRasterBand(1);
    poBand->RasterIO( GF_Write, 0, 0, 512, 512, 
                      abyRaster, 512, 512, GDT_Byte, 0, 0 );    

    delete poDstDS;

îÁ ÑÚÙËÅ C:

    double adfGeoTransform[6] = { 444720, 30, 0, 3751320, 0, -30 };
    OGRSpatialReferenceH hSRS;
    char *pszSRS_WKT = NULL;
    GDALRasterBandH hBand;
    GByte abyRaster[512*512];

    GDALSetGeoTransform( hDstDS, adfGeoTransform );

    hSRS = OSRNewSpatialReference( NULL );
    OSRSetUTM( hSRS, 11, TRUE );
    OSRSetWellKnownGeogCS( hSRS, "NAD27" );                     
    OSRExportToWkt( hSRS, &pszSRS_WKT );
    OSRDestroySpatialReference( hSRS );

    GDALSetProjection( hDstDS, pszSRS_WKT );
    CPLFree( pszSRS_WKT );

    hBand = GDALGetRasterBand( hDstDS, 1 );
    GDALRasterIO( hBand, GF_Write, 0, 0, 512, 512, 
                  abyRaster, 512, 512, GDT_Byte, 0, 0 );    

    GDALClose( hDstDS );

îÁ ÑÚÙËÅ Python:

    import Numeric, osr

    dst_ds.SetGeoTransform( [ 444720, 30, 0, 3751320, 0, -30 ] )
    
    srs = osr.SpatialReference()
    srs.SetUTM( 11, 1 )
    srs.SetWellKnownGeogCS( 'NAD27' )
    dst_ds.SetProjection( srs.ExportToWkt() )

    raster = Numeric.zeros( (512, 512) )    
    dst_ds.GetRasterBand(1).WriteArray( raster )

Generated for GDAL by doxygen 1.4.7.