22 QString QgsAddUniqueValueIndexAlgorithm::name()
const
24 return QStringLiteral(
"adduniquevalueindexfield" );
27 QString QgsAddUniqueValueIndexAlgorithm::displayName()
const
29 return QObject::tr(
"Add unique value index field" );
32 QStringList QgsAddUniqueValueIndexAlgorithm::tags()
const
34 return QObject::tr(
"categorize,categories,category,reclassify,classes,create" ).split(
',' );
37 QString QgsAddUniqueValueIndexAlgorithm::group()
const
39 return QObject::tr(
"Vector table" );
42 QString QgsAddUniqueValueIndexAlgorithm::groupId()
const
44 return QStringLiteral(
"vectortable" );
47 void 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() );
66 QString 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." );
74 QgsAddUniqueValueIndexAlgorithm *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 );