mirror of
https://github.com/qgis/QGIS.git
synced 2025-04-15 00:04:00 -04:00
[FEATURE] New expression function "attributes"
Returns a map containing all attributes from a feature, with field names as map keys. We've got featureful, robust support for working with maps in expressions now, so this allows rapid conversion of all feature attributes to a map to use with these handy functions.
This commit is contained in:
parent
99d6524407
commit
018ca7c447
14
resources/function_help/json/attributes
Normal file
14
resources/function_help/json/attributes
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"name": "attributes",
|
||||||
|
"type": "function",
|
||||||
|
"description": "Returns a map containing all attributes from a feature, with field names as map keys.",
|
||||||
|
"variants": [
|
||||||
|
{ "variant": "Variant 1",
|
||||||
|
"variant_description": "Returns a map of all attributes from the current feature.",
|
||||||
|
"examples": [ { "expression":"attributes()['name']", "returns":"value stored in 'name' attribute for the current feature"}] },
|
||||||
|
{ "variant": "Variant 2",
|
||||||
|
"variant_description": "Allows the target feature to be specified.",
|
||||||
|
"arguments": [ {"arg":"feature","description":"a feature"}],
|
||||||
|
"examples": [ { "expression":"attributes( @atlas_feature )['name']", "returns":"value stored in 'name' attribute for the current atlas feature"}] }
|
||||||
|
]
|
||||||
|
}
|
@ -1394,6 +1394,7 @@ static QVariant fcnFeature( const QVariantList &, const QgsExpressionContext *co
|
|||||||
|
|
||||||
return context->feature();
|
return context->feature();
|
||||||
}
|
}
|
||||||
|
|
||||||
static QVariant fcnAttribute( const QVariantList &values, const QgsExpressionContext *context, QgsExpression *parent, const QgsExpressionNodeFunction * )
|
static QVariant fcnAttribute( const QVariantList &values, const QgsExpressionContext *context, QgsExpression *parent, const QgsExpressionNodeFunction * )
|
||||||
{
|
{
|
||||||
QgsFeature feature;
|
QgsFeature feature;
|
||||||
@ -1417,6 +1418,28 @@ static QVariant fcnAttribute( const QVariantList &values, const QgsExpressionCon
|
|||||||
return feature.attribute( attr );
|
return feature.attribute( attr );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static QVariant fcnAttributes( const QVariantList &values, const QgsExpressionContext *context, QgsExpression *parent, const QgsExpressionNodeFunction * )
|
||||||
|
{
|
||||||
|
QgsFeature feature;
|
||||||
|
QString attr;
|
||||||
|
if ( values.size() == 0 || values.at( 0 ).isNull() )
|
||||||
|
{
|
||||||
|
feature = context->feature();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
feature = QgsExpressionUtils::getFeature( values.at( 0 ), parent );
|
||||||
|
}
|
||||||
|
|
||||||
|
const QgsFields fields = feature.fields();
|
||||||
|
QVariantMap result;
|
||||||
|
for ( int i = 0; i < fields.count(); ++i )
|
||||||
|
{
|
||||||
|
result.insert( fields.at( i ).name(), feature.attribute( i ) );
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
static QVariant fcnIsSelected( const QVariantList &values, const QgsExpressionContext *context, QgsExpression *parent, const QgsExpressionNodeFunction * )
|
static QVariant fcnIsSelected( const QVariantList &values, const QgsExpressionContext *context, QgsExpression *parent, const QgsExpressionNodeFunction * )
|
||||||
{
|
{
|
||||||
QgsVectorLayer *layer = nullptr;
|
QgsVectorLayer *layer = nullptr;
|
||||||
@ -5488,7 +5511,9 @@ const QList<QgsExpressionFunction *> &QgsExpression::Functions()
|
|||||||
fcnGetFeature, QStringLiteral( "Record and Attributes" ), QString(), false, QSet<QString>(), false, QStringList() << QStringLiteral( "QgsExpressionUtils::getFeature" ) )
|
fcnGetFeature, QStringLiteral( "Record and Attributes" ), QString(), false, QSet<QString>(), false, QStringList() << QStringLiteral( "QgsExpressionUtils::getFeature" ) )
|
||||||
<< new QgsStaticExpressionFunction( QStringLiteral( "get_feature_by_id" ), QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( QStringLiteral( "layer" ) )
|
<< new QgsStaticExpressionFunction( QStringLiteral( "get_feature_by_id" ), QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( QStringLiteral( "layer" ) )
|
||||||
<< QgsExpressionFunction::Parameter( QStringLiteral( "feature_id" ) ),
|
<< QgsExpressionFunction::Parameter( QStringLiteral( "feature_id" ) ),
|
||||||
fcnGetFeatureById, QStringLiteral( "Record and Attributes" ), QString(), false, QSet<QString>(), false );
|
fcnGetFeatureById, QStringLiteral( "Record and Attributes" ), QString(), false, QSet<QString>(), false )
|
||||||
|
<< new QgsStaticExpressionFunction( QStringLiteral( "attributes" ), QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( QStringLiteral( "feature" ), true ),
|
||||||
|
fcnAttributes, QStringLiteral( "Record and Attributes" ), QString(), false, QSet<QString>() << QgsFeatureRequest::ALL_ATTRIBUTES );
|
||||||
|
|
||||||
QgsStaticExpressionFunction *isSelectedFunc = new QgsStaticExpressionFunction(
|
QgsStaticExpressionFunction *isSelectedFunc = new QgsStaticExpressionFunction(
|
||||||
QStringLiteral( "is_selected" ),
|
QStringLiteral( "is_selected" ),
|
||||||
|
@ -1602,6 +1602,36 @@ class TestQgsExpression: public QObject
|
|||||||
QCOMPARE( v.toString(), QString( "test value" ) );
|
QCOMPARE( v.toString(), QString( "test value" ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void eval_feature_attributes()
|
||||||
|
{
|
||||||
|
QgsFeature f( 100 );
|
||||||
|
QgsFields fields;
|
||||||
|
fields.append( QgsField( QStringLiteral( "col1" ) ) );
|
||||||
|
fields.append( QgsField( QStringLiteral( "second_column" ), QVariant::Int ) );
|
||||||
|
f.setFields( fields, true );
|
||||||
|
f.setAttribute( QStringLiteral( "col1" ), QStringLiteral( "test value" ) );
|
||||||
|
f.setAttribute( QStringLiteral( "second_column" ), 5 );
|
||||||
|
QgsExpression exp( QStringLiteral( "attributes()['col1']" ) );
|
||||||
|
QgsExpressionContext context = QgsExpressionContextUtils::createFeatureBasedContext( f, QgsFields() );
|
||||||
|
QVariant v = exp.evaluate( &context );
|
||||||
|
QCOMPARE( v.toString(), QString( "test value" ) );
|
||||||
|
QgsExpression exp2( QStringLiteral( "attributes()['second_column']" ) );
|
||||||
|
v = exp2.evaluate( &context );
|
||||||
|
QCOMPARE( v.toInt(), 5 );
|
||||||
|
|
||||||
|
QgsExpression exp3( QStringLiteral( "attributes($currentfeature)['col1']" ) );
|
||||||
|
v = exp.evaluate( &context );
|
||||||
|
QCOMPARE( v.toString(), QString( "test value" ) );
|
||||||
|
QgsExpression exp4( QStringLiteral( "attributes($currentfeature)['second_column']" ) );
|
||||||
|
v = exp4.evaluate( &context );
|
||||||
|
QCOMPARE( v.toInt(), 5 );
|
||||||
|
|
||||||
|
QgsExpression exp5( QStringLiteral( "attributes('a')" ) );
|
||||||
|
v = exp5.evaluate( &context );
|
||||||
|
QVERIFY( v.isNull() );
|
||||||
|
QVERIFY( exp5.hasEvalError() );
|
||||||
|
}
|
||||||
|
|
||||||
void eval_get_feature_data()
|
void eval_get_feature_data()
|
||||||
{
|
{
|
||||||
QTest::addColumn<QString>( "string" );
|
QTest::addColumn<QString>( "string" );
|
||||||
|
Loading…
x
Reference in New Issue
Block a user