<!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> <a class="qindex" href="hierarchy.html">Class Hierarchy</a> <a class="qindex" href="annotated.html">Compound List</a> <a class="qindex" href="files.html">File List</a> <a class="qindex" href="functions.html">Compound Members</a> <a class="qindex" href="globals.html">File Members</a> <a class="qindex" href="pages.html">Related Pages</a> </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 < 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 < argc; i++ ) { <font class="keywordflow">if</font>( EQUAL(argv[i],<font class="stringliteral">"-of"</font>) && i < argc-1 ) pszFormat = argv[++i]; <font class="keywordflow">else</font> <font class="keywordflow">if</font>( EQUAL(argv[i],<font class="stringliteral">"-ot"</font>) && i < argc-1 ) { <font class="keywordtype">int</font> iType; <font class="keywordflow">for</font>( iType = 1; iType < GDT_TypeCount; iType++ ) { <font class="keywordflow">if</font>( GDALGetDataTypeName((GDALDataType)iType) != NULL && 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>) && i < 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>) && i < 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 < argc-2 && ArgIsNumeric(argv[i+1]) ) { bHaveScaleSrc = TRUE; dfScaleSrcMin = atof(argv[i+1]); dfScaleSrcMax = atof(argv[i+2]); i += 2; } <font class="keywordflow">if</font>( i < argc-2 && bHaveScaleSrc && 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>) && i < 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>) && i < 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 && 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 < 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 < 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 && !bScale && nBandCount == GDALGetRasterCount(hDataset) && anSrcWin[0] == 0 && anSrcWin[1] == 0 && anSrcWin[2] == GDALGetRasterXSize(hDataset) && anSrcWin[3] == GDALGetRasterYSize(hDataset) && pszOXSize == NULL && 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 && strlen(pszProjection) > 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 < 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 && !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 < 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 < 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 < '0' || *pszArg > <font class="charliteral">'9'</font>) && *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>, © 1997-2000</small></address> </body> </html>