Line data Source code
1 : /****************************************************************************** 2 : * 3 : * Project: GDAL 4 : * Purpose: "read" step of "vector pipeline" 5 : * Author: Even Rouault <even dot rouault at spatialys.com> 6 : * 7 : ****************************************************************************** 8 : * Copyright (c) 2024, Even Rouault <even dot rouault at spatialys.com> 9 : * 10 : * SPDX-License-Identifier: MIT 11 : ****************************************************************************/ 12 : 13 : #include "gdalalg_vector_read.h" 14 : 15 : #include "gdal_priv.h" 16 : #include "ogrsf_frmts.h" 17 : 18 : //! @cond Doxygen_Suppress 19 : 20 : #ifndef _ 21 : #define _(x) (x) 22 : #endif 23 : 24 : /************************************************************************/ 25 : /* GDALVectorReadAlgorithm::GDALVectorReadAlgorithm() */ 26 : /************************************************************************/ 27 : 28 48 : GDALVectorReadAlgorithm::GDALVectorReadAlgorithm() 29 : : GDALVectorPipelineStepAlgorithm(NAME, DESCRIPTION, HELP_URL, 30 48 : /* standaloneStep =*/false) 31 : { 32 48 : AddInputArgs(/* hiddenForCLI = */ false); 33 48 : } 34 : 35 : /************************************************************************/ 36 : /* GDALVectorReadAlgorithmDataset */ 37 : /************************************************************************/ 38 : 39 : namespace 40 : { 41 : class GDALVectorReadAlgorithmDataset final : public GDALDataset 42 : { 43 : std::vector<OGRLayer *> m_srcLayers{}; 44 : 45 : public: 46 2 : GDALVectorReadAlgorithmDataset() = default; 47 : 48 1 : void AddLayer(OGRLayer *poSrcLayer) 49 : { 50 1 : m_srcLayers.push_back(poSrcLayer); 51 1 : } 52 : 53 3 : int GetLayerCount() override 54 : { 55 3 : return static_cast<int>(m_srcLayers.size()); 56 : } 57 : 58 1 : OGRLayer *GetLayer(int idx) override 59 : { 60 1 : return idx >= 0 && idx < GetLayerCount() ? m_srcLayers[idx] : nullptr; 61 : } 62 : }; 63 : } // namespace 64 : 65 : /************************************************************************/ 66 : /* GDALVectorReadAlgorithm::RunStep() */ 67 : /************************************************************************/ 68 : 69 28 : bool GDALVectorReadAlgorithm::RunStep(GDALProgressFunc, void *) 70 : { 71 28 : CPLAssert(m_inputDataset.GetDatasetRef()); 72 28 : CPLAssert(m_outputDataset.GetName().empty()); 73 28 : CPLAssert(!m_outputDataset.GetDatasetRef()); 74 : 75 28 : if (m_inputLayerNames.empty()) 76 : { 77 26 : m_outputDataset.Set(m_inputDataset.GetDatasetRef()); 78 : } 79 : else 80 : { 81 2 : auto poSrcDS = m_inputDataset.GetDatasetRef(); 82 2 : auto poOutDS = std::make_unique<GDALVectorReadAlgorithmDataset>(); 83 2 : poOutDS->SetDescription(poSrcDS->GetDescription()); 84 3 : for (const auto &srcLayerName : m_inputLayerNames) 85 : { 86 2 : auto poSrcLayer = poSrcDS->GetLayerByName(srcLayerName.c_str()); 87 2 : if (!poSrcLayer) 88 : { 89 1 : ReportError(CE_Failure, CPLE_AppDefined, 90 : "Cannot find source layer '%s'", 91 : srcLayerName.c_str()); 92 1 : return false; 93 : } 94 1 : poOutDS->AddLayer(poSrcLayer); 95 : } 96 1 : m_outputDataset.Set(std::move(poOutDS)); 97 : } 98 27 : return true; 99 : } 100 : 101 : //! @endcond