Line data Source code
1 : /****************************************************************************** 2 : * 3 : * Project: GDAL 4 : * Purpose: "tpi" 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_tpi.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 : /* GDALRasterTPIAlgorithm::GDALRasterTPIAlgorithm() */ 28 : /************************************************************************/ 29 : 30 31 : GDALRasterTPIAlgorithm::GDALRasterTPIAlgorithm(bool standaloneStep) 31 : : GDALRasterPipelineStepAlgorithm(NAME, DESCRIPTION, HELP_URL, 32 31 : standaloneStep) 33 : { 34 31 : SetOutputVRTCompatible(false); 35 : 36 31 : AddBandArg(&m_band).SetDefault(m_band); 37 : AddArg("no-edges", 0, 38 : _("Do not try to interpolate values at dataset edges or close to " 39 : "nodata values"), 40 31 : &m_noEdges); 41 31 : } 42 : 43 : /************************************************************************/ 44 : /* GDALRasterTPIAlgorithm::RunStep() */ 45 : /************************************************************************/ 46 : 47 4 : bool GDALRasterTPIAlgorithm::RunStep(GDALPipelineStepRunContext &) 48 : { 49 4 : const auto poSrcDS = m_inputDataset[0].GetDatasetRef(); 50 4 : CPLAssert(poSrcDS); 51 4 : CPLAssert(m_outputDataset.GetName().empty()); 52 4 : CPLAssert(!m_outputDataset.GetDatasetRef()); 53 : 54 8 : CPLStringList aosOptions; 55 4 : aosOptions.AddString("-of"); 56 4 : aosOptions.AddString("stream"); 57 4 : aosOptions.AddString("-b"); 58 4 : aosOptions.AddString(CPLSPrintf("%d", m_band)); 59 4 : if (!m_noEdges) 60 3 : aosOptions.AddString("-compute_edges"); 61 : 62 : GDALDEMProcessingOptions *psOptions = 63 4 : GDALDEMProcessingOptionsNew(aosOptions.List(), nullptr); 64 : 65 : auto poOutDS = std::unique_ptr<GDALDataset>(GDALDataset::FromHandle( 66 : GDALDEMProcessing("", GDALDataset::ToHandle(poSrcDS), "TPI", nullptr, 67 4 : psOptions, nullptr))); 68 4 : GDALDEMProcessingOptionsFree(psOptions); 69 4 : const bool bRet = poOutDS != nullptr; 70 4 : if (poOutDS) 71 : { 72 4 : m_outputDataset.Set(std::move(poOutDS)); 73 : } 74 : 75 8 : return bRet; 76 : } 77 : 78 : GDALRasterTPIAlgorithmStandalone::~GDALRasterTPIAlgorithmStandalone() = default; 79 : 80 : //! @endcond