QGIS API Documentation  3.10.0-A Coruña (6c816b4204)
qgsvectorlayerexporter.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgsvectorlayerexporter.cpp
3  -------------------
4  begin : Thu Aug 25 2011
5  copyright : (C) 2011 by Giuseppe Sucameli
6  email : brush.tyler at gmail.com
7  ***************************************************************************/
8 
9 /***************************************************************************
10  * *
11  * This program is free software; you can redistribute it and/or modify *
12  * it under the terms of the GNU General Public License as published by *
13  * the Free Software Foundation; either version 2 of the License, or *
14  * (at your option) any later version. *
15  * *
16  ***************************************************************************/
17 
18 
19 #include "qgsfields.h"
20 #include "qgsfeature.h"
21 #include "qgsfeatureiterator.h"
22 #include "qgsgeometry.h"
23 #include "qgslogger.h"
24 #include "qgsmessagelog.h"
25 #include "qgsgeometrycollection.h"
27 #include "qgsvectorlayerexporter.h"
28 #include "qgsproviderregistry.h"
29 #include "qgsdatasourceuri.h"
30 #include "qgsexception.h"
31 #include "qgsvectordataprovider.h"
32 #include "qgsvectorlayer.h"
33 #include "qgsabstractgeometry.h"
34 
35 #include <QProgressDialog>
36 
37 #define FEATURE_BUFFER_SIZE 200
38 
40  const QString &uri,
41  const QgsFields &fields,
42  QgsWkbTypes::Type geometryType,
43  const QgsCoordinateReferenceSystem &destCRS,
44  bool overwrite,
45  QMap<int, int> *oldToNewAttrIdx,
46  QString *errorMessage,
47  const QMap<QString, QVariant> *options
48 );
49 
50 
52  const QString &providerKey,
53  const QgsFields &fields,
54  QgsWkbTypes::Type geometryType,
56  bool overwrite,
57  const QMap<QString, QVariant> &options,
58  QgsFeatureSink::SinkFlags sinkFlags )
59  : mErrorCount( 0 )
60  , mAttributeCount( -1 )
61 
62 {
63  mProvider = nullptr;
64 
65  // create an empty layer
66  QString errMsg;
68  mError = pReg->createEmptyLayer( providerKey, uri, fields, geometryType, crs, overwrite, mOldToNewAttrIdx,
69  errMsg, !options.isEmpty() ? &options : nullptr );
70  if ( errorCode() )
71  {
72  mErrorMessage = errMsg;
73  return;
74  }
75 
76  const auto constMOldToNewAttrIdx = mOldToNewAttrIdx;
77  for ( int idx : constMOldToNewAttrIdx )
78  {
79  if ( idx > mAttributeCount )
80  mAttributeCount = idx;
81  }
82 
83  mAttributeCount++;
84 
85  QgsDebugMsg( QStringLiteral( "Created empty layer" ) );
86 
87  QString uriUpdated( uri );
88  // HACK sorry...
89  if ( providerKey == QLatin1String( "ogr" ) )
90  {
91  QString layerName;
92  if ( options.contains( QStringLiteral( "layerName" ) ) )
93  layerName = options.value( QStringLiteral( "layerName" ) ).toString();
94  if ( !layerName.isEmpty() )
95  {
96  uriUpdated += QLatin1String( "|layername=" );
97  uriUpdated += layerName;
98  }
99  }
100 
101  QgsDataProvider::ProviderOptions providerOptions;
102  QgsVectorDataProvider *vectorProvider = qobject_cast< QgsVectorDataProvider * >( pReg->createProvider( providerKey, uriUpdated, providerOptions ) );
103  if ( !vectorProvider || !vectorProvider->isValid() || ( vectorProvider->capabilities() & QgsVectorDataProvider::AddFeatures ) == 0 )
104  {
105  mError = ErrInvalidLayer;
106  mErrorMessage = QObject::tr( "Loading of layer failed" );
107 
108  delete vectorProvider;
109  return;
110  }
111 
112  // If the result is a geopackage layer and there is already a field name FID requested which
113  // might contain duplicates, make sure to generate a new field with a unique name instead
114  // that will be filled by ogr with unique values.
115 
116  // HACK sorry
117  const QString path = QgsProviderRegistry::instance()->decodeUri( QStringLiteral( "ogr" ), uri ).value( QStringLiteral( "path" ) ).toString();
118  if ( sinkFlags.testFlag( QgsFeatureSink::SinkFlag::RegeneratePrimaryKey ) && path.endsWith( QLatin1String( ".gpkg" ), Qt::CaseInsensitive ) )
119  {
120  QString fidName = options.value( QStringLiteral( "FID" ), QStringLiteral( "FID" ) ).toString();
121  int fidIdx = vectorProvider->fields().lookupField( fidName );
122  if ( fidIdx != -1 )
123  {
124  mOldToNewAttrIdx.remove( fidIdx );
125  }
126  }
127 
128  mProvider = vectorProvider;
129  mError = NoError;
130 }
131 
133 {
134  flushBuffer();
135  delete mProvider;
136 }
137 
139 {
140  return mError;
141 }
142 
144 {
145  return mErrorMessage;
146 }
147 
149 {
150  QgsFeatureList::iterator fIt = features.begin();
151  bool result = true;
152  for ( ; fIt != features.end(); ++fIt )
153  {
154  result = result && addFeature( *fIt, flags );
155  }
156  return result;
157 }
158 
160 {
161  QgsAttributes attrs = feat.attributes();
162 
163  QgsFeature newFeat;
164  if ( feat.hasGeometry() )
165  newFeat.setGeometry( feat.geometry() );
166 
167  newFeat.initAttributes( mAttributeCount );
168 
169  for ( int i = 0; i < attrs.count(); ++i )
170  {
171  // add only mapped attributes (un-mapped ones will not be present in the
172  // destination layer)
173  int dstIdx = mOldToNewAttrIdx.value( i, -1 );
174  if ( dstIdx < 0 )
175  continue;
176 
177  QgsDebugMsgLevel( QStringLiteral( "moving field from pos %1 to %2" ).arg( i ).arg( dstIdx ), 3 );
178  newFeat.setAttribute( dstIdx, attrs.at( i ) );
179  }
180 
181  mFeatureBuffer.append( newFeat );
182 
183  if ( mFeatureBuffer.count() >= FEATURE_BUFFER_SIZE )
184  {
185  return flushBuffer();
186  }
187 
188  return true;
189 }
190 
192 {
193  if ( mFeatureBuffer.count() <= 0 )
194  return true;
195 
196  if ( !mProvider->addFeatures( mFeatureBuffer, QgsFeatureSink::FastInsert ) )
197  {
198  QStringList errors = mProvider->errors();
199  mProvider->clearErrors();
200 
201  mErrorMessage = QObject::tr( "Creation error for features from #%1 to #%2. Provider errors was: \n%3" )
202  .arg( mFeatureBuffer.first().id() )
203  .arg( mFeatureBuffer.last().id() )
204  .arg( errors.join( QStringLiteral( "\n" ) ) );
205 
206  mError = ErrFeatureWriteFailed;
207  mErrorCount += mFeatureBuffer.count();
208 
209  mFeatureBuffer.clear();
210  QgsDebugMsg( mErrorMessage );
211  return false;
212  }
213 
214  mFeatureBuffer.clear();
215  return true;
216 }
217 
218 bool QgsVectorLayerExporter::createSpatialIndex()
219 {
220  if ( mProvider && ( mProvider->capabilities() & QgsVectorDataProvider::CreateSpatialIndex ) != 0 )
221  {
222  return mProvider->createSpatialIndex();
223  }
224  else
225  {
226  return true;
227  }
228 }
229 
232  const QString &uri,
233  const QString &providerKey,
234  const QgsCoordinateReferenceSystem &destCRS,
235  bool onlySelected,
236  QString *errorMessage,
237  const QMap<QString, QVariant> &options,
238  QgsFeedback *feedback )
239 {
242  bool shallTransform = false;
243 
244  if ( !layer )
245  return ErrInvalidLayer;
246 
247  if ( destCRS.isValid() )
248  {
249  // This means we should transform
250  outputCRS = destCRS;
251  shallTransform = true;
252  }
253  else
254  {
255  // This means we shouldn't transform, use source CRS as output (if defined)
256  outputCRS = layer->crs();
257  }
258 
259 
260  bool overwrite = false;
261  bool forceSinglePartGeom = false;
262  QMap<QString, QVariant> providerOptions = options;
263  if ( !options.isEmpty() )
264  {
265  overwrite = providerOptions.take( QStringLiteral( "overwrite" ) ).toBool();
266  forceSinglePartGeom = providerOptions.take( QStringLiteral( "forceSinglePartGeometryType" ) ).toBool();
267  }
268 
269  QgsFields fields = layer->fields();
270 
271  QgsWkbTypes::Type wkbType = layer->wkbType();
272 
273  // Special handling for Shapefiles
274  if ( layer->providerType() == QLatin1String( "ogr" ) && layer->storageType() == QLatin1String( "ESRI Shapefile" ) )
275  {
276  // convert field names to lowercase
277  for ( int fldIdx = 0; fldIdx < fields.count(); ++fldIdx )
278  {
279  fields[fldIdx].setName( fields.at( fldIdx ).name().toLower() );
280  }
281 
282  // This code does not make much sense anymore except for POINT
283  // because since commit 1aa0091e7a368ded all POLYGON and LINESTRING are
284  // reported as MULTI from the OGR provider and shapefiles.
285  if ( !forceSinglePartGeom )
286  {
287  // convert wkbtype to multipart (see #5547)
288  switch ( wkbType )
289  {
292  break;
294  wkbType = QgsWkbTypes::MultiPolygon;
295  break;
297  wkbType = QgsWkbTypes::MultiPoint25D;
298  break;
301  break;
304  break;
305  default:
306  break;
307  }
308  }
309  }
310 
311  bool convertGeometryToSinglePart = false;
312  if ( forceSinglePartGeom && QgsWkbTypes::isMultiType( wkbType ) )
313  {
314  wkbType = QgsWkbTypes::singleType( wkbType );
315  convertGeometryToSinglePart = true;
316  }
317 
318  QgsVectorLayerExporter *writer =
319  new QgsVectorLayerExporter( uri, providerKey, fields, wkbType, outputCRS, overwrite, providerOptions );
320 
321  // check whether file creation was successful
322  ExportError err = writer->errorCode();
323  if ( err != NoError )
324  {
325  if ( errorMessage )
326  *errorMessage = writer->errorMessage();
327  delete writer;
328  return err;
329  }
330 
331  if ( errorMessage )
332  {
333  errorMessage->clear();
334  }
335 
336  QgsFeature fet;
337 
338  QgsFeatureRequest req;
339  if ( wkbType == QgsWkbTypes::NoGeometry )
341  if ( onlySelected )
342  req.setFilterFids( layer->selectedFeatureIds() );
343 
344  QgsFeatureIterator fit = layer->getFeatures( req );
345 
346  // Create our transform
347  if ( destCRS.isValid() )
348  {
349  ct = QgsCoordinateTransform( layer->crs(), destCRS, layer->transformContext() );
350  }
351 
352  // Check for failure
353  if ( !ct.isValid() )
354  shallTransform = false;
355 
356  long n = 0;
357  long approxTotal = onlySelected ? layer->selectedFeatureCount() : layer->featureCount();
358 
359  if ( errorMessage )
360  {
361  *errorMessage = QObject::tr( "Feature write errors:" );
362  }
363 
364  bool canceled = false;
365 
366  // write all features
367  while ( fit.nextFeature( fet ) )
368  {
369  if ( feedback && feedback->isCanceled() )
370  {
371  canceled = true;
372  if ( errorMessage )
373  {
374  *errorMessage += '\n' + QObject::tr( "Import was canceled at %1 of %2" ).arg( n ).arg( approxTotal );
375  }
376  break;
377  }
378 
379  if ( writer->errorCount() > 1000 )
380  {
381  if ( errorMessage )
382  {
383  *errorMessage += '\n' + QObject::tr( "Stopping after %1 errors" ).arg( writer->errorCount() );
384  }
385  break;
386  }
387 
388  if ( shallTransform )
389  {
390  try
391  {
392  if ( fet.hasGeometry() )
393  {
394  QgsGeometry g = fet.geometry();
395  g.transform( ct );
396  fet.setGeometry( g );
397  }
398  }
399  catch ( QgsCsException &e )
400  {
401  delete writer;
402 
403  QString msg = QObject::tr( "Failed to transform a point while drawing a feature with ID '%1'. Writing stopped. (Exception: %2)" )
404  .arg( fet.id() ).arg( e.what() );
405  QgsMessageLog::logMessage( msg, QObject::tr( "Vector import" ) );
406  if ( errorMessage )
407  *errorMessage += '\n' + msg;
408 
409  return ErrProjection;
410  }
411  }
412 
413  // Handles conversion to single-part
414  if ( convertGeometryToSinglePart && fet.geometry().isMultipart() )
415  {
416  QgsGeometry singlePartGeometry { fet.geometry() };
417  // We want a failure if the geometry cannot be converted to single-part without data loss!
418  // check if there are more than one part
419  const QgsGeometryCollection *c = qgsgeometry_cast<const QgsGeometryCollection *>( singlePartGeometry.constGet() );
420  if ( ( c && c->partCount() > 1 ) || ! singlePartGeometry.convertToSingleType() )
421  {
422  delete writer;
423  QString msg = QObject::tr( "Failed to transform a feature with ID '%1' to single part. Writing stopped." )
424  .arg( fet.id() );
425  QgsMessageLog::logMessage( msg, QObject::tr( "Vector import" ) );
426  if ( errorMessage )
427  *errorMessage += '\n' + msg;
428  return ErrFeatureWriteFailed;
429  }
430  fet.setGeometry( singlePartGeometry );
431  }
432 
433  if ( !writer->addFeature( fet ) )
434  {
435  if ( writer->errorCode() && errorMessage )
436  {
437  *errorMessage += '\n' + writer->errorMessage();
438  }
439  }
440  n++;
441 
442  if ( feedback )
443  {
444  feedback->setProgress( 100.0 * static_cast< double >( n ) / approxTotal );
445  }
446 
447  }
448 
449  // flush the buffer to be sure that all features are written
450  if ( !writer->flushBuffer() )
451  {
452  if ( writer->errorCode() && errorMessage )
453  {
454  *errorMessage += '\n' + writer->errorMessage();
455  }
456  }
457  int errors = writer->errorCount();
458 
459  if ( !writer->createSpatialIndex() )
460  {
461  if ( writer->errorCode() && errorMessage )
462  {
463  *errorMessage += '\n' + writer->errorMessage();
464  }
465  }
466 
467  delete writer;
468 
469  if ( errorMessage )
470  {
471  if ( errors > 0 )
472  {
473  *errorMessage += '\n' + QObject::tr( "Only %1 of %2 features written." ).arg( n - errors ).arg( n );
474  }
475  else
476  {
477  errorMessage->clear();
478  }
479  }
480 
481  if ( canceled )
482  return ErrUserCanceled;
483  else if ( errors > 0 )
484  return ErrFeatureWriteFailed;
485 
486  return NoError;
487 }
488 
489 
490 //
491 // QgsVectorLayerExporterTask
492 //
493 
494 QgsVectorLayerExporterTask::QgsVectorLayerExporterTask( QgsVectorLayer *layer, const QString &uri, const QString &providerKey, const QgsCoordinateReferenceSystem &destinationCrs, const QMap<QString, QVariant> &options, bool ownsLayer )
495  : QgsTask( tr( "Exporting %1" ).arg( layer->name() ), QgsTask::CanCancel )
496  , mLayer( layer )
497  , mOwnsLayer( ownsLayer )
498  , mDestUri( uri )
499  , mDestProviderKey( providerKey )
500  , mDestCrs( destinationCrs )
501  , mOptions( options )
502  , mOwnedFeedback( new QgsFeedback() )
503 {
504  if ( mLayer )
505  setDependentLayers( QList< QgsMapLayer * >() << mLayer );
506 }
507 
508 QgsVectorLayerExporterTask *QgsVectorLayerExporterTask::withLayerOwnership( QgsVectorLayer *layer, const QString &uri, const QString &providerKey, const QgsCoordinateReferenceSystem &destinationCrs, const QMap<QString, QVariant> &options )
509 {
510  std::unique_ptr< QgsVectorLayerExporterTask > newTask( new QgsVectorLayerExporterTask( layer, uri, providerKey, destinationCrs, options ) );
511  newTask->mOwnsLayer = true;
512  return newTask.release();
513 }
514 
516 {
517  mOwnedFeedback->cancel();
518  QgsTask::cancel();
519 }
520 
522 {
523  if ( !mLayer )
524  return false;
525 
526  connect( mOwnedFeedback.get(), &QgsFeedback::progressChanged, this, &QgsVectorLayerExporterTask::setProgress );
527 
528 
530  mLayer.data(), mDestUri, mDestProviderKey, mDestCrs, false, &mErrorMessage,
531  mOptions, mOwnedFeedback.get() );
532 
533  return mError == QgsVectorLayerExporter::NoError;
534 }
535 
537 {
538  // QgsMapLayer has QTimer member, which must not be destroyed from another thread
539  if ( mOwnsLayer )
540  delete mLayer;
541 
542  if ( result )
543  emit exportComplete();
544  else
545  emit errorOccurred( mError, mErrorMessage );
546 }
int lookupField(const QString &fieldName) const
Looks up field&#39;s index from the field name.
Definition: qgsfields.cpp:324
QgsFeatureId id
Definition: qgsfeature.h:64
Wrapper for iterator of features from vector data provider or vector layer.
Could not access newly created destination layer.
bool flushBuffer() override
Flushes any internal buffer which may exist in the sink, causing any buffered features to be added to...
Use faster inserts, at the cost of updating the passed features to reflect changes made at the provid...
void setProgress(double progress)
Sets the task&#39;s current progress.
QgsVectorLayerExporter(const QString &uri, const QString &provider, const QgsFields &fields, QgsWkbTypes::Type geometryType, const QgsCoordinateReferenceSystem &crs, bool overwrite=false, const QMap< QString, QVariant > &options=QMap< QString, QVariant >(), QgsFeatureSink::SinkFlags sinkFlags=nullptr)
Constructor for QgsVectorLayerExporter.
static Type singleType(Type type)
Returns the single type for a WKB type.
Definition: qgswkbtypes.h:156
virtual QgsVectorDataProvider::Capabilities capabilities() const
Returns flags containing the supported capabilities.
bool isMultipart() const
Returns true if WKB of the geometry is of WKBMulti* type.
QString name
Definition: qgsfield.h:58
OperationResult transform(const QgsCoordinateTransform &ct, QgsCoordinateTransform::TransformDirection direction=QgsCoordinateTransform::ForwardTransform, bool transformZ=false) SIP_THROW(QgsCsException)
Transforms this geometry as described by the coordinate transform ct.
static bool isMultiType(Type type)
Returns true if the WKB type is a multi type.
Definition: qgswkbtypes.h:706
QString storageType() const
Returns the permanent storage type for this layer as a friendly name.
QgsWkbTypes::Type wkbType() const FINAL
Returns the WKBType or WKBUnknown in case of error.
#define QgsDebugMsg(str)
Definition: qgslogger.h:38
bool addFeatures(QgsFeatureList &flist, QgsFeatureSink::Flags flags=nullptr) override
Adds a list of features to the sink.
QList< QgsFeature > QgsFeatureList
Definition: qgsfeature.h:571
#define FEATURE_BUFFER_SIZE
static ExportError exportLayer(QgsVectorLayer *layer, const QString &uri, const QString &providerKey, const QgsCoordinateReferenceSystem &destCRS, bool onlySelected=false, QString *errorMessage=nullptr, const QMap< QString, QVariant > &options=QMap< QString, QVariant >(), QgsFeedback *feedback=nullptr)
Writes the contents of vector layer to a different datasource.
int selectedFeatureCount() const
Returns the number of features that are selected in this layer.
QString providerType() const
Returns the provider type (provider key) for this layer.
void setProgress(double progress)
Sets the current progress for the feedback object.
Definition: qgsfeedback.h:63
QString errorMessage() const
Returns any error message encountered during the export.
static QgsVectorLayerExporterTask * withLayerOwnership(QgsVectorLayer *layer, const QString &uri, const QString &providerKey, const QgsCoordinateReferenceSystem &destinationCrs, const QMap< QString, QVariant > &options=QMap< QString, QVariant >())
Creates a new QgsVectorLayerExporterTask which has ownership over a source layer. ...
void setDependentLayers(const QList< QgsMapLayer *> &dependentLayers)
Sets a list of layers on which the task depends.
Container of fields for a vector layer.
Definition: qgsfields.h:42
A geometry is the spatial representation of a feature.
Definition: qgsgeometry.h:122
bool setAttribute(int field, const QVariant &attr)
Set an attribute&#39;s value by field index.
Definition: qgsfeature.cpp:211
QVariantMap decodeUri(const QString &providerKey, const QString &uri)
Breaks a provider data source URI into its component paths (e.g.
The feature class encapsulates a single feature including its id, geometry and a list of field/values...
Definition: qgsfeature.h:55
const QgsCoordinateReferenceSystem & crs
bool hasGeometry() const
Returns true if the feature has an associated geometry.
Definition: qgsfeature.cpp:197
int count() const
Returns number of items.
Definition: qgsfields.cpp:133
QgsVectorLayerExporter::ExportError createEmptyLayer(const QString &providerKey, const QString &uri, const QgsFields &fields, QgsWkbTypes::Type wkbType, const QgsCoordinateReferenceSystem &srs, bool overwrite, QMap< int, int > &oldToNewAttrIdxMap, QString &errorMessage, const QMap< QString, QVariant > *options)
Creates new empty vector layer.
ExportError errorCode() const
Returns any encountered error code, or false if no error was encountered.
bool isValid() const
Returns true if the coordinate transform is valid, ie both the source and destination CRS have been s...
QString what() const
Definition: qgsexception.h:48
QgsField at(int i) const
Gets field at particular index (must be in range 0..N-1)
Definition: qgsfields.cpp:163
QgsDataProvider * createProvider(const QString &providerKey, const QString &dataSource, const QgsDataProvider::ProviderOptions &options=QgsDataProvider::ProviderOptions())
Creates a new instance of a provider.
Base class for feedback objects to be used for cancellation of something running in a worker thread...
Definition: qgsfeedback.h:44
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into c
Allows creation of spatial index.
virtual bool createSpatialIndex()
Creates a spatial index on the datasource (if supported by the provider type).
Type
The WKB type describes the number of dimensions a geometry has.
Definition: qgswkbtypes.h:68
static QgsProviderRegistry * instance(const QString &pluginPath=QString())
Means of accessing canonical single instance.
void progressChanged(double progress)
Emitted when the feedback object reports a progress change.
QgsFields fields() const FINAL
Returns the list of fields of this layer.
const QgsFeatureIds & selectedFeatureIds() const
Returns a list of the selected features IDs in this layer.
#define QgsDebugMsgLevel(str, level)
Definition: qgslogger.h:39
Geometry collection.
virtual bool isValid() const =0
Returns true if this is a valid layer.
QgsVectorLayerExporterTask(QgsVectorLayer *layer, const QString &uri, const QString &providerKey, const QgsCoordinateReferenceSystem &destinationCrs, const QMap< QString, QVariant > &options=QMap< QString, QVariant >(), bool ownsLayer=false)
Constructor for QgsVectorLayerExporterTask.
QgsFields fields() const override=0
Returns the fields associated with this data provider.
long featureCount(const QString &legendKey) const
Number of features rendered with specified legend key.
void initAttributes(int fieldCount)
Initialize this feature with the given number of fields.
Definition: qgsfeature.cpp:202
static void logMessage(const QString &message, const QString &tag=QString(), Qgis::MessageLevel level=Qgis::Warning, bool notifyUser=true)
Adds a message to the log instance (and creates it if necessary).
Abstract base class for long running background tasks.
QStringList errors() const
Gets recorded errors.
This class wraps a request for features to a vector layer (or directly its vector data provider)...
T qgsgeometry_cast(const QgsAbstractGeometry *geom)
An error occurred while writing a feature to the destination.
void clearErrors()
Clear recorded errors.
QgsTask task which performs a QgsVectorLayerExporter layer export operation as a background task...
An error occurred while reprojecting features to destination CRS.
QgsCoordinateTransformContext transformContext() const
Returns the layer data provider coordinate transform context or a default transform context if the la...
void errorOccurred(int error, const QString &errorMessage)
Emitted when an error occurs which prevented the layer being exported (or if the task is canceled)...
bool addFeatures(QgsFeatureList &features, QgsFeatureSink::Flags flags=nullptr) override
Adds a list of features to the sink.
A convenience class for exporting vector layers to a destination data provider.
bool addFeature(QgsFeature &feature, QgsFeatureSink::Flags flags=nullptr) override
Adds a single feature to the sink.
A registry / canonical manager of data providers.
virtual void cancel()
Notifies the task that it should terminate.
int partCount() const override
Returns count of parts contained in the geometry.
Setting options for creating vector data providers.
~QgsVectorLayerExporter() override
Finalizes the export and closes the new created layer.
QgsFeatureRequest & setFilterFids(const QgsFeatureIds &fids)
Sets feature IDs that should be fetched.
bool isCanceled() const
Tells whether the operation has been canceled already.
Definition: qgsfeedback.h:54
int errorCount() const
Returns the number of error messages encountered during the export.
This class represents a coordinate reference system (CRS).
void setGeometry(const QgsGeometry &geometry)
Set the feature&#39;s geometry.
Definition: qgsfeature.cpp:137
Class for doing transforms between two map coordinate systems.
void cancel() override
Notifies the task that it should terminate.
No errors were encountered.
bool run() override
Performs the task&#39;s operation.
QgsFeatureIterator getFeatures(const QgsFeatureRequest &request=QgsFeatureRequest()) const FINAL
Queries the layer for features specified in request.
QgsGeometry geometry
Definition: qgsfeature.h:67
Custom exception class for Coordinate Reference System related exceptions.
Definition: qgsexception.h:65
bool nextFeature(QgsFeature &f)
This is the base class for vector data providers.
Geometry is not required. It may still be returned if e.g. required for a filter condition.
A vector of attributes.
Definition: qgsattributes.h:57
Represents a vector layer which manages a vector based data sets.
void finished(bool result) override
If the task is managed by a QgsTaskManager, this will be called after the task has finished (whether ...
QgsAttributes attributes
Definition: qgsfeature.h:65
QgsCoordinateReferenceSystem crs
Definition: qgsmaplayer.h:86
QgsVectorLayerExporter::ExportError createEmptyLayer_t(const QString &uri, const QgsFields &fields, QgsWkbTypes::Type geometryType, const QgsCoordinateReferenceSystem &destCRS, bool overwrite, QMap< int, int > *oldToNewAttrIdx, QString *errorMessage, const QMap< QString, QVariant > *options)
void exportComplete()
Emitted when exporting the layer is successfully completed.
QgsFeatureRequest & setFlags(QgsFeatureRequest::Flags flags)
Sets flags that affect how features will be fetched.
bool isValid() const
Returns whether this CRS is correctly initialized and usable.