Line data Source code
1 : /****************************************************************************** 2 : * 3 : * Project: GDAL 4 : * Purpose: "unscale" step of "raster pipeline" 5 : * Author: Even Rouault <even dot rouault at spatialys.com> 6 : * 7 : ****************************************************************************** 8 : * Copyright (c) 2025, Even Rouault <even dot rouault at spatialys.com> 9 : * 10 : * SPDX-License-Identifier: MIT 11 : ****************************************************************************/ 12 : 13 : #include "gdalalg_raster_unscale.h" 14 : 15 : #include "gdal_priv.h" 16 : #include "gdal_utils.h" 17 : 18 : //! @cond Doxygen_Suppress 19 : 20 : #ifndef _ 21 : #define _(x) (x) 22 : #endif 23 : 24 : /************************************************************************/ 25 : /* GDALRasterUnscaleAlgorithm::GDALRasterUnscaleAlgorithm() */ 26 : /************************************************************************/ 27 : 28 16 : GDALRasterUnscaleAlgorithm::GDALRasterUnscaleAlgorithm(bool standaloneStep) 29 : : GDALRasterPipelineStepAlgorithm(NAME, DESCRIPTION, HELP_URL, 30 16 : standaloneStep) 31 : { 32 16 : AddOutputDataTypeArg(&m_type); 33 16 : } 34 : 35 : /************************************************************************/ 36 : /* GDALRasterUnscaleAlgorithm::RunStep() */ 37 : /************************************************************************/ 38 : 39 8 : bool GDALRasterUnscaleAlgorithm::RunStep(GDALProgressFunc, void *) 40 : { 41 8 : auto poSrcDS = m_inputDataset.GetDatasetRef(); 42 8 : CPLAssert(poSrcDS); 43 8 : CPLAssert(m_outputDataset.GetName().empty()); 44 8 : CPLAssert(!m_outputDataset.GetDatasetRef()); 45 : 46 16 : CPLStringList aosOptions; 47 8 : aosOptions.AddString("-of"); 48 8 : aosOptions.AddString("VRT"); 49 8 : aosOptions.AddString("-unscale"); 50 8 : aosOptions.AddString("-ot"); 51 8 : if (!m_type.empty()) 52 : { 53 1 : aosOptions.AddString(m_type.c_str()); 54 : } 55 : else 56 : { 57 7 : const auto eSrcDT = poSrcDS->GetRasterCount() > 0 58 7 : ? poSrcDS->GetRasterBand(1)->GetRasterDataType() 59 7 : : GDT_Unknown; 60 7 : if (GDALGetNonComplexDataType(eSrcDT) != GDT_Float64) 61 : { 62 5 : aosOptions.AddString(GDALDataTypeIsComplex(eSrcDT) ? "CFloat32" 63 5 : : "Float32"); 64 : } 65 : else 66 : { 67 2 : aosOptions.AddString(GDALDataTypeIsComplex(eSrcDT) ? "CFloat64" 68 2 : : "Float64"); 69 : } 70 : } 71 : 72 : GDALTranslateOptions *psOptions = 73 8 : GDALTranslateOptionsNew(aosOptions.List(), nullptr); 74 : 75 : auto poOutDS = std::unique_ptr<GDALDataset>(GDALDataset::FromHandle( 76 8 : GDALTranslate("", GDALDataset::ToHandle(poSrcDS), psOptions, nullptr))); 77 8 : GDALTranslateOptionsFree(psOptions); 78 8 : const bool bRet = poOutDS != nullptr; 79 8 : if (poOutDS) 80 : { 81 8 : m_outputDataset.Set(std::move(poOutDS)); 82 : } 83 : 84 16 : return bRet; 85 : } 86 : 87 : //! @endcond