85 static QString writeFeatureError()
87 return QObject::tr(
"Could not write feature" );
95 if ( outputAttrs != OutputBA )
104 attrs.resize( outputAttrs == OutputA ? fieldsCountA : ( fieldsCountA + fieldsCountB ) );
106 if ( totalCount == 0 )
112 if ( outputAttrs == OutputBA )
128 if ( outputAttrs != OutputBA )
131 std::unique_ptr< QgsGeometryEngine > engine;
132 if ( !intersects.isEmpty() )
136 engine->prepareGeometry();
139 QVector<QgsGeometry> geometriesB;
151 if ( !geometriesB.isEmpty() )
166 if ( !sanitizeDifferenceResult( geom, geometryType ) )
170 switch ( outputAttrs )
176 for (
int i = 0; i < fieldsCountA; ++i )
177 attrs[i] = attrsA[i];
180 for (
int i = 0; i < fieldsCountA; ++i )
181 attrs[i + fieldsCountB] = attrsA[i];
199 feedback->
setProgress( count /
static_cast< double >( totalCount ) * 100. );
207 const int attrCount = fieldIndicesA.count() + fieldIndicesB.count();
218 if ( totalCount == 0 )
239 std::unique_ptr< QgsGeometryEngine > engine;
240 if ( !intersects.isEmpty() )
244 engine->prepareGeometry();
249 for (
int i = 0; i < fieldIndicesA.count(); ++i )
250 outAttributes[i] = attrsA[fieldIndicesA[i]];
260 if ( !engine->intersects( tmpGeom.constGet() ) )
264 if ( !sanitizeIntersectionResult( intGeom, geometryType ) )
268 for (
int i = 0; i < fieldIndicesB.count(); ++i )
269 outAttributes[fieldIndicesA.count() + i] = attrsB[fieldIndicesB[i]];
278 feedback->
setProgress( count /
static_cast<double >( totalCount ) * 100. );
286 if ( totalCount == 0 )
305 QSet<QgsFeatureId> fids;
312 fids.insert( f.
id() );
315 QHash<QgsFeatureId, QgsGeometry> geometries;
317 QHash<QgsFeatureId, QList<QgsFeatureId> > intersectingIds;
329 std::unique_ptr< QgsGeometryEngine > g1engine;
331 geometries.insert( fid1, g1 );
335 const QList<QgsFeatureId> ids = index.
intersects( bbox );
345 g1engine->prepareGeometry();
349 if ( !g1engine->intersects( g2.
constGet() ) )
353 if ( !sanitizeIntersectionResult( geomIntersection, geometryType ) )
361 while ( fids.contains( newFid ) )
363 fids.insert( newFid );
365 geometries.insert( newFid, geomIntersection );
367 fx.setGeometry( geomIntersection );
373 QList<QgsFeatureId> lst;
374 if ( intersectingIds.contains( fid1 ) )
375 lst << intersectingIds.value( fid1 );
378 if ( intersectingIds.contains( fid2 ) )
379 lst << intersectingIds.value( fid2 );
382 intersectingIds.insert( newFid, lst );
391 geometries.remove( fid1 );
393 if ( sanitizeDifferenceResult( g12, geometryType ) )
395 geometries.insert( fid1, g12 );
398 f1x.setGeometry( g12 );
409 f2old.setGeometry( g2 );
412 geometries.remove( fid2 );
414 if ( sanitizeDifferenceResult( g21, geometryType ) )
416 geometries.insert( fid2, g21 );
419 f2x.setGeometry( g21 );
429 feedback->
setProgress( count /
static_cast< double >( totalCount ) * 100. );
441 QHash<QgsFeatureId, QgsAttributes> attributesHash;
453 for (
auto i = geometries.constBegin(); i != geometries.constEnd(); ++i )
459 outFeature.setGeometry( i.value() );
461 if ( intersectingIds.contains( i.key() ) )
463 const QList<QgsFeatureId> ids = intersectingIds.value( i.key() );
466 outFeature.setAttributes( attributesHash.value(
id ) );
473 outFeature.setAttributes( attributesHash.value( i.key() ) );
Wrapper for iterator of features from vector data provider or vector layer.
bool nextFeature(QgsFeature &f)
This class wraps a request for features to a vector layer (or directly its vector data provider).
QgsFeatureRequest & setFilterFids(const QgsFeatureIds &fids)
Sets the feature IDs that should be fetched.
QgsFeatureRequest & setFlags(QgsFeatureRequest::Flags flags)
Sets flags that affect how features will be fetched.
QgsFeatureRequest & setSubsetOfAttributes(const QgsAttributeList &attrs)
Set a subset of attributes that will be fetched.
QgsFeatureRequest & setDestinationCrs(const QgsCoordinateReferenceSystem &crs, const QgsCoordinateTransformContext &context)
Sets the destination crs for feature's geometries.
@ NoGeometry
Geometry is not required. It may still be returned if e.g. required for a filter condition.
QgsFeatureRequest & setNoAttributes()
Set that no attributes will be fetched.
QgsFeatureRequest & setInvalidGeometryCheck(InvalidGeometryCheck check)
Sets invalid geometry checking behavior.
An interface for objects which accept features via addFeature(s) methods.
virtual bool addFeature(QgsFeature &feature, QgsFeatureSink::Flags flags=QgsFeatureSink::Flags())
Adds a single feature to the sink.
@ FastInsert
Use faster inserts, at the cost of updating the passed features to reflect changes made at the provid...
An interface for objects which provide features via a getFeatures method.
virtual QgsFields fields() const =0
Returns the fields associated with features in the source.
virtual QgsCoordinateReferenceSystem sourceCrs() const =0
Returns the coordinate reference system for features in the source.
virtual QgsWkbTypes::Type wkbType() const =0
Returns the geometry type for features returned by this source.
virtual QgsFeatureIterator getFeatures(const QgsFeatureRequest &request=QgsFeatureRequest()) const =0
Returns an iterator for the features in the source.
virtual long long featureCount() const =0
Returns the number of features contained in the source, or -1 if the feature count is unknown.
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
void setAttributes(const QgsAttributes &attrs)
Sets the feature's attributes.
bool hasGeometry() const
Returns true if the feature has an associated geometry.
void setGeometry(const QgsGeometry &geometry)
Set the feature's geometry.
bool isCanceled() const SIP_HOLDGIL
Tells whether the operation has been canceled already.
void setProgress(double progress)
Sets the current progress for the feedback object.
int count() const
Returns number of items.
A geometry is the spatial representation of a feature.
const QgsAbstractGeometry * constGet() const SIP_HOLDGIL
Returns a non-modifiable (const) reference to the underlying abstract geometry primitive.
QgsWkbTypes::Type wkbType() const SIP_HOLDGIL
Returns type of the geometry as a WKB type (point / linestring / polygon etc.)
QgsGeometry difference(const QgsGeometry &geometry) const
Returns a geometry representing the points making up this geometry that do not make up other.
static QgsGeometry unaryUnion(const QVector< QgsGeometry > &geometries)
Compute the unary union on a list of geometries.
QgsGeometry intersection(const QgsGeometry &geometry) const
Returns a geometry representing the points shared by this geometry and other.
static QgsGeometryEngine * createGeometryEngine(const QgsAbstractGeometry *geometry)
Creates and returns a new geometry engine representing the specified geometry.
QString lastError() const SIP_HOLDGIL
Returns an error string referring to the last error encountered either when this geometry was created...
bool isEmpty() const
Returns true if the geometry is empty (eg a linestring with no vertices, or a collection with no geom...
bool convertToMultiType()
Converts single type geometry into multitype geometry e.g.
QgsRectangle boundingBox() const
Returns the bounding box of the geometry.
bool convertGeometryCollectionToSubclass(QgsWkbTypes::GeometryType geomType)
Converts geometry collection to a the desired geometry type subclass (multi-point,...
Contains information about the context in which a processing algorithm is executed.
QgsCoordinateTransformContext transformContext() const
Returns the coordinate transform context.
QgsFeatureRequest::InvalidGeometryCheck invalidGeometryCheck() const
Returns the behavior used for checking invalid geometries in input layers.
Custom exception class for processing related exceptions.
Base class for providing feedback from a processing algorithm.
A rectangle specified with double values.
A spatial index for QgsFeature objects.
QList< QgsFeatureId > intersects(const QgsRectangle &rectangle) const
Returns a list of features with a bounding box which intersects the specified rectangle.
bool addFeature(QgsFeature &feature, QgsFeatureSink::Flags flags=QgsFeatureSink::Flags()) override
Adds a feature to the index.
bool deleteFeature(const QgsFeature &feature)
Removes a feature from the index.
static GeometryType geometryType(Type type) SIP_HOLDGIL
Returns the geometry type for a WKB type, e.g., both MultiPolygon and CurvePolygon would have a Polyg...
GeometryType
The geometry types are used to group QgsWkbTypes::Type in a coarse way.
static Type flatType(Type type) SIP_HOLDGIL
Returns the flat type for a WKB type.
static Type multiType(Type type) SIP_HOLDGIL
Returns the multi type for a WKB type.
QSet< QgsFeatureId > QgsFeatureIds
qint64 QgsFeatureId
64 bit feature ids negative numbers are used for uncommitted/newly added features