п═я┐п╨п╬п╡п╬п╢я│я┌п╡п╬ п©п╬ п╦я│п©п╬п╩я▄п╥п╬п╡п╟п╫п╦я▌ 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(). п▓ я│п╩п╣п╢я┐я▌я┴п╣п╪ п©я─п╦п╪п╣я─п╣ п╪я▀ п╥п╟п©я─п╬я│п╦п╪ п╢я─п╟п╧п╡п╣я─ п╦ п©я─п╬п╡п╣я─п╦п╪, п©п╬п╢п╢п╣я─п╤п╦п╡п╟п╣я┌ п╩п╦ п╬п╫ п╪п╣я┌п╬п╢я▀ Create() п╦/п╦п╩п╦ CreateCopy().

п²п╟ я▐п╥я▀п╨п╣ 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";
    GDALDriverH 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"
...
    char **papszOptions = NULL;
    
    papszOptions = CSLSetNameValue( papszOptions, "TILED", "YES" );
    papszOptions = CSLSetNameValue( papszOptions, "COMPRESS", "PACKBITS" );
    poDstDS = poDriver->CreateCopy( pszDstFilename, poSrcDS, FALSE, 
                                    papszOptions, GDALTermProgress, NULL );
    if( poDstDS != NULL )
        delete poDstDS;
    CSLDestroy( papszOptions );

п²п╟ я▐п╥я▀п╨п╣ C:

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

п²п╟ я▐п╥я▀п╨п╣ 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 )

$Id: gdal_tutorial_ru.dox 14542 2008-05-27 18:11:25Z dron $


Generated for GDAL by doxygen 1.6.2-20100208.