Index: apps/gdalwarp.cpp =================================================================== --- apps/gdalwarp.cpp (revision 26004) +++ apps/gdalwarp.cpp (working copy) @@ -1218,10 +1218,10 @@ if( !bQuiet ) { if (CPLIsNan(dfReal)) - printf( "Using internal nodata values (eg. nan) for image %s.\n", + printf( "Using internal nodata values (e.g. nan) for image %s.\n", papszSrcFiles[iSrc] ); else - printf( "Using internal nodata values (eg. %g) for image %s.\n", + printf( "Using internal nodata values (e.g. %g) for image %s.\n", dfReal, papszSrcFiles[iSrc] ); } psWO->padfSrcNoDataReal = (double *) @@ -1336,7 +1336,45 @@ CSLDestroy( papszTokens ); } + /* else try to fill dstNoData from source bands */ + // else if ( FALSE ) + else if ( psWO->padfSrcNoDataReal != NULL ) + { + psWO->padfDstNoDataReal = (double *) + CPLMalloc(psWO->nBandCount*sizeof(double)); + psWO->padfDstNoDataImag = (double *) + CPLMalloc(psWO->nBandCount*sizeof(double)); + printf( "Copying nodata values from source %s to destination %s.\n", + papszSrcFiles[iSrc], pszDstFilename ); + + for( i = 0; i < psWO->nBandCount; i++ ) + { + int bHaveNodata = FALSE; + + GDALRasterBandH hBand = GDALGetRasterBand( hSrcDS, i+1 ); + GDALGetRasterNoDataValue( hBand, &bHaveNodata ); + + CPLDebug("WARP", "band=%d bHaveNodata=%d", i, bHaveNodata); + if( bHaveNodata ) + { + psWO->padfDstNoDataReal[i] = psWO->padfSrcNoDataReal[i]; + psWO->padfDstNoDataImag[i] = psWO->padfSrcNoDataImag[i]; + CPLDebug("WARP", "srcNoData=%f dstNoData=%f", + psWO->padfSrcNoDataReal[i], psWO->padfDstNoDataReal[i] ); + } + + if( bCreateOutput ) + { + CPLDebug("WARP", "calling GDALSetRasterNoDataValue() for band#%d", i ); + GDALSetRasterNoDataValue( + GDALGetRasterBand( hDstDS, psWO->panDstBands[i] ), + psWO->padfDstNoDataReal[i] ); + } + } + + } + /* -------------------------------------------------------------------- */ /* If we have a cutline, transform it into the source */ /* pixel/line coordinate system and insert into warp options. */