28QString QgsFixGeometryMultipartAlgorithm::name()
 const 
   30  return QStringLiteral( 
"fixgeometrymultipart" );
 
   33QString QgsFixGeometryMultipartAlgorithm::displayName()
 const 
   35  return QObject::tr( 
"Convert to strictly multipart" );
 
   38QString QgsFixGeometryMultipartAlgorithm::shortDescription()
 const 
   40  return QObject::tr( 
"Converts features detected with the \"Strictly multipart\" algorithm from the \"Check geometry\" section to singlepart." );
 
   43QStringList QgsFixGeometryMultipartAlgorithm::tags()
 const 
   45  return QObject::tr( 
"fix,multipart,singlepart" ).split( 
',' );
 
   48QString QgsFixGeometryMultipartAlgorithm::group()
 const 
   50  return QObject::tr( 
"Fix geometry" );
 
   53QString QgsFixGeometryMultipartAlgorithm::groupId()
 const 
   55  return QStringLiteral( 
"fixgeometry" );
 
   58QString QgsFixGeometryMultipartAlgorithm::shortHelpString()
 const 
   60  return QObject::tr( 
"This algorithm converts multipart geometries that consists of only one geometry " 
   61                      "into singlepart geometries, based on an error layer from the \"Strict multipart\" algorithm in the \"Check geometry\" section.\n\n" 
   62                      "This algorithm does not change the layer geometry type, which will remain multipart." );
 
   65QgsFixGeometryMultipartAlgorithm *QgsFixGeometryMultipartAlgorithm::createInstance()
 const 
   67  return new QgsFixGeometryMultipartAlgorithm();
 
   70void QgsFixGeometryMultipartAlgorithm::initAlgorithm( 
const QVariantMap &configuration )
 
   72  Q_UNUSED( configuration )
 
   82    QStringLiteral( 
"UNIQUE_ID" ), QObject::tr( 
"Field of original feature unique identifier" ),
 
   83    QStringLiteral( 
"id" ), QStringLiteral( 
"ERRORS" )
 
   94  std::unique_ptr<QgsProcessingParameterNumber> tolerance = std::make_unique<QgsProcessingParameterNumber>(
 
   98  tolerance->setHelp( QObject::tr( 
"The \"Tolerance\" advanced parameter defines the numerical precision of geometric operations, " 
   99                                   "given as an integer n, meaning that any difference smaller than 10⁻ⁿ (in map units) is considered zero." ) );
 
  100  addParameter( tolerance.release() );
 
  105  const std::unique_ptr<QgsProcessingFeatureSource> input( parameterAsSource( parameters, QStringLiteral( 
"INPUT" ), context ) );
 
  109  const std::unique_ptr<QgsProcessingFeatureSource> errors( parameterAsSource( parameters, QStringLiteral( 
"ERRORS" ), context ) );
 
  115  const QString featIdFieldName = parameterAsString( parameters, QStringLiteral( 
"UNIQUE_ID" ), context );
 
  118  if ( errors->fields().indexFromName( featIdFieldName ) == -1 )
 
  119    throw QgsProcessingException( QObject::tr( 
"Field \"%1\" does not exist in the error layer." ).arg( featIdFieldName ) );
 
  120  int inputIdFieldIndex = input->fields().indexFromName( featIdFieldName );
 
  121  if ( inputIdFieldIndex == -1 )
 
  122    throw QgsProcessingException( QObject::tr( 
"Field \"%1\" does not exist in input layer." ).arg( featIdFieldName ) );
 
  124  QgsField inputFeatIdField = input->fields().at( inputIdFieldIndex );
 
  125  if ( inputFeatIdField.
type() != errors->fields().at( errors->fields().indexFromName( featIdFieldName ) ).type() )
 
  126    throw QgsProcessingException( QObject::tr( 
"Field \"%1\" does not have the same type as in the error layer." ).arg( featIdFieldName ) );
 
  129  const std::unique_ptr<QgsFeatureSink> sink_output( parameterAsSink(
 
  130    parameters, QStringLiteral( 
"OUTPUT" ), context, dest_output, input->fields(), input->wkbType(), input->sourceCrs()
 
  136  QgsFields reportFields = errors->fields();
 
  137  reportFields.
append( 
QgsField( QStringLiteral( 
"report" ), QMetaType::QString ) );
 
  138  reportFields.
append( 
QgsField( QStringLiteral( 
"error_fixed" ), QMetaType::Bool ) );
 
  139  const std::unique_ptr<QgsFeatureSink> sink_report( parameterAsSink(
 
  140    parameters, QStringLiteral( 
"REPORT" ), context, dest_report, reportFields, errors->wkbType(), errors->sourceCrs()
 
  147  QStringList messages;
 
  153  QMap<QString, QgsFeaturePool *> featurePools;
 
  154  featurePools.insert( fixedLayer->
id(), &featurePool );
 
  156  QgsFeature errorFeature, inputFeature, testDuplicateIdFeature;
 
  158  QList<QgsGeometryCheck::Changes> changesList;
 
  161  long long progression = 0;
 
  162  long long totalProgression = errors->featureCount();
 
  163  multiStepFeedback.setCurrentStep( 1 );
 
  164  multiStepFeedback.setProgressText( QObject::tr( 
"Fixing errors..." ) );
 
  165  while ( errorFeaturesIt.
nextFeature( errorFeature ) )
 
  171    multiStepFeedback.setProgress( 
static_cast<double>( 
static_cast<long double>( progression ) / totalProgression ) * 100 );
 
  174    QString idValue = errorFeature.
attribute( featIdFieldName ).toString();
 
  175    if ( inputFeatIdField.
type() == QMetaType::QString )
 
  176      idValue = 
"'" + idValue + 
"'";
 
  180      reportFeature.
setAttributes( errorFeature.
attributes() << QObject::tr( 
"Source feature not found or invalid" ) << 
false );
 
  182    else if ( it.
nextFeature( testDuplicateIdFeature ) )
 
  183      throw QgsProcessingException( QObject::tr( 
"More than one feature found in input layer with value \"%1\" in unique field \"%2\"" ).arg( idValue ).arg( featIdFieldName ) );
 
  186      reportFeature.
setAttributes( errorFeature.
attributes() << QObject::tr( 
"Feature geometry is null" ) << 
false );
 
  197        checkError.handleChanges( changes );
 
  201      changesList << changes;
 
  204        resolutionMessage = QObject::tr( 
"Error is obsolete" );
 
  209      throw QgsProcessingException( writeFeatureError( sink_report.get(), parameters, QStringLiteral( 
"REPORT" ) ) );
 
  211  multiStepFeedback.setProgress( 100 );
 
  215  multiStepFeedback.setCurrentStep( 2 );
 
  216  multiStepFeedback.setProgressText( QObject::tr( 
"Exporting fixed layer..." ) );
 
  219  while ( fixedFeaturesIt.
nextFeature( fixedFeature ) )
 
  225    multiStepFeedback.setProgress( 
static_cast<double>( 
static_cast<long double>( progression ) / totalProgression ) * 100 );
 
  227      throw QgsProcessingException( writeFeatureError( sink_output.get(), parameters, QStringLiteral( 
"OUTPUT" ) ) );
 
  229  multiStepFeedback.setProgress( 100 );
 
  232  outputs.insert( QStringLiteral( 
"OUTPUT" ), dest_output );
 
  233  outputs.insert( QStringLiteral( 
"REPORT" ), dest_report );
 
  240  mTolerance = parameterAsInt( parameters, QStringLiteral( 
"TOLERANCE" ), context );
 
@ VectorAnyGeometry
Any vector layer with geometry.
 
@ VectorPoint
Vector point layers.
 
@ VectorPolygon
Vector polygon layers.
 
@ VectorLine
Vector line layers.
 
QFlags< ProcessingAlgorithmFlag > ProcessingAlgorithmFlags
Flags indicating how and when an algorithm operates and should be exposed to users.
 
@ NoThreading
Algorithm is not thread safe and cannot be run in a background thread, e.g. for algorithms which mani...
 
@ Advanced
Parameter is an advanced parameter which should be hidden from users by default.
 
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...
 
QgsVectorLayer * materialize(const QgsFeatureRequest &request, QgsFeedback *feedback=nullptr)
Materializes a request (query) made against this feature source, by running it over the source and re...
 
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 setFields(const QgsFields &fields, bool initAttributes=false)
Assigns a field map with the feature to allow attribute access by attribute name.
 
bool isValid() const
Returns the validity of this feature.
 
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.
 
Encapsulate a field in an attribute table or data source.
 
Container of fields for a vector layer.
 
bool append(const QgsField &field, Qgis::FieldOrigin origin=Qgis::FieldOrigin::Provider, int originIndex=-1)
Appends a field.
 
Base configuration for geometry checks.
 
This represents an error reported by a geometry check.
 
@ StatusFixed
The error is fixed.
 
@ StatusObsolete
The error is obsolete because of other modifications.
 
Status status() const
The status of the error.
 
QString resolutionMessage() const
A message with details, how the error has been resolved.
 
QMap< QString, QMap< QgsFeatureId, QList< QgsGeometryCheck::Change > > > Changes
A collection of changes.
 
A layer feature combination to uniquely identify and access a feature in a set of layers.
 
QgsPointXY asPoint() const
Returns the contents of the geometry as a 2-dimensional point.
 
virtual Qgis::ProcessingAlgorithmFlags flags() const
Returns the flags indicating how and when the algorithm operates and should be exposed to users.
 
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.
 
Processing feedback object for multi-step operations.
 
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.
 
Encapsulates a QGIS project, including sets of map layers and their styles, layouts,...
 
static QgsProject * instance()
Returns the QgsProject singleton instance.
 
QgsCoordinateTransformContext transformContext
 
A feature pool based on a vector data provider.
 
Represents a vector layer which manages a vector based dataset.
 
long long featureCount(const QString &legendKey) const
Number of features rendered with specified legend key.
 
QgsFeatureIterator getFeatures(const QgsFeatureRequest &request=QgsFeatureRequest()) const FINAL
Queries the layer for features specified in request.
 
Utility class for identifying a unique vertex within a geometry.