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