90 if ( outputAttrs != OutputBA )
97 attrs.resize( outputAttrs == OutputA ? fieldsCountA : ( fieldsCountA + fieldsCountB ) );
99 if ( totalCount == 0 )
105 if ( outputAttrs == OutputBA )
121 if ( outputAttrs != OutputBA )
124 std::unique_ptr< QgsGeometryEngine > engine;
125 if ( !intersects.isEmpty() )
129 engine->prepareGeometry();
132 QVector<QgsGeometry> geometriesB;
144 if ( !geometriesB.isEmpty() )
159 if ( !sanitizeDifferenceResult( geom, geometryType ) )
163 switch ( outputAttrs )
169 for (
int i = 0; i < fieldsCountA; ++i )
170 attrs[i] = attrsA[i];
173 for (
int i = 0; i < fieldsCountA; ++i )
174 attrs[i + fieldsCountB] = attrsA[i];
190 feedback->
setProgress( count / (
double ) totalCount * 100. );
198 int attrCount = fieldIndicesA.count() + fieldIndicesB.count();
207 if ( totalCount == 0 )
228 std::unique_ptr< QgsGeometryEngine > engine;
229 if ( !intersects.isEmpty() )
233 engine->prepareGeometry();
238 for (
int i = 0; i < fieldIndicesA.count(); ++i )
239 outAttributes[i] = attrsA[fieldIndicesA[i]];
249 if ( !engine->intersects( tmpGeom.constGet() ) )
253 if ( !sanitizeIntersectionResult( intGeom, geometryType ) )
257 for (
int i = 0; i < fieldIndicesB.count(); ++i )
258 outAttributes[fieldIndicesA.count() + i] = attrsB[fieldIndicesB[i]];
266 feedback->
setProgress( count / (
double ) totalCount * 100. );
274 if ( totalCount == 0 )
293 QSet<QgsFeatureId> fids;
300 fids.insert( f.
id() );
303 QHash<QgsFeatureId, QgsGeometry> geometries;
305 QHash<QgsFeatureId, QList<QgsFeatureId> > intersectingIds;
317 std::unique_ptr< QgsGeometryEngine > g1engine;
319 geometries.insert( fid1, g1 );
323 const QList<QgsFeatureId> ids = index.
intersects( bbox );
333 g1engine->prepareGeometry();
337 if ( !g1engine->intersects( g2.
constGet() ) )
341 if ( !sanitizeIntersectionResult( geomIntersection, geometryType ) )
349 while ( fids.contains( newFid ) )
351 fids.insert( newFid );
353 geometries.insert( newFid, geomIntersection );
355 fx.setGeometry( geomIntersection );
361 QList<QgsFeatureId> lst;
362 if ( intersectingIds.contains( fid1 ) )
363 lst << intersectingIds.value( fid1 );
366 if ( intersectingIds.contains( fid2 ) )
367 lst << intersectingIds.value( fid2 );
370 intersectingIds.insert( newFid, lst );
379 geometries.remove( fid1 );
381 if ( sanitizeDifferenceResult( g12, geometryType ) )
383 geometries.insert( fid1, g12 );
386 f1x.setGeometry( g12 );
397 f2old.setGeometry( g2 );
400 geometries.remove( fid2 );
402 if ( sanitizeDifferenceResult( g21, geometryType ) )
404 geometries.insert( fid2, g21 );
407 f2x.setGeometry( g21 );
417 feedback->
setProgress( count / (
double ) totalCount * 100. );
427 QHash<QgsFeatureId, QgsAttributes> attributesHash;
439 for (
auto i = geometries.constBegin(); i != geometries.constEnd(); ++i )
445 outFeature.setGeometry( i.value() );
447 if ( intersectingIds.contains( i.key() ) )
449 const QList<QgsFeatureId> ids = intersectingIds.value( i.key() );
452 outFeature.setAttributes( attributesHash.value(
id ) );
458 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 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 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 id, geometry and a list of field/values...
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
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.
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