Line data Source code
1 : /****************************************************************************** 2 : * 3 : * Project: GDAL 4 : * Purpose: "tri" 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_tri.h" 14 : 15 : #include "gdal_priv.h" 16 : #include "gdal_utils.h" 17 : 18 : #include <cmath> 19 : 20 : //! @cond Doxygen_Suppress 21 : 22 : #ifndef _ 23 : #define _(x) (x) 24 : #endif 25 : 26 : /************************************************************************/ 27 : /* GDALRasterTRIAlgorithm::GDALRasterTRIAlgorithm() */ 28 : /************************************************************************/ 29 : 30 33 : GDALRasterTRIAlgorithm::GDALRasterTRIAlgorithm(bool standaloneStep) 31 : : GDALRasterPipelineStepAlgorithm(NAME, DESCRIPTION, HELP_URL, 32 33 : standaloneStep) 33 : { 34 33 : SetOutputVRTCompatible(false); 35 : 36 33 : AddBandArg(&m_band).SetDefault(m_band); 37 66 : AddArg("algorithm", 0, _("Algorithm to compute TRI"), &m_algorithm) 38 33 : .SetChoices("Riley", "Wilson") 39 33 : .SetDefault(m_algorithm); 40 : AddArg("no-edges", 0, 41 : _("Do not try to interpolate values at dataset edges or close to " 42 : "nodata values"), 43 33 : &m_noEdges); 44 33 : } 45 : 46 : /************************************************************************/ 47 : /* GDALRasterTRIAlgorithm::RunStep() */ 48 : /************************************************************************/ 49 : 50 6 : bool GDALRasterTRIAlgorithm::RunStep(GDALPipelineStepRunContext &) 51 : { 52 6 : const auto poSrcDS = m_inputDataset[0].GetDatasetRef(); 53 6 : CPLAssert(poSrcDS); 54 6 : CPLAssert(m_outputDataset.GetName().empty()); 55 6 : CPLAssert(!m_outputDataset.GetDatasetRef()); 56 : 57 12 : CPLStringList aosOptions; 58 6 : aosOptions.AddString("-of"); 59 6 : aosOptions.AddString("stream"); 60 6 : aosOptions.AddString("-b"); 61 6 : aosOptions.AddString(CPLSPrintf("%d", m_band)); 62 6 : aosOptions.AddString("-alg"); 63 6 : aosOptions.AddString(m_algorithm.c_str()); 64 6 : if (!m_noEdges) 65 5 : aosOptions.AddString("-compute_edges"); 66 : 67 : GDALDEMProcessingOptions *psOptions = 68 6 : GDALDEMProcessingOptionsNew(aosOptions.List(), nullptr); 69 : 70 : auto poOutDS = std::unique_ptr<GDALDataset>(GDALDataset::FromHandle( 71 : GDALDEMProcessing("", GDALDataset::ToHandle(poSrcDS), "TRI", nullptr, 72 6 : psOptions, nullptr))); 73 6 : GDALDEMProcessingOptionsFree(psOptions); 74 6 : const bool bRet = poOutDS != nullptr; 75 6 : if (poOutDS) 76 : { 77 6 : m_outputDataset.Set(std::move(poOutDS)); 78 : } 79 : 80 12 : return bRet; 81 : } 82 : 83 : GDALRasterTRIAlgorithmStandalone::~GDALRasterTRIAlgorithmStandalone() = default; 84 : 85 : //! @endcond