Sophie

Sophie

distrib > Mandriva > 9.0 > i586 > by-pkgid > d67485fb8ce60f8952179bbde3b5d022 > files > 92

libgdal0-devel-1.1.7-2mdk.i586.rpm

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html><head><meta name="robots" content="noindex">
<meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
<title>C Read/Write Example: gdal_translate.c</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
</head><body bgcolor="#ffffff">
<!-- Generated by Doxygen 1.2.3-20001105 on Thu Mar 28 09:47:33 2002 -->
<center>
<a class="qindex" href="index.html">Main Page</a> &nbsp; <a class="qindex" href="hierarchy.html">Class Hierarchy</a> &nbsp; <a class="qindex" href="annotated.html">Compound List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; <a class="qindex" href="globals.html">File Members</a> &nbsp; <a class="qindex" href="pages.html">Related Pages</a> &nbsp; </center>
<hr><a name="gdal_translate.c"><h2>C Read/Write Example: gdal_translate.c</h2></a>
 <center>

<p>
</center>

<p>
This example demonstrates read one file, and writing the data to another.
<p>
<div class="fragment"><pre><font class="comment">/* ****************************************************************************</font>
<font class="comment"> * $Id: gdal_translate.c,v 1.23 2002/02/07 20:24:18 warmerda Exp $</font>
<font class="comment"> *</font>
<font class="comment"> * Project:  GDAL Utilities</font>
<font class="comment"> * Purpose:  GDAL Image Translator Program</font>
<font class="comment"> * Author:   Frank Warmerdam, warmerda@home.com</font>
<font class="comment"> *</font>
<font class="comment"> * ****************************************************************************</font>
<font class="comment"> * Copyright (c) 1998, Frank Warmerdam</font>
<font class="comment"> *</font>
<font class="comment"> * Permission is hereby granted, free of charge, to any person obtaining a</font>
<font class="comment"> * copy of this software and associated documentation files (the "Software"),</font>
<font class="comment"> * to deal in the Software without restriction, including without limitation</font>
<font class="comment"> * the rights to use, copy, modify, merge, publish, distribute, sublicense,</font>
<font class="comment"> * and/or sell copies of the Software, and to permit persons to whom the</font>
<font class="comment"> * Software is furnished to do so, subject to the following conditions:</font>
<font class="comment"> *</font>
<font class="comment"> * The above copyright notice and this permission notice shall be included</font>
<font class="comment"> * in all copies or substantial portions of the Software.</font>
<font class="comment"> *</font>
<font class="comment"> * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS</font>
<font class="comment"> * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,</font>
<font class="comment"> * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL</font>
<font class="comment"> * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER</font>
<font class="comment"> * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING</font>
<font class="comment"> * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER</font>
<font class="comment"> * DEALINGS IN THE SOFTWARE.</font>
<font class="comment"> * ****************************************************************************</font>
<font class="comment"> *</font>
<font class="comment"> * $Log: gdal_translate.c,v $</font>
<font class="comment"> * Revision 1.23  2002/02/07 20:24:18  warmerda</font>
<font class="comment"> * added -scale option</font>
<font class="comment"> *</font>
<font class="comment"> * Revision 1.22  2001/12/12 21:01:01  warmerda</font>
<font class="comment"> * fixed bug in windowing logic</font>
<font class="comment"> *</font>
<font class="comment"> * Revision 1.21  2001/09/24 15:55:11  warmerda</font>
<font class="comment"> * added cleanup percent done</font>
<font class="comment"> *</font>
<font class="comment"> * Revision 1.20  2001/08/23 03:23:46  warmerda</font>
<font class="comment"> * added the -not_strict switch</font>
<font class="comment"> *</font>
<font class="comment"> * Revision 1.19  2001/07/18 05:05:12  warmerda</font>
<font class="comment"> * added CPL_CSVID</font>
<font class="comment"> *</font>
<font class="comment"> * Revision 1.18  2001/03/21 15:00:49  warmerda</font>
<font class="comment"> * Escape % signs in printf() format.</font>
<font class="comment"> *</font>
<font class="comment"> * Revision 1.17  2001/03/20 20:20:14  warmerda</font>
<font class="comment"> * Added % handling, fixed completion, fixed adGeoTransform (Mark Salazar)</font>
<font class="comment"> *</font>
<font class="comment"> * Revision 1.16  2001/02/19 15:12:17  warmerda</font>
<font class="comment"> * fixed windowing problem with -srcwin</font>
<font class="comment"> *</font>
<font class="comment"> * Revision 1.15  2000/08/25 14:23:06  warmerda</font>
<font class="comment"> * added progress counter</font>
<font class="comment"> *</font>
<font class="comment"> * Revision 1.14  2000/06/09 21:19:30  warmerda</font>
<font class="comment"> * dump formats with usage message</font>
<font class="comment"> *</font>
<font class="comment"> * Revision 1.13  2000/04/30 23:21:47  warmerda</font>
<font class="comment"> * uses new CreateCopy when possible</font>
<font class="comment"> *</font>
<font class="comment"> * Revision 1.12  2000/03/31 13:43:42  warmerda</font>
<font class="comment"> * added source window</font>
<font class="comment"> *</font>
<font class="comment"> * Revision 1.11  2000/03/23 20:32:37  gdalanon</font>
<font class="comment"> * fix usage</font>
<font class="comment"> *</font>
<font class="comment"> * Revision 1.10  2000/03/23 18:48:19  warmerda</font>
<font class="comment"> * Added support for creation options.</font>
<font class="comment"> *</font>
<font class="comment"> * Revision 1.9  2000/03/06 02:18:42  warmerda</font>
<font class="comment"> * added -outsize option</font>
<font class="comment"> *</font>
<font class="comment"> * Revision 1.8  2000/02/18 03:52:16  warmerda</font>
<font class="comment"> * Added support for setting the output band data type, but still does</font>
<font class="comment"> * no scaling.</font>
<font class="comment"> *</font>
<font class="comment"> * Revision 1.7  1999/10/21 13:21:49  warmerda</font>
<font class="comment"> * Added report of available formats.</font>
<font class="comment"> *</font>
<font class="comment"> * Revision 1.6  1999/10/01 14:45:14  warmerda</font>
<font class="comment"> * prettied up</font>
<font class="comment"> *</font>
<font class="comment"> * Revision 1.5  1999/08/12 18:23:47  warmerda</font>
<font class="comment"> * Attempt to create the output file with the data type of the first</font>
<font class="comment"> * source band.</font>
<font class="comment"> *</font>
<font class="comment"> * Revision 1.4  1999/05/17 01:38:05  warmerda</font>
<font class="comment"> * added transfer of geotransform and proj</font>
<font class="comment"> *</font>
<font class="comment"> * Revision 1.3  1999/05/13 15:33:12  warmerda</font>
<font class="comment"> * added support for selecting a single band</font>
<font class="comment"> *</font>
<font class="comment"> * Revision 1.2  1999/04/21 04:14:05  warmerda</font>
<font class="comment"> * Fixed GDALOpen() call</font>
<font class="comment"> *</font>
<font class="comment"> * Revision 1.1  1999/03/02 21:12:25  warmerda</font>
<font class="comment"> * New</font>
<font class="comment"> */</font>

<font class="preprocessor">#include "<a class="code" href="gdal_h.html">gdal.h</a>"</font>
<font class="preprocessor">#include "<a class="code" href="cpl_vsi_h.html">cpl_vsi.h</a>"</font>
<font class="preprocessor">#include "<a class="code" href="cpl_conv_h.html">cpl_conv.h</a>"</font>
<font class="preprocessor">#include "cpl_string.h"</font>

CPL_CVSID(<font class="stringliteral">"$Id: gdal_translate.c,v 1.23 2002/02/07 20:24:18 warmerda Exp $"</font>);

<font class="keyword">static</font> <font class="keywordtype">int</font> ArgIsNumeric( <font class="keyword">const</font> <font class="keywordtype">char</font> * );

<font class="comment">/*  ******************************************************************* */</font>
<font class="comment">/*                               Usage()                                */</font>
<font class="comment">/* ******************************************************************** */</font>

<font class="keyword">static</font> <font class="keywordtype">void</font> Usage()<font class="keyword"></font>
<font class="keyword"></font>
<font class="keyword"></font>{
    <font class="keywordtype">int</font> iDr;
        
    printf( <font class="stringliteral">"Usage: gdal_translate \n"</font>
            <font class="stringliteral">"       [-ot {Byte/UInt16/UInt32/Int32/Float32/Float64/CInt16/\n"</font>
            <font class="stringliteral">"             CInt32/CFloat32/CFloat64}] [-not_strict]\n"</font>
            <font class="stringliteral">"       [-of format] [-b band] [-outsize xsize[%%] ysize[%%]]\n"</font>
            <font class="stringliteral">"       [-scale [src_min src_max [dst_min dst_max]]]"</font>
            <font class="stringliteral">"       [-srcwin xoff yoff xsize ysize] [-co \"NAME=VALUE\"]*\n"</font>
            <font class="stringliteral">"       src_dataset dst_dataset\n\n"</font> );

    printf( <font class="stringliteral">"The following format drivers are configured:\n"</font> );
    <font class="keywordflow">for</font>( iDr = 0; iDr &lt; GDALGetDriverCount(); iDr++ )
    {
        printf( <font class="stringliteral">"  %s: %s\n"</font>,
                GDALGetDriverShortName( GDALGetDriver(iDr) ),
                GDALGetDriverLongName( GDALGetDriver(iDr) ) );
    }
}

<font class="comment">/* ******************************************************************** */</font>
<font class="comment">/*                                main()                                */</font>
<font class="comment">/* ******************************************************************** */</font>

<font class="keywordtype">int</font> main( <font class="keywordtype">int</font> argc, <font class="keywordtype">char</font> ** argv )<font class="keyword"></font>
<font class="keyword"></font>
<font class="keyword"></font>{
    GDALDatasetH        hDataset, hOutDS;
    GDALRasterBandH     hBand;
    <font class="keywordtype">int</font>                 i, nSrcBand = -1;
    <font class="keywordtype">int</font>                 nRasterXSize, nRasterYSize;
    <font class="keyword">const</font> <font class="keywordtype">char</font>          *pszSource=NULL, *pszDest=NULL, *pszFormat = <font class="stringliteral">"GTiff"</font>;
    GDALDriverH         hDriver;
    <font class="keywordtype">int</font>                 *panBandList, nBandCount;
    <font class="keywordtype">double</font>              adfGeoTransform[6];
    GDALDataType        eOutputType = GDT_Unknown;
    <font class="keywordtype">int</font>                 nOXSize = 0, nOYSize = 0;
    <font class="keywordtype">char</font>                *pszOXSize=NULL, *pszOYSize=NULL;
    <font class="keywordtype">char</font>                **papszCreateOptions = NULL;
    <font class="keywordtype">int</font>                 anSrcWin[4], bStrict = TRUE;
    <font class="keyword">const</font> <font class="keywordtype">char</font>          *pszProjection;
    <font class="keywordtype">int</font>                 bScale = FALSE, bHaveScaleSrc = FALSE;
    <font class="keywordtype">double</font>              dfScaleSrcMin, dfScaleSrcMax;
    <font class="keywordtype">double</font>              dfScaleDstMin, dfScaleDstMax;

    anSrcWin[0] = 0;
    anSrcWin[1] = 0;
    anSrcWin[2] = 0;
    anSrcWin[3] = 0;

<font class="comment">/* -------------------------------------------------------------------- */</font>
<font class="comment">/*      Register standard GDAL drivers, and identify output driver.     */</font>
<font class="comment">/* -------------------------------------------------------------------- */</font>
    <a class="code" href="gdal_h.html#a57">GDALAllRegister</a>();

<font class="comment">/* -------------------------------------------------------------------- */</font>
<font class="comment">/*      Handle command line arguments.                                  */</font>
<font class="comment">/* -------------------------------------------------------------------- */</font>
    <font class="keywordflow">for</font>( i = 1; i &lt; argc; i++ )
    {
        <font class="keywordflow">if</font>( EQUAL(argv[i],<font class="stringliteral">"-of"</font>) &amp;&amp; i &lt; argc-1 )
            pszFormat = argv[++i];

        <font class="keywordflow">else</font> <font class="keywordflow">if</font>( EQUAL(argv[i],<font class="stringliteral">"-ot"</font>) &amp;&amp; i &lt; argc-1 )
        {
            <font class="keywordtype">int</font> iType;
            
            <font class="keywordflow">for</font>( iType = 1; iType &lt; GDT_TypeCount; iType++ )
            {
                <font class="keywordflow">if</font>( GDALGetDataTypeName((GDALDataType)iType) != NULL
                    &amp;&amp; EQUAL(GDALGetDataTypeName((GDALDataType)iType),
                             argv[i+1]) )
                {
                    eOutputType = (GDALDataType) iType;
                }
            }

            <font class="keywordflow">if</font>( eOutputType == GDT_Unknown )
            {
                printf( <font class="stringliteral">"Unknown output pixel type: %s\n"</font>, argv[i+1] );
                Usage();
                exit( 2 );
            }
            i++;
        }
        <font class="keywordflow">else</font> <font class="keywordflow">if</font>( EQUAL(argv[i],<font class="stringliteral">"-b"</font>) &amp;&amp; i &lt; argc-1 )
            nSrcBand = atoi(argv[++i]);
            
        <font class="keywordflow">else</font> <font class="keywordflow">if</font>( EQUAL(argv[i],<font class="stringliteral">"-not_strict"</font>)  )
            bStrict = FALSE;
            
        <font class="keywordflow">else</font> <font class="keywordflow">if</font>( EQUAL(argv[i],<font class="stringliteral">"-co"</font>) &amp;&amp; i &lt; argc-1 )
        {
            papszCreateOptions = CSLAddString( papszCreateOptions, argv[++i] );
        }   

        <font class="keywordflow">else</font> <font class="keywordflow">if</font>( EQUAL(argv[i],<font class="stringliteral">"-scale"</font>) )
        {
            bScale = TRUE;
            <font class="keywordflow">if</font>( i &lt; argc-2 &amp;&amp; ArgIsNumeric(argv[i+1]) )
            {
                bHaveScaleSrc = TRUE;
                dfScaleSrcMin = atof(argv[i+1]);
                dfScaleSrcMax = atof(argv[i+2]);
                i += 2;
            }
            <font class="keywordflow">if</font>( i &lt; argc-2 &amp;&amp; bHaveScaleSrc &amp;&amp; ArgIsNumeric(argv[i+1]) )
            {
                dfScaleDstMin = atof(argv[i+1]);
                dfScaleDstMax = atof(argv[i+2]);
                i += 2;
            }
            <font class="keywordflow">else</font>
            {
                dfScaleDstMin = 0.0;
                dfScaleDstMax = 255.999;
            }
        }   

        <font class="keywordflow">else</font> <font class="keywordflow">if</font>( EQUAL(argv[i],<font class="stringliteral">"-outsize"</font>) &amp;&amp; i &lt; argc-2 )
        {
            pszOXSize = argv[++i];
            pszOYSize = argv[++i];
        }   

        <font class="keywordflow">else</font> <font class="keywordflow">if</font>( EQUAL(argv[i],<font class="stringliteral">"-srcwin"</font>) &amp;&amp; i &lt; argc-4 )
        {
            anSrcWin[0] = atoi(argv[++i]);
            anSrcWin[1] = atoi(argv[++i]);
            anSrcWin[2] = atoi(argv[++i]);
            anSrcWin[3] = atoi(argv[++i]);
        }   

        <font class="keywordflow">else</font> <font class="keywordflow">if</font>( argv[i][0] == <font class="charliteral">'-'</font> )
        {
            printf( <font class="stringliteral">"Option %s incomplete, or not recognised.\n\n"</font>, 
                    argv[i] );
            Usage();
            exit( 2 );
        }
        <font class="keywordflow">else</font> <font class="keywordflow">if</font>( pszSource == NULL )
            pszSource = argv[i];

        <font class="keywordflow">else</font> <font class="keywordflow">if</font>( pszDest == NULL )
            pszDest = argv[i];

        <font class="keywordflow">else</font>
        {
            printf( <font class="stringliteral">"Too many command options.\n\n"</font> );
            Usage();
            exit( 2 );
        }
    }

    <font class="keywordflow">if</font>( pszDest == NULL )
    {
        Usage();
        exit( 10 );
    }

<font class="comment">/* -------------------------------------------------------------------- */</font>
<font class="comment">/*      Attempt to open source file.                                    */</font>
<font class="comment">/* -------------------------------------------------------------------- */</font>

    hDataset = <a class="code" href="gdal_h.html#a60">GDALOpen</a>( pszSource, GA_ReadOnly );
    
    <font class="keywordflow">if</font>( hDataset == NULL )
    {
        fprintf( stderr,
                 <font class="stringliteral">"GDALOpen failed - %d\n%s\n"</font>,
                 <a class="code" href="cpl_error_h.html#a20">CPLGetLastErrorNo</a>(), <a class="code" href="cpl_error_h.html#a22">CPLGetLastErrorMsg</a>() );
        exit( 1 );
    }

    nRasterXSize = GDALGetRasterXSize( hDataset );
    nRasterYSize = GDALGetRasterYSize( hDataset );
    
    printf( <font class="stringliteral">"Size is %d, %d\n"</font>, nRasterXSize, nRasterYSize );

    <font class="keywordflow">if</font>( anSrcWin[2] == 0 &amp;&amp; anSrcWin[3] == 0 )
    {
        anSrcWin[2] = nRasterXSize;
        anSrcWin[3] = nRasterYSize;
    }

<font class="comment">/* -------------------------------------------------------------------- */</font>
<font class="comment">/*      Build band list to translate                                    */</font>
<font class="comment">/* -------------------------------------------------------------------- */</font>
    <font class="keywordflow">if</font>( nSrcBand != -1 )
    {
        nBandCount = 1;
        panBandList = (<font class="keywordtype">int</font> *) <a class="code" href="cpl_conv_h.html#a3">CPLMalloc</a>(<font class="keyword">sizeof</font>(<font class="keywordtype">int</font>)*nBandCount);
        panBandList[0] = nSrcBand;
    }
    <font class="keywordflow">else</font>
    {
        nBandCount = GDALGetRasterCount( hDataset );
        panBandList = (<font class="keywordtype">int</font> *) <a class="code" href="cpl_conv_h.html#a3">CPLMalloc</a>(<font class="keyword">sizeof</font>(<font class="keywordtype">int</font>)*nBandCount);
        <font class="keywordflow">for</font>( i = 0; i &lt; nBandCount; i++ )
            panBandList[i] = i+1;
    }

<font class="comment">/* -------------------------------------------------------------------- */</font>
<font class="comment">/*      Find the output driver.                                         */</font>
<font class="comment">/* -------------------------------------------------------------------- */</font>
    hDriver = GDALGetDriverByName( pszFormat );
    <font class="keywordflow">if</font>( hDriver == NULL )
    {
        <font class="keywordtype">int</font>     iDr;
        
        printf( <font class="stringliteral">"Output driver `%s' not recognised.\n"</font>, pszFormat );
        printf( <font class="stringliteral">"The following format drivers are configured:\n"</font> );
        <font class="keywordflow">for</font>( iDr = 0; iDr &lt; GDALGetDriverCount(); iDr++ )
        {
            printf( <font class="stringliteral">"  %s: %s\n"</font>,
                    GDALGetDriverShortName( GDALGetDriver(iDr) ),
                    GDALGetDriverLongName( GDALGetDriver(iDr) ) );
        }
        printf( <font class="stringliteral">"\n"</font> );
        Usage();
        exit( 1 );
    }

<font class="comment">/* -------------------------------------------------------------------- */</font>
<font class="comment">/*      The short form is to CreateCopy().  We use this if the input    */</font>
<font class="comment">/*      matches the whole dataset.  Eventually we should rewrite        */</font>
<font class="comment">/*      this entire program to use virtual datasets to construct a      */</font>
<font class="comment">/*      virtual input source to copy from.                              */</font>
<font class="comment">/* -------------------------------------------------------------------- */</font>
    <font class="keywordflow">if</font>( eOutputType == GDT_Unknown 
        &amp;&amp; !bScale
        &amp;&amp; nBandCount == GDALGetRasterCount(hDataset)
        &amp;&amp; anSrcWin[0] == 0 &amp;&amp; anSrcWin[1] == 0 
        &amp;&amp; anSrcWin[2] == GDALGetRasterXSize(hDataset)
        &amp;&amp; anSrcWin[3] == GDALGetRasterYSize(hDataset) 
        &amp;&amp; pszOXSize == NULL &amp;&amp; pszOYSize == NULL )
    {
        
        hOutDS = GDALCreateCopy( hDriver, pszDest, hDataset, 
                                 bStrict, papszCreateOptions, 
                                 GDALTermProgress, NULL );
        <font class="keywordflow">if</font>( hOutDS != NULL )
            GDALClose( hOutDS );
        
        GDALClose( hDataset );

        exit( hOutDS == NULL );
    }

<font class="comment">/* -------------------------------------------------------------------- */</font>
<font class="comment">/*      Establish some parameters.                                      */</font>
<font class="comment">/* -------------------------------------------------------------------- */</font>
    <font class="keywordflow">if</font>( eOutputType == GDT_Unknown )
    {
        hBand = GDALGetRasterBand( hDataset, panBandList[0] );
        eOutputType = GDALGetRasterDataType(hBand);
    }

    <font class="keywordflow">if</font>( pszOXSize == NULL )
    {
        nOXSize = anSrcWin[2];
        nOYSize = anSrcWin[3];
    }
    <font class="keywordflow">else</font>
    {
        nOXSize = (pszOXSize[strlen(pszOXSize)-1]==<font class="charliteral">'%'</font> 
                   ? atof(pszOXSize)/100*anSrcWin[2] : atoi(pszOXSize));
        nOYSize = (pszOYSize[strlen(pszOYSize)-1]==<font class="charliteral">'%'</font> 
                   ? atof(pszOYSize)/100*anSrcWin[3] : atoi(pszOYSize));
    }
    
<font class="comment">/* -------------------------------------------------------------------- */</font>
<font class="comment">/*      Create the output database.                                     */</font>
<font class="comment">/* -------------------------------------------------------------------- */</font>
    GDALTermProgress( 0.0, NULL, NULL );
    hOutDS = GDALCreate( hDriver, pszDest, nOXSize, nOYSize, 
                         nBandCount, eOutputType, papszCreateOptions );
    <font class="keywordflow">if</font>( hOutDS == NULL )
    {
        printf( <font class="stringliteral">"GDALCreate() failed.\n"</font> );
        exit( 10 );
    }
    
<font class="comment">/* -------------------------------------------------------------------- */</font>
<font class="comment">/*      Copy over projection, and geotransform information.             */</font>
<font class="comment">/* -------------------------------------------------------------------- */</font>
    pszProjection = GDALGetProjectionRef( hDataset );
    <font class="keywordflow">if</font>( pszProjection != NULL &amp;&amp; strlen(pszProjection) &gt; 0 )
        GDALSetProjection( hOutDS, pszProjection );

    <font class="keywordflow">if</font>( GDALGetGeoTransform( hDataset, adfGeoTransform ) == CE_None )
    {
        adfGeoTransform[0] += anSrcWin[0] * adfGeoTransform[1]
                            + anSrcWin[1] * adfGeoTransform[2];
        adfGeoTransform[3] += anSrcWin[0] * adfGeoTransform[4]
                            + anSrcWin[1] * adfGeoTransform[5];

        adfGeoTransform[1] *= anSrcWin[2] / (<font class="keywordtype">double</font>) nOXSize;
        adfGeoTransform[2] *= anSrcWin[3] / (<font class="keywordtype">double</font>) nOYSize;
        adfGeoTransform[4] *= anSrcWin[2] / (<font class="keywordtype">double</font>) nOXSize;
        adfGeoTransform[5] *= anSrcWin[3] / (<font class="keywordtype">double</font>) nOYSize;

        GDALSetGeoTransform( hOutDS, adfGeoTransform );
    }

<font class="comment">/* -------------------------------------------------------------------- */</font>
<font class="comment">/*      Loop copying bands.                                             */</font>
<font class="comment">/* -------------------------------------------------------------------- */</font>
    <font class="keywordflow">for</font>( i = 0; i &lt; nBandCount; i++ )
    {
        GByte   *pabyBlock;
        <font class="keywordtype">int</font>     iBlockY;
        GDALRasterBandH hDstBand;
        <font class="keywordtype">double</font>  dfScale = 1.0, dfOffset = 0.0;

        hBand = GDALGetRasterBand( hDataset, panBandList[i] );
        hDstBand = GDALGetRasterBand( hOutDS, i+1 );
        
        printf( <font class="stringliteral">"Band %d Type = %d\n"</font>,
                panBandList[i], GDALGetRasterDataType( hBand ) );

<font class="comment">/* -------------------------------------------------------------------- */</font>
<font class="comment">/*      Do we need to collect scaling information?                      */</font>
<font class="comment">/* -------------------------------------------------------------------- */</font>
        <font class="keywordflow">if</font>( bScale &amp;&amp; !bHaveScaleSrc )
        {
            <font class="keywordtype">double</font>      adfCMinMax[2];
            <a class="code" href="gdal_h.html#a118">GDALComputeRasterMinMax</a>( hBand, TRUE, adfCMinMax );
            dfScaleSrcMin = adfCMinMax[0];
            dfScaleSrcMax = adfCMinMax[1];
        }

        <font class="keywordflow">if</font>( bScale )
        {
            <font class="keywordflow">if</font>( dfScaleSrcMax == dfScaleSrcMin )
                dfScaleSrcMax += 0.1;
            <font class="keywordflow">if</font>( dfScaleDstMax == dfScaleDstMin )
                dfScaleDstMax += 0.1;

            dfScale = (dfScaleDstMax - dfScaleDstMin) 
                    / (dfScaleSrcMax - dfScaleSrcMin);
            dfOffset = -1 * dfScaleSrcMin * dfScale + dfScaleDstMin;
        }

<font class="comment">/* -------------------------------------------------------------------- */</font>
<font class="comment">/*      Write out the raw raster data.                                  */</font>
<font class="comment">/* -------------------------------------------------------------------- */</font>
        pabyBlock = (GByte *) <a class="code" href="cpl_conv_h.html#a3">CPLMalloc</a>(<font class="keyword">sizeof</font>(<font class="keywordtype">double</font>)*2*nOXSize);

        <font class="keywordflow">for</font>( iBlockY = 0; iBlockY &lt; nOYSize; iBlockY++ )
        {
            <font class="keywordtype">int</font>         iSrcYOff;
            <font class="keywordtype">double</font>      dfComplete;

            <font class="keywordflow">if</font>( nOYSize == anSrcWin[3] )
                iSrcYOff = iBlockY + anSrcWin[1];
            <font class="keywordflow">else</font>
            {
                iSrcYOff = (iBlockY / (<font class="keywordtype">double</font>) nOYSize) * anSrcWin[3]
                    + anSrcWin[1];
                iSrcYOff = MAX(0,MIN(anSrcWin[1]+anSrcWin[3]-1,iSrcYOff));
            }

            <font class="keywordflow">if</font>( !bScale )
            {
                GDALRasterIO( hBand, GF_Read,
                              anSrcWin[0], iSrcYOff, anSrcWin[2], 1,
                              pabyBlock, nOXSize, 1,
                              GDALGetRasterDataType(hBand),
                              0, 0 );
                
                GDALRasterIO( hDstBand, GF_Write,
                              0, iBlockY, nOXSize, 1,
                              pabyBlock, nOXSize, 1,
                              GDALGetRasterDataType(hBand),
                              0, 0 );
            }
            <font class="keywordflow">else</font>
            {
                <font class="keywordtype">int</font>   iPixel;

                GDALRasterIO( hBand, GF_Read,
                              anSrcWin[0], iSrcYOff, anSrcWin[2], 1,
                              pabyBlock, nOXSize, 1, GDT_Float64,
                              0, 0 );

                <font class="keywordflow">for</font>( iPixel = 0; iPixel &lt; nOXSize; iPixel++ )
                {
                    ((<font class="keywordtype">double</font> *)pabyBlock)[iPixel] = 
                        ((<font class="keywordtype">double</font> *)pabyBlock)[iPixel] * dfScale + dfOffset;
                }
                
                
                GDALRasterIO( hDstBand, GF_Write,
                              0, iBlockY, nOXSize, 1,
                              pabyBlock, nOXSize, 1, GDT_Float64,
                              0, 0 );
            }

            dfComplete = (i / (<font class="keywordtype">double</font>) nBandCount)
                + ((iBlockY+1) / ((<font class="keywordtype">double</font>) nOYSize*nBandCount));
            
            GDALTermProgress( dfComplete, NULL, NULL );
        }

        CPLFree( pabyBlock );
    }

    GDALTermProgress( 1.0000001, NULL, NULL );
    
    GDALClose( hOutDS );
    GDALClose( hDataset );
    
    exit( 0 );
}


<font class="comment">/************************************************************************/</font>
<font class="comment">/*                            ArgIsNumeric()                            */</font>
<font class="comment">/************************************************************************/</font>

<font class="keywordtype">int</font> ArgIsNumeric( <font class="keyword">const</font> <font class="keywordtype">char</font> *pszArg )<font class="keyword"></font>
<font class="keyword"></font>
<font class="keyword"></font>{
    <font class="keywordflow">if</font>( pszArg[0] == <font class="charliteral">'-'</font> )
        pszArg++;

    <font class="keywordflow">if</font>( *pszArg == <font class="charliteral">'\0'</font> )
        <font class="keywordflow">return</font> FALSE;

    <font class="keywordflow">while</font>( *pszArg != <font class="charliteral">'\0'</font> )
    {
        <font class="keywordflow">if</font>( (*pszArg &lt; '0' || *pszArg &gt; <font class="charliteral">'9'</font>) &amp;&amp; *pszArg != <font class="charliteral">'.'</font> )
            <font class="keywordflow">return</font> FALSE;
        pszArg++;
    }
        
    <font class="keywordflow">return</font> TRUE;
}
</div></pre>
<p>
<hr><address><small>Generated at Thu Mar 28 09:47:33 2002 for GDAL by
<a href="http://www.stack.nl/~dimitri/doxygen/index.html">
<img src="doxygen.gif" alt="doxygen" align="middle" border=0 
width=110 height=53></a>1.2.3-20001105 written by <a href="mailto:dimitri@stack.nl">Dimitri van Heesch</a>,
 &copy;&nbsp;1997-2000</small></address>
</body>
</html>