13#ifndef GDALALG_VECTOR_PIPELINE_INCLUDED
14#define GDALALG_VECTOR_PIPELINE_INCLUDED
16#include "gdalalgorithm.h"
17#include "gdalalg_abstract_pipeline.h"
20#include "ogrlayerwithtranslatefeature.h"
32class GDALRasterAlgorithmStepRegistry;
34class GDALVectorPipelineStepAlgorithm
35 :
public GDALPipelineStepAlgorithm
38 ~GDALVectorPipelineStepAlgorithm()
override;
41 GDALVectorPipelineStepAlgorithm(
const std::string &name,
42 const std::string &description,
43 const std::string &helpURL,
46 GDALVectorPipelineStepAlgorithm(
const std::string &name,
47 const std::string &description,
48 const std::string &helpURL,
49 const ConstructorOptions &options);
51 friend class GDALVectorPipelineAlgorithm;
52 friend class GDALVectorConcatAlgorithm;
54 int GetInputType()
const override
59 int GetOutputType()
const override
72 GDALVectorAlgorithmStepRegistry() =
default;
73 ~GDALVectorAlgorithmStepRegistry()
override;
77 template <
class MyAlgorithm>
78 bool Register(
const std::string &name = std::string())
81 std::is_base_of_v<GDALVectorPipelineStepAlgorithm, MyAlgorithm>,
82 "Algorithm is not a GDALVectorPipelineStepAlgorithm");
85 info.m_name = name.empty() ? MyAlgorithm::NAME : name;
86 info.m_aliases = MyAlgorithm::GetAliasesStatic();
87 info.m_creationFunc = []() -> std::unique_ptr<GDALAlgorithm>
88 {
return std::make_unique<MyAlgorithm>(); };
97class GDALVectorPipelineAlgorithm final :
public GDALAbstractPipelineAlgorithm
100 static constexpr const char *NAME =
"pipeline";
101 static constexpr const char *DESCRIPTION =
102 "Process a vector dataset applying several steps.";
103 static constexpr const char *HELP_URL =
104 "/programs/gdal_vector_pipeline.html";
106 static std::vector<std::string> GetAliasesStatic()
109#ifdef GDAL_PIPELINE_PROJ_NOSTALGIA
117 GDALVectorPipelineAlgorithm();
119 std::string GetUsageForCLI(
bool shortUsage,
120 const UsageOptions &usageOptions)
const override;
122 static void RegisterAlgorithms(GDALVectorAlgorithmStepRegistry ®istry,
123 bool forMixedPipeline);
125 int GetInputType()
const override
130 int GetOutputType()
const override
136 GDALVectorAlgorithmStepRegistry m_stepRegistry{};
140 return m_stepRegistry;
145 return m_stepRegistry;
149 std::unique_ptr<GDALAbstractPipelineAlgorithm>
150 CreateNestedPipeline()
const override
152 auto pipeline = std::make_unique<GDALVectorPipelineAlgorithm>();
153 pipeline->m_bInnerPipeline =
true;
165class GDALVectorDecoratedDataset
169 ~GDALVectorDecoratedDataset()
override;
173 return m_srcDS.GetMetadata(pszDomain);
177 const char *pszDomain)
override
179 return m_srcDS.GetMetadataItem(pszName, pszDomain);
182 std::vector<std::string>
185 return m_srcDS.GetFieldDomainNames(papszOptions);
190 return m_srcDS.GetFieldDomain(name);
193 std::vector<std::string>
196 return m_srcDS.GetRelationshipNames(papszOptions);
202 return m_srcDS.GetRelationship(name);
206 std::unique_ptr<GDALDataset> m_dummySrcDS{};
209 explicit GDALVectorDecoratedDataset(
GDALDataset *poSrcDS);
218class GDALVectorOutputDataset :
public GDALVectorDecoratedDataset
222 explicit GDALVectorOutputDataset(
GDALDataset *poSrcDS);
224 int GetLayerCount()
const override
226 return static_cast<int>(m_layers.size());
229 const OGRLayer *GetLayer(
int idx)
const override
231 return idx >= 0 && idx < GetLayerCount() ? m_layers[idx].get()
235 int TestCapability(
const char *)
const override;
237 void AddLayer(std::unique_ptr<OGRLayer> layer)
239 m_layers.emplace_back(std::move(layer));
243 std::vector<std::unique_ptr<OGRLayer>> m_layers{};
254class GDALVectorAlgorithmLayerProgressHelper
258 GDALVectorAlgorithmLayerProgressHelper(GDALProgressFunc pfnProgress,
259 void *pProgressData);
261 explicit GDALVectorAlgorithmLayerProgressHelper(
262 const GDALPipelineStepRunContext &ctxt);
265 void AddProcessedLayer(
OGRLayer &srcLayer);
269 void AddPassThroughLayer(
OGRLayer &srcLayer);
275 explicit iterator(
const GDALVectorAlgorithmLayerProgressHelper &helper,
278 m_nLayerIdx(start ? 0 : m_helper.m_apoSrcLayers.size())
282 inline bool operator==(
const iterator &other)
const
284 return m_nLayerIdx == other.m_nLayerIdx;
287 inline bool operator!=(
const iterator &other)
const
289 return m_nLayerIdx != other.m_nLayerIdx;
292 inline iterator &operator++()
294 if (!m_helper.m_anFeatures.empty())
295 m_nFeatureIdx += m_helper.m_anFeatures[m_nProcessedLayerIdx];
296 if (m_helper.m_apoSrcLayers[m_nLayerIdx].second)
297 ++m_nProcessedLayerIdx;
302 using progress_data_unique_ptr =
303 std::unique_ptr<void,
decltype(&GDALDestroyScaledProgress)>;
304 using value_type = std::tuple<
OGRLayer *, bool, GDALProgressFunc,
305 progress_data_unique_ptr>;
307 value_type operator*()
const;
310 const GDALVectorAlgorithmLayerProgressHelper &m_helper;
311 size_t m_nLayerIdx = 0;
312 size_t m_nProcessedLayerIdx = 0;
320 iterator
begin()
const
322 return iterator(*
this,
true);
329 return iterator(*
this,
false);
333 bool HasProcessedLayers()
const
335 return !m_anFeatures.empty();
339 GDALProgressFunc m_pfnProgress =
nullptr;
340 void *m_pProgressData =
nullptr;
341 int64_t m_nTotalFeatures = 0;
342 std::vector<std::pair<OGRLayer *, bool>> m_apoSrcLayers{};
343 std::vector<int64_t> m_anFeatures{};
356class GDALVectorPipelineOutputLayer
357 :
public OGRLayerWithTranslateFeature
360 explicit GDALVectorPipelineOutputLayer(
OGRLayer &oSrcLayer);
361 ~GDALVectorPipelineOutputLayer()
override;
365 void FailTranslation()
367 m_translateError =
true;
373 void ResetReading()
override;
378 std::vector<std::unique_ptr<
OGRFeature>> m_pendingFeatures{};
379 size_t m_idxInPendingFeatures = 0;
380 bool m_translateError =
false;
390class GDALVectorPipelinePassthroughLayer
391 :
public GDALVectorPipelineOutputLayer
394 explicit GDALVectorPipelinePassthroughLayer(
OGRLayer &oSrcLayer)
395 : GDALVectorPipelineOutputLayer(oSrcLayer)
402 int TestCapability(
const char *pszCap)
const override
406 return m_srcLayer.TestCapability(pszCap);
410 bool bForce)
override
412 return m_srcLayer.GetExtent(iGeomField, psExtent, bForce);
416 bool bForce)
override
418 return m_srcLayer.GetExtent3D(iGeomField, psExtent, bForce);
421 void TranslateFeature(
422 std::unique_ptr<OGRFeature> poSrcFeature,
423 std::vector<std::unique_ptr<OGRFeature>> &apoOutFeatures)
override;
438class GDALVectorNonStreamingAlgorithmLayer
443 GDALVectorNonStreamingAlgorithmLayer(
OGRLayer &srcLayer,
446 ~GDALVectorNonStreamingAlgorithmLayer()
override;
453 virtual bool Process(GDALProgressFunc pfnProgress,
void *pProgressData) = 0;
455 virtual std::unique_ptr<OGRFeature> GetNextProcessedFeature() = 0;
463 int m_geomFieldIndex{0};
477class GDALVectorNonStreamingAlgorithmDataset
478 :
public GDALVectorDecoratedDataset
481 explicit GDALVectorNonStreamingAlgorithmDataset(
GDALDataset &oSrcDS);
482 ~GDALVectorNonStreamingAlgorithmDataset()
override;
485 bool AddProcessedLayer(
486 std::unique_ptr<GDALVectorNonStreamingAlgorithmLayer> srcLayer,
487 GDALProgressFunc progressFunc,
void *progressData);
489 void AddPassThroughLayer(
OGRLayer &oLayer);
491 int GetLayerCount() const final override;
492 OGRLayer *GetLayer(
int idx) const final override;
493 int TestCapability(const
char *pszCap) const override;
496 std::vector<std::unique_ptr<
OGRLayer>> m_owned_layers{};
497 std::vector<OGRLayer *> m_layers{};
507class GDALVectorPipelineOutputDataset
508 :
public GDALVectorDecoratedDataset
510 std::map<OGRLayer *, OGRLayerWithTranslateFeature *>
511 m_mapSrcLayerToNewLayer{};
512 std::vector<std::unique_ptr<OGRLayerWithTranslateFeature>>
514 std::vector<OGRLayerWithTranslateFeature *> m_layers{};
516 OGRLayerWithTranslateFeature *m_belongingLayer =
nullptr;
517 std::vector<std::unique_ptr<OGRFeature>> m_pendingFeatures{};
518 size_t m_idxInPendingFeatures = 0;
523 explicit GDALVectorPipelineOutputDataset(
GDALDataset &oSrcDS);
526 std::unique_ptr<OGRLayerWithTranslateFeature> poNewLayer);
528 int GetLayerCount()
const override;
530 OGRLayer *GetLayer(
int idx)
const override;
532 int TestCapability(
const char *pszCap)
const override;
534 void ResetReading()
override;
537 double *pdfProgressPct,
538 GDALProgressFunc pfnProgress,
539 void *pProgressData)
override;
Registry of GDAL algorithms.
Definition gdalalgorithm_cpp.h:2316
static constexpr const char * HIDDEN_ALIAS_SEPARATOR
Special value to put in m_aliases to separate public alias from hidden aliases.
Definition gdalalgorithm_cpp.h:2320
bool Register()
Register the algorithm of type MyAlgorithm.
Definition gdalalgorithm_cpp.h:2343
A set of associated raster bands, usually from one file.
Definition gdal_dataset.h:77
virtual const GDALRelationship * GetRelationship(const std::string &name) const
Get a relationship from its name.
Definition gdaldataset.cpp:10542
virtual const OGRFieldDomain * GetFieldDomain(const std::string &name) const
Get a field domain from its name.
Definition gdaldataset.cpp:10225
virtual std::vector< std::string > GetRelationshipNames(CSLConstList papszOptions=nullptr) const
Returns a list of the names of all relationships stored in the dataset.
Definition gdaldataset.cpp:10498
void static void CSLConstList GetMetadata(const char *pszDomain="") override
Fetch metadata.
Definition gdaldataset.cpp:5217
virtual std::vector< std::string > GetFieldDomainNames(CSLConstList papszOptions=nullptr) const
Returns a list of the names of all field domains stored in the dataset.
Definition gdaldataset.cpp:10175
virtual const char * GetMetadataItem(const char *pszName, const char *pszDomain="")
Fetch single metadata item.
Definition gdalmajorobject.cpp:322
virtual const char * GetDescription() const
Fetch object description.
Definition gdalmajorobject.cpp:61
Definition of a table relationship.
Definition gdal_relationship.h:38
Simple container for a bounding region in 3D.
Definition ogr_core.h:217
Simple container for a bounding region (rectangle)
Definition ogr_core.h:44
Definition of a feature class or feature layer.
Definition ogr_feature.h:521
A simple feature, including geometry and attributes.
Definition ogr_feature.h:1041
Definition of a field domain.
Definition ogr_feature.h:1780
Template class offering a GetNextFeature() implementation relying on GetNextRawFeature().
Definition ogrsf_frmts.h:509
This class represents a layer of simple features, with access methods.
Definition ogrsf_frmts.h:61
virtual const char * GetName() const
Return the layer name.
Definition ogrlayer.cpp:4807
#define EQUAL(a, b)
Alias for strcasecmp() == 0.
Definition cpl_port.h:532
#define CPL_DISALLOW_COPY_ASSIGN(ClassName)
Helper to remove the copy and assignment constructors so that the compiler will not generate the defa...
Definition cpl_port.h:1101
char ** CSLConstList
Type of a constant null-terminated list of nul terminated strings.
Definition cpl_port.h:1252
long long GIntBig
Large signed integer type (generally 64-bit integer type).
Definition cpl_port.h:195
#define GDAL_OF_VECTOR
Allow vector drivers to be used.
Definition gdal.h:1130
#define OLCFastFeatureCount
Layer capability for fast feature count retrieval .
Definition ogr_core.h:983
int OGRErr
Type for a OGR error.
Definition ogr_core.h:388
Classes related to registration of format support, and opening datasets.
OGRLayer::FeatureIterator begin(OGRLayer *poLayer)
Return begin of feature iterator.
Definition ogrsf_frmts.h:478
OGRLayer::FeatureIterator end(OGRLayer *poLayer)
Return end of feature iterator.
Definition ogrsf_frmts.h:486
#define DEFINE_GET_NEXT_FEATURE_THROUGH_RAW(BaseLayer)
Utility macro to define GetNextFeature() through GetNextRawFeature()
Definition ogrsf_frmts.h:539