32 #include <QProgressDialog> 34 #define FEATURE_BUFFER_SIZE 200 42 QMap<int, int> *oldToNewAttrIdx,
43 QString *errorMessage,
44 const QMap<QString, QVariant> *options
49 const QString &providerKey,
54 const QMap<QString, QVariant> &options )
56 , mAttributeCount( -1 )
67 mErrorMessage = QObject::tr(
"Unable to load %1 provider" ).arg( providerKey );
75 mErrorMessage = QObject::tr(
"Provider %1 has no %2 method" ).arg( providerKey, QStringLiteral(
"createEmptyLayer" ) );
81 mError = pCreateEmpty( uri, fields, geometryType, crs, overwrite, &mOldToNewAttrIdx, &errMsg, !options.isEmpty() ? &options : nullptr );
84 mErrorMessage = errMsg;
88 Q_FOREACH (
int idx, mOldToNewAttrIdx )
90 if ( idx > mAttributeCount )
91 mAttributeCount = idx;
98 QString uriUpdated( uri );
100 if ( providerKey == QLatin1String(
"ogr" ) )
103 if ( options.contains( QStringLiteral(
"layerName" ) ) )
104 layerName = options.value( QStringLiteral(
"layerName" ) ).toString();
105 if ( !layerName.isEmpty() )
107 uriUpdated += QLatin1String(
"|layername=" );
108 uriUpdated += layerName;
115 mErrorMessage = QObject::tr(
"Loading of layer failed" );
117 delete vectorProvider;
121 mProvider = vectorProvider;
140 return mErrorMessage;
145 QgsFeatureList::iterator fIt = features.begin();
147 for ( ; fIt != features.end(); ++fIt )
164 for (
int i = 0; i < attrs.count(); ++i )
168 int dstIdx = mOldToNewAttrIdx.value( i, -1 );
172 QgsDebugMsgLevel( QString(
"moving field from pos %1 to %2" ).arg( i ).arg( dstIdx ), 3 );
176 mFeatureBuffer.append( newFeat );
188 if ( mFeatureBuffer.count() <= 0 )
193 QStringList errors = mProvider->
errors();
196 mErrorMessage = QObject::tr(
"Creation error for features from #%1 to #%2. Provider errors was: \n%3" )
197 .arg( mFeatureBuffer.first().id() )
198 .arg( mFeatureBuffer.last().id() )
199 .arg( errors.join( QStringLiteral(
"\n" ) ) );
202 mErrorCount += mFeatureBuffer.count();
204 mFeatureBuffer.clear();
209 mFeatureBuffer.clear();
213 bool QgsVectorLayerExporter::createSpatialIndex()
228 const QString &providerKey,
232 const QMap<QString, QVariant> &options,
237 bool shallTransform =
false;
246 shallTransform =
true;
251 outputCRS = layer->
crs();
255 bool overwrite =
false;
256 bool forceSinglePartGeom =
false;
257 QMap<QString, QVariant> providerOptions = options;
258 if ( !options.isEmpty() )
260 overwrite = providerOptions.take( QStringLiteral(
"overwrite" ) ).toBool();
261 forceSinglePartGeom = providerOptions.take( QStringLiteral(
"forceSinglePartGeometryType" ) ).toBool();
268 if ( layer->
providerType() == QLatin1String(
"ogr" ) && layer->
storageType() == QLatin1String(
"ESRI Shapefile" ) )
271 for (
int fldIdx = 0; fldIdx < fields.
count(); ++fldIdx )
273 fields[fldIdx].setName( fields.
at( fldIdx ).
name().toLower() );
276 if ( !forceSinglePartGeom )
320 errorMessage->clear();
343 shallTransform =
false;
350 *errorMessage = QObject::tr(
"Feature write errors:" );
353 bool canceled =
false;
363 *errorMessage +=
'\n' + QObject::tr(
"Import was canceled at %1 of %2" ).arg( n ).arg( approxTotal );
372 *errorMessage +=
'\n' + QObject::tr(
"Stopping after %1 errors" ).arg( writer->
errorCount() );
377 if ( shallTransform )
392 QString msg = QObject::tr(
"Failed to transform a point while drawing a feature with ID '%1'. Writing stopped. (Exception: %2)" )
393 .arg( fet.
id() ).arg( e.
what() );
396 *errorMessage +=
'\n' + msg;
412 feedback->
setProgress( 100.0 * static_cast< double >( n ) / approxTotal );
427 if ( !writer->createSpatialIndex() )
441 *errorMessage +=
'\n' + QObject::tr(
"Only %1 of %2 features written." ).arg( n - errors ).arg( n );
445 errorMessage->clear();
451 else if ( errors > 0 )
463 :
QgsTask( tr(
"Exporting %1" ).arg( layer->name() ),
QgsTask::CanCancel )
465 , mOwnsLayer( ownsLayer )
467 , mDestProviderKey( providerKey )
468 , mDestCrs( destinationCrs )
469 , mOptions( options )
478 std::unique_ptr< QgsVectorLayerExporterTask > newTask(
new QgsVectorLayerExporterTask( layer, uri, providerKey, destinationCrs, options ) );
479 newTask->mOwnsLayer =
true;
480 return newTask.release();
485 mOwnedFeedback->cancel();
498 mLayer.data(), mDestUri, mDestProviderKey, mDestCrs,
false, &mErrorMessage,
499 mOptions, mOwnedFeedback.get() );
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's current progress.
virtual QgsVectorDataProvider::Capabilities capabilities() const
Returns flags containing the supported capabilities.
QString storageType() const
Returns the permanent storage type for this layer as a friendly name.
bool addFeatures(QgsFeatureList &flist, QgsFeatureSink::Flags flags=nullptr) override
Adds a list of features to the sink.
QList< QgsFeature > QgsFeatureList
#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
The number of features that are selected in this layer.
void setProgress(double progress)
Sets the current progress for the feedback object.
QString errorMessage() const
Returns any error message encountered during the export.
#define Q_NOWARN_DEPRECATED_PUSH
QgsDataProvider * createProvider(const QString &providerKey, const QString &dataSource)
Creates a new instance of a provider.
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.
A geometry is the spatial representation of a feature.
bool setAttribute(int field, const QVariant &attr)
Set an attribute's value by field index.
User canceled the export.
The feature class encapsulates a single feature including its id, geometry and a list of field/values...
Could not find a matching provider key.
bool hasGeometry() const
Returns true if the feature has an associated geometry.
int count() const
Return number of items.
static void logMessage(const QString &message, const QString &tag=QString(), Qgis::MessageLevel level=Qgis::Warning)
add a message to the instance (and create it if necessary)
ExportError errorCode() const
Returns any encountered error code, or false if no error was encountered.
QgsField at(int i) const
Get field at particular index (must be in range 0..N-1)
Base class for feedback objects to be used for cancelation of something running in a worker thread...
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.
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.
const QgsFeatureIds & selectedFeatureIds() const
Return reference to identifiers of selected features.
QgsFields fields() const override
Returns the list of fields of this layer.
#define QgsDebugMsgLevel(str, level)
QLibrary * createProviderLibrary(const QString &providerKey) const
Returns a new QLibrary for the specified providerKey.
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.
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.
QgsWkbTypes::Type wkbType() const override
Returns the WKBType or WKBUnknown in case of error.
Abstract base class for long running background tasks.
QStringList errors() const
Get recorded errors.
This class wraps a request for features to a vector layer (or directly its vector data provider)...
An error occurred while writing a feature to the destination.
QgsCoordinateReferenceSystem crs() const
Returns the layer's spatial reference system.
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.
QgsGeometry geometry() const
Returns the geometry associated with this feature.
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.
OperationResult transform(const QgsCoordinateTransform &ct, QgsCoordinateTransform::TransformDirection direction=QgsCoordinateTransform::ForwardTransform, bool transformZ=false)
Transforms this geometry as described by the coordinate transform ct.
A convenience class for exporting vector layers to a destination data provider.
QgsFeatureIterator getFeatures(const QgsFeatureRequest &request=QgsFeatureRequest()) const override
Query the layer for features specified in request.
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.
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 >())
Constructor for QgsVectorLayerExporter.
#define Q_NOWARN_DEPRECATED_POP
~QgsVectorLayerExporter() override
Finalizes the export and closes the new created layer.
QgsFeatureRequest & setFilterFids(const QgsFeatureIds &fids)
Set feature IDs that should be fetched.
bool isCanceled() const
Tells whether the operation has been canceled already.
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's geometry.
void cancel() override
Notifies the task that it should terminate.
No errors were encountered.
bool run() override
Performs the task's operation.
Custom exception class for Coordinate Reference System related exceptions.
QString providerType() const
Return the provider type for this layer.
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.
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 ...
Provider does not support creation of empty layers.
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)
Set flags that affect how features will be fetched.
bool isValid() const
Returns whether this CRS is correctly initialized and usable.