From 335cde3357e33862d5ea30a041a8420dc43048ed Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Tue, 24 Jul 2018 21:17:15 +0200 Subject: [PATCH] gdal_translate: make -stats option work with -co COPY_SRC_OVERVIEWS=YES (fixes #792) --- gdal/apps/gdal_translate_lib.cpp | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/gdal/apps/gdal_translate_lib.cpp b/gdal/apps/gdal_translate_lib.cpp index a864688761aa..c452f880d3ea 100644 --- a/gdal/apps/gdal_translate_lib.cpp +++ b/gdal/apps/gdal_translate_lib.cpp @@ -923,7 +923,7 @@ GDALDatasetH GDALTranslate( const char *pszDest, GDALDatasetH hSrcDataset, && bSpatialArrangementPreserved && psOptions->nGCPCount == 0 && !bGotBounds && psOptions->pszOutputSRS == nullptr && !psOptions->bSetNoData && !psOptions->bUnsetNoData - && psOptions->nRGBExpand == 0 && !psOptions->bStats && !psOptions->bNoRAT + && psOptions->nRGBExpand == 0 && !psOptions->bNoRAT && psOptions->panColorInterp == nullptr ) { @@ -950,6 +950,21 @@ GDALDatasetH GDALTranslate( const char *pszDest, GDALDatasetH hSrcDataset, } } +/* -------------------------------------------------------------------- */ +/* Compute stats if required. */ +/* -------------------------------------------------------------------- */ + if (psOptions->bStats) + { + GDALDataset* poSrcDS = GDALDataset::FromHandle(hSrcDataset); + for( int i = 0; i < poSrcDS->GetRasterCount(); i++ ) + { + double dfMin, dfMax, dfMean, dfStdDev; + poSrcDS->GetRasterBand(i+1)->ComputeStatistics( + psOptions->bApproxStats, + &dfMin, &dfMax, &dfMean, &dfStdDev, + GDALDummyProgress, nullptr ); + } + } hOutDS = GDALCreateCopy( hDriver, pszDest, hSrcDataset, psOptions->bStrict, psOptions->papszCreateOptions, @@ -960,6 +975,13 @@ GDALDatasetH GDALTranslate( const char *pszDest, GDALDatasetH hSrcDataset, return hOutDS; } + if( CSLFetchNameValue(psOptions->papszCreateOptions, "COPY_SRC_OVERVIEWS") ) + { + CPLError(CE_Warning, CPLE_AppDefined, + "General options of gdal_translate make the " + "COPY_SRC_OVERVIEWS creation option ineffective"); + } + /* -------------------------------------------------------------------- */ /* Establish some parameters. */ /* -------------------------------------------------------------------- */ @@ -1223,7 +1245,7 @@ GDALDatasetH GDALTranslate( const char *pszDest, GDALDatasetH hSrcDataset, /* -------------------------------------------------------------------- */ /* Transfer generally applicable metadata. */ /* -------------------------------------------------------------------- */ - GDALDataset* poSrcDS = reinterpret_cast(hSrcDataset); + GDALDataset* poSrcDS = GDALDataset::FromHandle(hSrcDataset); char** papszMetadata = CSLDuplicate(poSrcDS->GetMetadata()); if ( psOptions->nScaleRepeat > 0 || psOptions->bUnscale || psOptions->eOutputType != GDT_Unknown ) {