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.