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 *) @@ -1257,6 +1257,7 @@ { char **papszTokens = CSLTokenizeString( pszDstNodata ); int nTokenCount = CSLCount(papszTokens); + int bDstNoDataNone = TRUE; psWO->padfDstNoDataReal = (double *) CPLMalloc(psWO->nBandCount*sizeof(double)); @@ -1267,14 +1268,37 @@ { if( i < nTokenCount ) { + if ( papszTokens[i] != NULL && EQUAL(papszTokens[i],"none") ) + { + CPLDebug( "WARP", "dstnodata of band %d not set", i ); + bDstNoDataNone = TRUE; + continue; + } + else if ( papszTokens[i] == NULL ) // this shouldn't happen, but just in case + { + printf("Error parsing dstnodata arg #%d\n", i); + bDstNoDataNone = TRUE; + continue; + } CPLStringToComplex( papszTokens[i], psWO->padfDstNoDataReal + i, psWO->padfDstNoDataImag + i ); + bDstNoDataNone = FALSE; + CPLDebug( "WARP", "dstnodata of band %d set to %f", i, psWO->padfDstNoDataReal[i] ); } else { - psWO->padfDstNoDataReal[i] = psWO->padfDstNoDataReal[i-1]; - psWO->padfDstNoDataImag[i] = psWO->padfDstNoDataImag[i-1]; + if ( ! bDstNoDataNone ) + { + psWO->padfDstNoDataReal[i] = psWO->padfDstNoDataReal[i-1]; + psWO->padfDstNoDataImag[i] = psWO->padfDstNoDataImag[i-1]; + CPLDebug( "WARP", "dstnodata of band %d set from previous band", i ); + } + else + { + CPLDebug( "WARP", "dstnodata value of band %d not set", i ); + continue; + } } GDALRasterBandH hBand = GDALGetRasterBand( hDstDS, i+1 ); @@ -1336,7 +1360,44 @@ CSLDestroy( papszTokens ); } + /* else try to fill dstNoData from source bands */ + 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. */