Line data Source code
1 : /****************************************************************************** 2 : * 3 : * Project: GDAL 4 : * Purpose: "gdal vector geom segmentize" 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_vector_geom_segmentize.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 : /* GDALVectorGeomSegmentizeAlgorithm() */ 26 : /************************************************************************/ 27 : 28 7 : GDALVectorGeomSegmentizeAlgorithm::GDALVectorGeomSegmentizeAlgorithm( 29 7 : bool standaloneStep) 30 : : GDALVectorGeomAbstractAlgorithm(NAME, DESCRIPTION, HELP_URL, 31 7 : standaloneStep, m_opts) 32 : { 33 : AddArg("max-length", 0, _("Maximum length of a segment"), 34 14 : &m_opts.m_maxLength) 35 7 : .SetPositional() 36 7 : .SetRequired() 37 7 : .SetMinValueExcluded(0); 38 7 : } 39 : 40 : namespace 41 : { 42 : 43 : /************************************************************************/ 44 : /* GDALVectorGeomSegmentizeAlgorithmLayer */ 45 : /************************************************************************/ 46 : 47 : class GDALVectorGeomSegmentizeAlgorithmLayer final 48 : : public GDALVectorGeomOneToOneAlgorithmLayer< 49 : GDALVectorGeomSegmentizeAlgorithm> 50 : { 51 : protected: 52 : using GDALVectorGeomOneToOneAlgorithmLayer::TranslateFeature; 53 : 54 : std::unique_ptr<OGRFeature> 55 : TranslateFeature(std::unique_ptr<OGRFeature> poSrcFeature) const override; 56 : 57 : public: 58 1 : GDALVectorGeomSegmentizeAlgorithmLayer( 59 : OGRLayer &oSrcLayer, 60 : const GDALVectorGeomSegmentizeAlgorithm::Options &opts) 61 1 : : GDALVectorGeomOneToOneAlgorithmLayer< 62 1 : GDALVectorGeomSegmentizeAlgorithm>(oSrcLayer, opts) 63 : { 64 1 : } 65 : }; 66 : 67 : /************************************************************************/ 68 : /* TranslateFeature() */ 69 : /************************************************************************/ 70 : 71 : std::unique_ptr<OGRFeature> 72 5 : GDALVectorGeomSegmentizeAlgorithmLayer::TranslateFeature( 73 : std::unique_ptr<OGRFeature> poSrcFeature) const 74 : { 75 5 : const int nGeomFieldCount = poSrcFeature->GetGeomFieldCount(); 76 10 : for (int i = 0; i < nGeomFieldCount; ++i) 77 : { 78 5 : if (IsSelectedGeomField(i)) 79 : { 80 5 : if (auto poGeom = poSrcFeature->GetGeomFieldRef(i)) 81 : { 82 3 : poGeom->segmentize(m_opts.m_maxLength); 83 : } 84 : } 85 : } 86 : 87 5 : return poSrcFeature; 88 : } 89 : 90 : } // namespace 91 : 92 : /************************************************************************/ 93 : /* GDALVectorGeomSegmentizeAlgorithm::CreateAlgLayer() */ 94 : /************************************************************************/ 95 : 96 : std::unique_ptr<OGRLayerWithTranslateFeature> 97 1 : GDALVectorGeomSegmentizeAlgorithm::CreateAlgLayer(OGRLayer &srcLayer) 98 : { 99 1 : return std::make_unique<GDALVectorGeomSegmentizeAlgorithmLayer>(srcLayer, 100 1 : m_opts); 101 : } 102 : 103 : //! @endcond