Branch data Line data Source code
1 : : /***************************************************************************
2 : : qgsvectorlayerexporter.h
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 : : #ifndef QGSVECTORLAYEREXPORTER_H
19 : : #define QGSVECTORLAYEREXPORTER_H
20 : :
21 : : #include "qgis_core.h"
22 : : #include "qgis_sip.h"
23 : : #include "qgsfeature.h"
24 : : #include "qgsfeaturesink.h"
25 : : #include "qgstaskmanager.h"
26 : : #include "qgsfeedback.h"
27 : : #include "qgsvectorlayer.h"
28 : :
29 : : #include <QPointer>
30 : :
31 : : class QProgressDialog;
32 : : class QgsVectorDataProvider;
33 : : class QgsFields;
34 : :
35 : : /**
36 : : * \class QgsVectorLayerExporter
37 : : * \ingroup core
38 : : * \brief A convenience class for exporting vector layers to a destination data provider.
39 : : *
40 : : * QgsVectorLayerExporter can be used in two ways:
41 : : *
42 : : * # Using a static call to QgsVectorLayerExporter::exportLayer(...) which exports the
43 : : * entire layer to the destination provider.
44 : : * # Create an instance of the class and issue calls to addFeature(...)
45 : : *
46 : : * \since QGIS 3.0
47 : : */
48 : : class CORE_EXPORT QgsVectorLayerExporter : public QgsFeatureSink
49 : : {
50 : : public:
51 : :
52 : : //! Error codes
53 : : enum ExportError
54 : : {
55 : : NoError = 0, //!< No errors were encountered
56 : : ErrCreateDataSource, //!< Could not create the destination data source
57 : : ErrCreateLayer, //!< Could not create destination layer
58 : : ErrAttributeTypeUnsupported, //!< Source layer has an attribute type which could not be handled by destination
59 : : ErrAttributeCreationFailed, //!< Destination provider was unable to create an attribute
60 : : ErrProjection, //!< An error occurred while reprojecting features to destination CRS
61 : : ErrFeatureWriteFailed, //!< An error occurred while writing a feature to the destination
62 : : ErrInvalidLayer, //!< Could not access newly created destination layer
63 : : ErrInvalidProvider, //!< Could not find a matching provider key
64 : : ErrProviderUnsupportedFeature, //!< Provider does not support creation of empty layers
65 : : ErrConnectionFailed, //!< Could not connect to destination
66 : : ErrUserCanceled, //!< User canceled the export
67 : : };
68 : :
69 : : /**
70 : : * Writes the contents of vector layer to a different datasource.
71 : : * \param layer source layer
72 : : * \param uri URI for destination data source
73 : : * \param providerKey string key for destination data provider
74 : : * \param destCRS destination CRS, or an invalid (default constructed) CRS if
75 : : * not available
76 : : * \param onlySelected set to TRUE to export only selected features
77 : : * \param errorMessage if non-null, will be set to any error messages
78 : : * \param options optional provider dataset options
79 : : * \param feedback optional feedback object to show progress and cancellation of export
80 : : * \returns NoError for a successful export, or encountered error
81 : : */
82 : : static ExportError exportLayer( QgsVectorLayer *layer,
83 : : const QString &uri,
84 : : const QString &providerKey,
85 : : const QgsCoordinateReferenceSystem &destCRS,
86 : : bool onlySelected = false,
87 : : QString *errorMessage SIP_OUT = nullptr,
88 : : const QMap<QString, QVariant> &options = QMap<QString, QVariant>(),
89 : : QgsFeedback *feedback = nullptr
90 : : );
91 : :
92 : : /**
93 : : * Constructor for QgsVectorLayerExporter.
94 : : * \param uri URI for destination data source
95 : : * \param provider string key for destination data provider
96 : : * \param fields fields to include in created layer
97 : : * \param geometryType destination geometry type
98 : : * \param crs desired CRS, or an invalid (default constructed) CRS if
99 : : * not available
100 : : * \param overwrite set to TRUE to overwrite any existing data source
101 : : * \param options optional provider dataset options
102 : : * \param sinkFlags for how to add features
103 : : */
104 : : QgsVectorLayerExporter( const QString &uri,
105 : : const QString &provider,
106 : : const QgsFields &fields,
107 : : QgsWkbTypes::Type geometryType,
108 : : const QgsCoordinateReferenceSystem &crs,
109 : : bool overwrite = false,
110 : : const QMap<QString, QVariant> &options = QMap<QString, QVariant>(),
111 : : QgsFeatureSink::SinkFlags sinkFlags = QgsFeatureSink::SinkFlags() );
112 : :
113 : : //! QgsVectorLayerExporter cannot be copied
114 : : QgsVectorLayerExporter( const QgsVectorLayerExporter &rh ) = delete;
115 : : //! QgsVectorLayerExporter cannot be copied
116 : : QgsVectorLayerExporter &operator=( const QgsVectorLayerExporter &rh ) = delete;
117 : :
118 : : /**
119 : : * Returns any encountered error code, or FALSE if no error was encountered.
120 : : * \see errorMessage()
121 : : * \see errorCount()
122 : : */
123 : : ExportError errorCode() const;
124 : :
125 : : /**
126 : : * Returns any error message encountered during the export.
127 : : * \see errorCount()
128 : : * \see errorCode()
129 : : */
130 : : QString errorMessage() const;
131 : :
132 : : /**
133 : : * Returns the number of error messages encountered during the export.
134 : : * \see errorMessage()
135 : : * \see errorCode()
136 : : */
137 : 0 : int errorCount() const { return mErrorCount; }
138 : :
139 : : bool addFeatures( QgsFeatureList &features, QgsFeatureSink::Flags flags = QgsFeatureSink::Flags() ) override;
140 : : bool addFeature( QgsFeature &feature, QgsFeatureSink::Flags flags = QgsFeatureSink::Flags() ) override;
141 : : QString lastError() const override;
142 : :
143 : : /**
144 : : * Finalizes the export and closes the new created layer.
145 : : */
146 : : ~QgsVectorLayerExporter() override;
147 : :
148 : : bool flushBuffer() override;
149 : :
150 : : private:
151 : :
152 : : //! Create index
153 : : bool createSpatialIndex();
154 : :
155 : : //! Contains error value
156 : : ExportError mError;
157 : : QString mErrorMessage;
158 : :
159 : : int mErrorCount;
160 : :
161 : : QgsVectorDataProvider *mProvider = nullptr;
162 : :
163 : : //! Map attribute indexes to new field indexes
164 : : QMap<int, int> mOldToNewAttrIdx;
165 : : int mAttributeCount;
166 : :
167 : : QgsFeatureList mFeatureBuffer;
168 : : int mFeatureBufferMemoryUsage = 0;
169 : :
170 : : bool mCreateSpatialIndex = true;
171 : :
172 : : #ifdef SIP_RUN
173 : : QgsVectorLayerExporter( const QgsVectorLayerExporter &rh );
174 : : #endif
175 : :
176 : : };
177 : :
178 : :
179 : : /**
180 : : * \class QgsVectorLayerExporterTask
181 : : * \ingroup core
182 : : * \brief QgsTask task which performs a QgsVectorLayerExporter layer export operation as a background
183 : : * task. This can be used to export a vector layer out to a provider without blocking the
184 : : * QGIS interface.
185 : : * \see QgsVectorFileWriterTask
186 : : * \see QgsRasterFileWriterTask
187 : : * \since QGIS 3.0
188 : : */
189 : : class CORE_EXPORT QgsVectorLayerExporterTask : public QgsTask
190 : : {
191 : 0 : Q_OBJECT
192 : :
193 : : public:
194 : :
195 : : /**
196 : : * Constructor for QgsVectorLayerExporterTask. Takes a source \a layer, destination \a uri
197 : : * and \a providerKey, and various export related parameters such as destination CRS
198 : : * and export \a options. \a ownsLayer has to be set to TRUE if the task should take ownership
199 : : * of the layer and delete it after export.
200 : : */
201 : : QgsVectorLayerExporterTask( QgsVectorLayer *layer,
202 : : const QString &uri,
203 : : const QString &providerKey,
204 : : const QgsCoordinateReferenceSystem &destinationCrs,
205 : : const QMap<QString, QVariant> &options = QMap<QString, QVariant>(),
206 : : bool ownsLayer = false );
207 : :
208 : : /**
209 : : * Creates a new QgsVectorLayerExporterTask which has ownership over a source \a layer.
210 : : * When the export task has completed (successfully or otherwise) \a layer will be
211 : : * deleted. The destination \a uri and \a providerKey, and various export related parameters such as destination CRS
212 : : * and export \a options must be specified.
213 : : */
214 : : static QgsVectorLayerExporterTask *withLayerOwnership( QgsVectorLayer *layer SIP_TRANSFER,
215 : : const QString &uri,
216 : : const QString &providerKey,
217 : : const QgsCoordinateReferenceSystem &destinationCrs,
218 : : const QMap<QString, QVariant> &options = QMap<QString, QVariant>() ) SIP_FACTORY;
219 : :
220 : : void cancel() override;
221 : :
222 : : signals:
223 : :
224 : : /**
225 : : * Emitted when exporting the layer is successfully completed.
226 : : */
227 : : void exportComplete();
228 : :
229 : : /**
230 : : * Emitted when an error occurs which prevented the layer being exported (or if
231 : : * the task is canceled). The export \a error and \a errorMessage will be reported.
232 : : */
233 : : void errorOccurred( int error, const QString &errorMessage );
234 : :
235 : : protected:
236 : :
237 : : bool run() override;
238 : : void finished( bool result ) override;
239 : :
240 : : private:
241 : :
242 : : QPointer< QgsVectorLayer > mLayer = nullptr;
243 : : bool mOwnsLayer = false;
244 : :
245 : : QString mDestUri;
246 : : QString mDestProviderKey;
247 : : QgsCoordinateReferenceSystem mDestCrs;
248 : : QMap<QString, QVariant> mOptions;
249 : :
250 : : std::unique_ptr< QgsFeedback > mOwnedFeedback;
251 : :
252 : : QgsVectorLayerExporter::ExportError mError = QgsVectorLayerExporter::NoError;
253 : : QString mErrorMessage;
254 : :
255 : : };
256 : :
257 : : #endif // QGSVECTORLAYEREXPORTER_H
|