22QString QgsAddUniqueValueIndexAlgorithm::name()
 const 
   24  return QStringLiteral( 
"adduniquevalueindexfield" );
 
   27QString QgsAddUniqueValueIndexAlgorithm::displayName()
 const 
   29  return QObject::tr( 
"Add unique value index field" );
 
   32QStringList QgsAddUniqueValueIndexAlgorithm::tags()
 const 
   34  return QObject::tr( 
"categorize,categories,category,reclassify,classes,create" ).split( 
',' );
 
   37QString QgsAddUniqueValueIndexAlgorithm::group()
 const 
   39  return QObject::tr( 
"Vector table" );
 
   42QString QgsAddUniqueValueIndexAlgorithm::groupId()
 const 
   44  return QStringLiteral( 
"vectortable" );
 
   47void QgsAddUniqueValueIndexAlgorithm::initAlgorithm( 
const QVariantMap & )
 
   54                QObject::tr( 
"Output field name" ), QStringLiteral( 
"NUM_FIELD" ) ) );
 
   56  std::unique_ptr< QgsProcessingParameterFeatureSink > classedOutput = std::make_unique< QgsProcessingParameterFeatureSink >( QStringLiteral( 
"OUTPUT" ), QObject::tr( 
"Layer with index field" ), 
QgsProcessing::TypeVectorAnyGeometry, QVariant(), 
true );
 
   57  classedOutput->setCreateByDefault( 
true );
 
   58  addParameter( classedOutput.release() );
 
   60  std::unique_ptr< QgsProcessingParameterFeatureSink > summaryOutput = std::make_unique< QgsProcessingParameterFeatureSink >( QStringLiteral( 
"SUMMARY_OUTPUT" ),  QObject::tr( 
"Class summary" ),
 
   62  summaryOutput->setCreateByDefault( 
false );
 
   63  addParameter( summaryOutput.release() );
 
   66QString QgsAddUniqueValueIndexAlgorithm::shortHelpString()
 const 
   68  return QObject::tr( 
"This algorithm takes a vector layer and an attribute and adds a new numeric field. Values in this field correspond to values in the specified attribute, so features with the same " 
   69                      "value for the attribute will have the same value in the new numeric field. This creates a numeric equivalent of the specified attribute, which defines the same classes.\n\n" 
   70                      "The new attribute is not added to the input layer but a new layer is generated instead.\n\n" 
   71                      "Optionally, a separate table can be output which contains a summary of the class field values mapped to the new unique numeric value." );
 
   74QgsAddUniqueValueIndexAlgorithm *QgsAddUniqueValueIndexAlgorithm::createInstance()
 const 
   76  return new QgsAddUniqueValueIndexAlgorithm();
 
   81  std::unique_ptr< QgsProcessingFeatureSource > source( parameterAsSource( parameters, QStringLiteral( 
"INPUT" ), context ) );
 
   85  const QString newFieldName = parameterAsString( parameters, QStringLiteral( 
"FIELD_NAME" ), context );
 
   91  std::unique_ptr< QgsFeatureSink > sink( parameterAsSink( parameters, QStringLiteral( 
"OUTPUT" ), context, dest, fields, source->wkbType(), source->sourceCrs() ) );
 
   93  const QString sourceFieldName = parameterAsString( parameters, QStringLiteral( 
"FIELD" ), context );
 
   94  const int fieldIndex = source->fields().lookupField( sourceFieldName );
 
  100  summaryFields.
append( newField );
 
  101  summaryFields.
append( source->fields().at( fieldIndex ) );
 
  102  std::unique_ptr< QgsFeatureSink > summarySink( parameterAsSink( parameters, QStringLiteral( 
"SUMMARY_OUTPUT" ), context, summaryDest, summaryFields, 
QgsWkbTypes::NoGeometry ) );
 
  104  QHash< QVariant, int > classes;
 
  108  const long count = source->featureCount();
 
  109  const double step = count > 0 ? 100.0 / count : 1;
 
  120    const QVariant clazz = attributes.at( fieldIndex );
 
  122    int thisValue = classes.value( clazz, -1 );
 
  123    if ( thisValue == -1 )
 
  125      thisValue = classes.count();
 
  126      classes.insert( clazz, thisValue );
 
  131      attributes.append( thisValue );
 
  144    QMap< int, QVariant > sorted;
 
  145    for ( 
auto classIt = classes.constBegin(); classIt != classes.constEnd(); ++classIt )
 
  147      sorted.insert( classIt.value(), classIt.key() );
 
  150    for ( 
auto sortedIt = sorted.constBegin(); sortedIt != sorted.constEnd(); ++sortedIt )
 
  155        throw QgsProcessingException( writeFeatureError( summarySink.get(), parameters, QStringLiteral( 
"SUMMARY_OUTPUT" ) ) );
 
  161    results.insert( QStringLiteral( 
"OUTPUT" ), dest );
 
  163    results.insert( QStringLiteral( 
"SUMMARY_OUTPUT" ), summaryDest );
 
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).
 
@ FastInsert
Use faster inserts, at the cost of updating the passed features to reflect changes made at the provid...
 
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 isCanceled() const SIP_HOLDGIL
Tells whether the operation has been canceled already.
 
void setProgress(double progress)
Sets the current progress for the feedback object.
 
Encapsulate a field in an attribute table or data source.
 
Container of fields for a vector layer.
 
bool append(const QgsField &field, FieldOrigin origin=OriginProvider, int originIndex=-1)
Appends a field. The field must have unique name, otherwise it is rejected (returns false)
 
Contains information about the context in which a processing algorithm is executed.
 
Custom exception class for processing related exceptions.
 
@ FlagSkipGeometryValidityChecks
Invalid geometry checks should always be skipped. This flag can be useful for algorithms which always...
 
Base class for providing feedback from a processing algorithm.
 
An input feature source (such as vector layers) parameter for processing algorithms.
 
A vector layer or feature source field parameter for processing algorithms.
 
A string parameter for processing algorithms.
 
@ TypeVector
Tables (i.e. vector layers with or without geometry). When used for a sink this indicates the sink ha...
 
@ TypeVectorAnyGeometry
Any vector layer with geometry.