Line data Source code
1 : /****************************************************************************** 2 : * 3 : * Project: GDAL 4 : * Purpose: "filter" 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_filter.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 : /* GDALVectorFilterAlgorithm::GDALVectorFilterAlgorithm() */ 26 : /************************************************************************/ 27 : 28 13 : GDALVectorFilterAlgorithm::GDALVectorFilterAlgorithm(bool standaloneStep) 29 : : GDALVectorPipelineStepAlgorithm(NAME, DESCRIPTION, HELP_URL, 30 13 : standaloneStep) 31 : { 32 13 : AddBBOXArg(&m_bbox); 33 13 : } 34 : 35 : /************************************************************************/ 36 : /* GDALVectorFilterAlgorithm::RunStep() */ 37 : /************************************************************************/ 38 : 39 5 : bool GDALVectorFilterAlgorithm::RunStep(GDALProgressFunc, void *) 40 : { 41 5 : CPLAssert(m_inputDataset.GetDatasetRef()); 42 5 : CPLAssert(m_outputDataset.GetName().empty()); 43 5 : CPLAssert(!m_outputDataset.GetDatasetRef()); 44 : 45 5 : bool ret = true; 46 5 : if (m_bbox.size() == 4) 47 : { 48 3 : const double xmin = m_bbox[0]; 49 3 : const double ymin = m_bbox[1]; 50 3 : const double xmax = m_bbox[2]; 51 3 : const double ymax = m_bbox[3]; 52 3 : auto poSrcDS = m_inputDataset.GetDatasetRef(); 53 3 : const int nLayerCount = poSrcDS->GetLayerCount(); 54 6 : for (int i = 0; i < nLayerCount; ++i) 55 : { 56 3 : auto poSrcLayer = poSrcDS->GetLayer(i); 57 3 : ret = ret && (poSrcLayer != nullptr); 58 3 : if (poSrcLayer) 59 3 : poSrcLayer->SetSpatialFilterRect(xmin, ymin, xmax, ymax); 60 : } 61 : } 62 : 63 5 : if (ret) 64 : { 65 5 : m_outputDataset.Set(m_inputDataset.GetDatasetRef()); 66 : } 67 : 68 5 : return ret; 69 : } 70 : 71 : //! @endcond