28  std::unique_ptr<QgsProcessingFeatureSource> source( parameterAsSource( parameters, QStringLiteral( 
"INPUT" ), context ) );
 
   39  outputs.insert( QStringLiteral( 
"OUTPUT" ), dest );
 
   41  const QStringList fields = parameterAsStrings( parameters, QStringLiteral( 
"FIELD" ), context );
 
   43  const long count = source->featureCount();
 
   51  const double step = count > 0 ? 100.0 / count : 1;
 
   54  if ( fields.isEmpty() )
 
   57    bool firstFeature = 
true;
 
   59    QVector<QgsGeometry> geomQueue;
 
   78        if ( maxQueueLength > 0 && geomQueue.length() > maxQueueLength )
 
   81          const QgsGeometry tempOutputGeometry = collector( geomQueue );
 
   83          geomQueue << tempOutputGeometry;
 
   91    if ( geomQueue.isEmpty() )
 
   97    else if ( !separateDisjoint )
 
   99      outputFeature.
setGeometry( collector( geomQueue ) );
 
  105      const QgsGeometry combinedGeometry = collector( geomQueue );
 
  109        partGeom.convertToMultiType();
 
  118    QList<int> fieldIndexes;
 
  119    fieldIndexes.reserve( fields.size() );
 
  120    for ( 
const QString &field : fields )
 
  122      const int index = source->fields().lookupField( field );
 
  124        fieldIndexes << index;
 
  127    QHash<QVariant, QgsAttributes> attributeHash;
 
  128    QHash<QVariant, QVector<QgsGeometry>> geometryHash;
 
  137      QVariantList indexAttributes;
 
  138      indexAttributes.reserve( fieldIndexes.size() );
 
  139      for ( 
const int index : std::as_const( fieldIndexes ) )
 
  144      if ( !attributeHash.contains( indexAttributes ) )
 
  147        attributeHash.insert( indexAttributes, f.
attributes() );
 
  152        geometryHash[indexAttributes].append( f.
geometry() );
 
  156    const int numberFeatures = attributeHash.count();
 
  157    QHash<QVariant, QgsAttributes>::const_iterator attrIt = attributeHash.constBegin();
 
  158    for ( ; attrIt != attributeHash.constEnd(); ++attrIt )
 
  167      auto geometryHashIt = geometryHash.find( attrIt.key() );
 
  168      if ( geometryHashIt != geometryHash.end() )
 
  170        QgsGeometry geom = collector( geometryHashIt.value() );
 
  175        if ( !separateDisjoint )
 
  186            partGeom.convertToMultiType();
 
  199      feedback->
setProgress( current * 100.0 / numberFeatures );
 
  214QString QgsDissolveAlgorithm::name()
 const 
  216  return QStringLiteral( 
"dissolve" );
 
  219QString QgsDissolveAlgorithm::displayName()
 const 
  221  return QObject::tr( 
"Dissolve" );
 
  224QStringList QgsDissolveAlgorithm::tags()
 const 
  226  return QObject::tr( 
"dissolve,union,combine,collect" ).split( 
',' );
 
  229QString QgsDissolveAlgorithm::group()
 const 
  231  return QObject::tr( 
"Vector geometry" );
 
  234QString QgsDissolveAlgorithm::groupId()
 const 
  236  return QStringLiteral( 
"vectorgeometry" );
 
  240void QgsDissolveAlgorithm::initAlgorithm( 
const QVariantMap & )
 
  245  auto disjointParam = std::make_unique<QgsProcessingParameterBoolean>( QStringLiteral( 
"SEPARATE_DISJOINT" ), QObject::tr( 
"Keep disjoint features separate" ), 
false );
 
  247  addParameter( disjointParam.release() );
 
  252QString QgsDissolveAlgorithm::shortHelpString()
 const 
  254  return QObject::tr( 
"This algorithm takes a vector layer and combines their features into new features. One or more attributes can " 
  255                      "be specified to dissolve features belonging to the same class (having the same value for the specified attributes), alternatively " 
  256                      "all features can be dissolved in a single one.\n\n" 
  257                      "All output geometries will be converted to multi geometries. " 
  258                      "In case the input is a polygon layer, common boundaries of adjacent polygons being dissolved will get erased.\n\n" 
  259                      "If enabled, the optional \"Keep disjoint features separate\" setting will cause features and parts that do not overlap or touch to be exported " 
  260                      "as separate features (instead of parts of a single multipart feature)." );
 
  263QString QgsDissolveAlgorithm::shortDescription()
 const 
  265  return QObject::tr( 
"Combines features of a vector layer into new features, optionally grouped by common attributes." );
 
  273QgsDissolveAlgorithm *QgsDissolveAlgorithm::createInstance()
 const 
  275  return new QgsDissolveAlgorithm();
 
  280  const bool separateDisjoint = parameterAsBool( parameters, QStringLiteral( 
"SEPARATE_DISJOINT" ), context );
 
  282  return processCollection( parameters, context, feedback, [&]( 
const QVector<QgsGeometry> &parts ) -> 
QgsGeometry {
 
  285      result = result.mergeLines();
 
  288    if ( ! result.lastError().isEmpty() && parts.count() >  2 )
 
  293      feedback->
pushDebugInfo( QObject::tr( 
"GEOS exception: taking the slower route ..." ) );
 
  295      for ( 
const auto &p : parts )
 
  299          result = result.mergeLines();
 
  304    if ( ! result.lastError().isEmpty() )
 
  307      if ( result.isEmpty() )
 
  317QString QgsCollectAlgorithm::name()
 const 
  319  return QStringLiteral( 
"collect" );
 
  322QString QgsCollectAlgorithm::displayName()
 const 
  324  return QObject::tr( 
"Collect geometries" );
 
  327QStringList QgsCollectAlgorithm::tags()
 const 
  329  return QObject::tr( 
"union,combine,collect,multipart,parts,single" ).split( 
',' );
 
  332QString QgsCollectAlgorithm::group()
 const 
  334  return QObject::tr( 
"Vector geometry" );
 
  337QString QgsCollectAlgorithm::groupId()
 const 
  339  return QStringLiteral( 
"vectorgeometry" );
 
  348void QgsCollectAlgorithm::initAlgorithm( 
const QVariantMap & )
 
  356QString QgsCollectAlgorithm::shortHelpString()
 const 
  358  return QObject::tr( 
"This algorithm takes a vector layer and collects its geometries into new multipart geometries. One or more attributes can " 
  359                      "be specified to collect only geometries belonging to the same class (having the same value for the specified attributes), alternatively " 
  360                      "all geometries can be collected." )
 
  361         + QStringLiteral( 
"\n\n" ) + QObject::tr( 
"All output geometries will be converted to multi geometries, even those with just a single part. " 
  362                                                   "This algorithm does not dissolve overlapping geometries - they will be collected together without modifying the shape of each geometry part." )
 
  363         + QStringLiteral( 
"\n\n" ) + QObject::tr( 
"See the 'Promote to multipart' or 'Aggregate' algorithms for alternative options." );
 
  366QString QgsCollectAlgorithm::shortDescription()
 const 
  368  return QObject::tr( 
"Collects geometries of a vector layer into new multipart geometries, optionally grouped by common attributes." );
 
  376QgsCollectAlgorithm *QgsCollectAlgorithm::createInstance()
 const 
  378  return new QgsCollectAlgorithm();
 
@ RegeneratesPrimaryKey
Algorithm always drops any existing primary keys or FID values and regenerates them in outputs.
 
QFlags< ProcessingAlgorithmDocumentationFlag > ProcessingAlgorithmDocumentationFlags
Flags describing algorithm behavior for documentation purposes.
 
@ SkipGeometryValidityChecks
Invalid geometry checks should always be skipped. This flag can be useful for algorithms which always...
 
@ Advanced
Parameter is an advanced parameter which should be hidden from users by default.
 
QFlags< ProcessingFeatureSourceFlag > ProcessingFeatureSourceFlags
Flags which control how QgsProcessingFeatureSource fetches features.
 
Wrapper for iterator of features from vector data provider or vector layer.
 
bool nextFeature(QgsFeature &f)
Fetch next feature and stores in f, returns true on success.
 
Wraps a request for features to a vector layer (or directly its vector data provider).
 
@ FastInsert
Use faster inserts, at the cost of updating the passed features to reflect changes made at the provid...
 
@ RegeneratePrimaryKey
This flag indicates, that a primary key field cannot be guaranteed to be unique and the sink should i...
 
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.
 
void clearGeometry()
Removes any geometry associated with the feature.
 
bool hasGeometry() const
Returns true if the feature has an associated geometry.
 
Q_INVOKABLE QVariant attribute(const QString &name) const
Lookup attribute value by attribute name.
 
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.
 
A geometry is the spatial representation of a feature.
 
QgsAbstractGeometry::const_part_iterator const_parts_begin() const
Returns STL-style const iterator pointing to the first part of the geometry.
 
static QgsGeometry collectGeometry(const QVector< QgsGeometry > &geometries)
Creates a new multipart geometry from a list of QgsGeometry objects.
 
bool isMultipart() const
Returns true if WKB of the geometry is of WKBMulti* type.
 
bool isEmpty() const
Returns true if the geometry is empty (eg a linestring with no vertices, or a collection with no geom...
 
QgsAbstractGeometry::const_part_iterator const_parts_end() const
Returns STL-style iterator pointing to the imaginary part after the last part of the geometry.
 
bool convertToMultiType()
Converts single type geometry into multitype geometry e.g.
 
static QgsGeometry unaryUnion(const QVector< QgsGeometry > &geometries, const QgsGeometryParameters ¶meters=QgsGeometryParameters())
Compute the unary union on a list of geometries.
 
Contains information about the context in which a processing algorithm is executed.
 
Custom exception class for processing related exceptions.
 
Base class for providing feedback from a processing algorithm.
 
virtual void pushDebugInfo(const QString &info)
Pushes an informational message containing debugging helpers from the algorithm.
 
virtual void reportError(const QString &error, bool fatalError=false)
Reports that the algorithm encountered an error while executing.
 
A feature sink output for processing algorithms.
 
An input feature source (such as vector layers) parameter for processing algorithms.
 
A vector layer or feature source field parameter for processing algorithms.
 
static Qgis::GeometryType geometryType(Qgis::WkbType type)
Returns the geometry type for a WKB type, e.g., both MultiPolygon and CurvePolygon would have a Polyg...
 
static Qgis::WkbType multiType(Qgis::WkbType type)
Returns the multi type for a WKB type.