70#include <QCryptographicHash>
71#include <QMimeDatabase>
72#include <QProcessEnvironment>
73#include <QRegularExpression>
78using namespace Qt::StringLiterals;
93 QVariantList argValues;
97 const QList< QgsExpressionNode * > argList = args->
list();
98 argValues.resize( argList.size() );
99 QVariant *outArg = argValues.data();
105 *outArg = QVariant::fromValue( n );
109 *outArg = n->eval( parent, context );
111 bool defaultParamIsNull = mParameterList.count() > arg && mParameterList.at( arg ).optional() && !mParameterList.at( arg ).defaultValue().isValid();
112 if ( QgsExpressionUtils::isNull( *outArg ) && !defaultParamIsNull && !
handlesNull() )
120 return func( argValues, context, parent, node );
131 return QStringList();
158 return mGroups.isEmpty() ? false : mGroups.contains( u
"deprecated"_s );
163 return ( QString::compare( mName, other.mName, Qt::CaseInsensitive ) == 0 );
174 const QString &fnname,
177 const QString &group,
178 const QString &helpText,
182 const QStringList &aliases,
187 , mAliases( aliases )
188 , mUsesGeometry( false )
189 , mUsesGeometryFunc( usesGeometry )
190 , mReferencedColumnsFunc( referencedColumns )
201 if ( mUsesGeometryFunc )
202 return mUsesGeometryFunc( node );
204 return mUsesGeometry;
214 if ( mReferencedColumnsFunc )
215 return mReferencedColumnsFunc( node );
217 return mReferencedColumns;
223 return mIsStaticFunc( node, parent, context );
231 return mPrepareFunc( node, parent, context );
243 mIsStaticFunc =
nullptr;
249 mPrepareFunc = prepareFunc;
254 if ( node && node->
args() )
256 const QList< QgsExpressionNode * > argList = node->
args()->
list();
259 if ( !argNode->isStatic( parent, context ) )
269 double start = QgsExpressionUtils::getDoubleValue( values.at( 0 ), parent );
270 double stop = QgsExpressionUtils::getDoubleValue( values.at( 1 ), parent );
271 double step = QgsExpressionUtils::getDoubleValue( values.at( 2 ), parent );
273 if ( step == 0.0 || ( step > 0.0 && start > stop ) || ( step < 0.0 && start < stop ) )
280 double current = start + step;
281 while ( ( ( step > 0.0 && current <= stop ) || ( step < 0.0 && current >= stop ) ) && length <= 1000000 )
304 return QVariant::fromValue( geom );
315 const QString name = QgsExpressionUtils::getStringValue( values.at( 0 ), parent );
317 if ( name ==
"feature"_L1 )
319 return context->
hasFeature() ? QVariant::fromValue( context->
feature() ) : QVariant();
321 else if ( name ==
"id"_L1 )
323 return context->
hasFeature() ? QVariant::fromValue( context->
feature().
id() ) : QVariant();
325 else if ( name ==
"geometry"_L1 )
327 return fcnGeometry( values, context, parent, node );
337 QString templateString = QgsExpressionUtils::getStringValue( values.at( 0 ), parent );
346 QString expString = QgsExpressionUtils::getStringValue( values.at( 0 ), parent );
348 return expression.evaluate( context );
353 double x = QgsExpressionUtils::getDoubleValue( values.at( 0 ), parent );
354 return QVariant( std::sqrt( x ) );
359 double val = QgsExpressionUtils::getDoubleValue( values.at( 0 ), parent );
360 return QVariant( std::fabs( val ) );
365 double deg = QgsExpressionUtils::getDoubleValue( values.at( 0 ), parent );
366 return ( deg * M_PI ) / 180;
370 double rad = QgsExpressionUtils::getDoubleValue( values.at( 0 ), parent );
371 return ( 180 * rad ) / M_PI;
375 double x = QgsExpressionUtils::getDoubleValue( values.at( 0 ), parent );
376 return QVariant( std::sin( x ) );
380 double x = QgsExpressionUtils::getDoubleValue( values.at( 0 ), parent );
381 return QVariant( std::cos( x ) );
385 double x = QgsExpressionUtils::getDoubleValue( values.at( 0 ), parent );
386 return QVariant( std::tan( x ) );
390 double x = QgsExpressionUtils::getDoubleValue( values.at( 0 ), parent );
391 return QVariant( std::asin( x ) );
395 double x = QgsExpressionUtils::getDoubleValue( values.at( 0 ), parent );
396 return QVariant( std::acos( x ) );
400 double x = QgsExpressionUtils::getDoubleValue( values.at( 0 ), parent );
401 return QVariant( std::atan( x ) );
405 double y = QgsExpressionUtils::getDoubleValue( values.at( 0 ), parent );
406 double x = QgsExpressionUtils::getDoubleValue( values.at( 1 ), parent );
407 return QVariant( std::atan2( y, x ) );
411 double x = QgsExpressionUtils::getDoubleValue( values.at( 0 ), parent );
412 return QVariant( std::exp( x ) );
416 double x = QgsExpressionUtils::getDoubleValue( values.at( 0 ), parent );
419 return QVariant( std::log( x ) );
423 double x = QgsExpressionUtils::getDoubleValue( values.at( 0 ), parent );
426 return QVariant( log10( x ) );
430 double b = QgsExpressionUtils::getDoubleValue( values.at( 0 ), parent );
431 double x = QgsExpressionUtils::getDoubleValue( values.at( 1 ), parent );
432 if ( x <= 0 || b <= 0 )
434 return QVariant( std::log( x ) / std::log( b ) );
438 double min = QgsExpressionUtils::getDoubleValue( values.at( 0 ), parent );
439 double max = QgsExpressionUtils::getDoubleValue( values.at( 1 ), parent );
443 std::random_device rd;
444 std::mt19937_64 generator( rd() );
446 if ( !QgsExpressionUtils::isNull( values.at( 2 ) ) )
449 if ( QgsExpressionUtils::isIntSafe( values.at( 2 ) ) )
452 seed = QgsExpressionUtils::getIntValue( values.at( 2 ), parent );
457 QString seedStr = QgsExpressionUtils::getStringValue( values.at( 2 ), parent );
458 std::hash<std::string> hasher;
459 seed = hasher( seedStr.toStdString() );
461 generator.seed( seed );
465 double f =
static_cast< double >( generator() ) /
static_cast< double >( std::mt19937_64::max() );
466 return QVariant( min + f * ( max - min ) );
470 qlonglong min = QgsExpressionUtils::getIntValue( values.at( 0 ), parent );
471 qlonglong max = QgsExpressionUtils::getIntValue( values.at( 1 ), parent );
475 std::random_device rd;
476 std::mt19937_64 generator( rd() );
478 if ( !QgsExpressionUtils::isNull( values.at( 2 ) ) )
481 if ( QgsExpressionUtils::isIntSafe( values.at( 2 ) ) )
484 seed = QgsExpressionUtils::getIntValue( values.at( 2 ), parent );
489 QString seedStr = QgsExpressionUtils::getStringValue( values.at( 2 ), parent );
490 std::hash<std::string> hasher;
491 seed = hasher( seedStr.toStdString() );
493 generator.seed( seed );
496 qint64 randomInteger = min + ( generator() % ( max - min + 1 ) );
497 if ( randomInteger > std::numeric_limits<int>::max() || randomInteger < -std::numeric_limits<int>::max() )
498 return QVariant( randomInteger );
501 return QVariant(
int( randomInteger ) );
506 double val = QgsExpressionUtils::getDoubleValue( values.at( 0 ), parent );
507 double domainMin = QgsExpressionUtils::getDoubleValue( values.at( 1 ), parent );
508 double domainMax = QgsExpressionUtils::getDoubleValue( values.at( 2 ), parent );
509 double rangeMin = QgsExpressionUtils::getDoubleValue( values.at( 3 ), parent );
510 double rangeMax = QgsExpressionUtils::getDoubleValue( values.at( 4 ), parent );
512 if ( domainMin >= domainMax )
514 parent->
setEvalErrorString( QObject::tr(
"Domain max must be greater than domain min" ) );
519 if ( val >= domainMax )
523 else if ( val <= domainMin )
529 double m = ( rangeMax - rangeMin ) / ( domainMax - domainMin );
530 double c = rangeMin - ( domainMin * m );
533 return QVariant( m * val +
c );
538 double val = QgsExpressionUtils::getDoubleValue( values.at( 0 ), parent );
539 double domainMin = QgsExpressionUtils::getDoubleValue( values.at( 1 ), parent );
540 double domainMax = QgsExpressionUtils::getDoubleValue( values.at( 2 ), parent );
541 double rangeMin = QgsExpressionUtils::getDoubleValue( values.at( 3 ), parent );
542 double rangeMax = QgsExpressionUtils::getDoubleValue( values.at( 4 ), parent );
543 double exponent = QgsExpressionUtils::getDoubleValue( values.at( 5 ), parent );
545 if ( domainMin >= domainMax )
547 parent->
setEvalErrorString( QObject::tr(
"Domain max must be greater than domain min" ) );
557 if ( val >= domainMax )
561 else if ( val <= domainMin )
567 return QVariant( ( ( rangeMax - rangeMin ) / std::pow( domainMax - domainMin, exponent ) ) * std::pow( val - domainMin, exponent ) + rangeMin );
572 double val = QgsExpressionUtils::getDoubleValue( values.at( 0 ), parent );
573 double domainMin = QgsExpressionUtils::getDoubleValue( values.at( 1 ), parent );
574 double domainMax = QgsExpressionUtils::getDoubleValue( values.at( 2 ), parent );
575 double rangeMin = QgsExpressionUtils::getDoubleValue( values.at( 3 ), parent );
576 double rangeMax = QgsExpressionUtils::getDoubleValue( values.at( 4 ), parent );
577 double exponent = QgsExpressionUtils::getDoubleValue( values.at( 5 ), parent );
579 if ( domainMin >= domainMax )
581 parent->
setEvalErrorString( QObject::tr(
"Domain max must be greater than domain min" ) );
591 if ( val >= domainMax )
595 else if ( val <= domainMin )
601 double ratio = ( std::pow( exponent, val - domainMin ) - 1 ) / ( std::pow( exponent, domainMax - domainMin ) - 1 );
602 return QVariant( ( rangeMax - rangeMin ) * ratio + rangeMin );
607 const double val = QgsExpressionUtils::getDoubleValue( values.at( 0 ), parent );
608 const double domainMin = QgsExpressionUtils::getDoubleValue( values.at( 1 ), parent );
609 const double domainMax = QgsExpressionUtils::getDoubleValue( values.at( 2 ), parent );
610 const double rangeMin = QgsExpressionUtils::getDoubleValue( values.at( 3 ), parent );
611 const double rangeMax = QgsExpressionUtils::getDoubleValue( values.at( 4 ), parent );
613 const double x1 = QgsExpressionUtils::getDoubleValue( values.at( 5 ), parent );
614 const double y1 = QgsExpressionUtils::getDoubleValue( values.at( 6 ), parent );
615 const double x2 = QgsExpressionUtils::getDoubleValue( values.at( 7 ), parent );
616 const double y2 = QgsExpressionUtils::getDoubleValue( values.at( 8 ), parent );
618 if ( x1 < 0.0 || x1 > 1.0 || y1 < 0.0 || y1 > 1.0 || x2 < 0.0 || x2 > 1.0 || y2 < 0.0 || y2 > 1.0 )
620 parent->
setEvalErrorString( QObject::tr(
"Cubic bezier control points must be between 0 and 1" ) );
624 if ( domainMin >= domainMax )
626 parent->
setEvalErrorString( QObject::tr(
"Domain max must be greater than domain min" ) );
631 if ( val >= domainMax )
635 else if ( val <= domainMin )
641 const double t = ( val - domainMin ) / ( domainMax - domainMin );
644 const double cx = 3.0 * x1;
645 const double bx = 3.0 * ( x2 - x1 ) - cx;
646 const double ax = 1.0 - cx - bx;
647 const double cy = 3.0 * y1;
648 const double by = 3.0 * ( y2 - y1 ) - cy;
649 const double ay = 1.0 - cy - by;
651 constexpr double epsilon = 1e-6;
656 for (
int i = 0; i < 8; ++i )
658 const double x2val = ( ( ax * s + bx ) * s + cx ) * s - t;
659 if ( std::fabs( x2val ) < epsilon )
664 const double d2 = ( 3.0 * ax * s + 2.0 * bx ) * s + cx;
665 if ( std::fabs( d2 ) < 1e-6 )
688 while ( !solved && t0 < t1 )
690 const double x2val = ( ( ax * s + bx ) * s + cx ) * s;
691 if ( std::fabs( x2val - t ) < epsilon )
700 s = ( t1 - t0 ) * 0.5 + t0;
704 const double easedT = ( ( ay * s + by ) * s + cy ) * s;
705 return QVariant( ( rangeMax - rangeMin ) * easedT + rangeMin );
711 double maxVal = std::numeric_limits<double>::quiet_NaN();
712 for (
const QVariant &val : values )
715 if ( std::isnan( maxVal ) )
719 else if ( !std::isnan( testVal ) )
721 maxVal = std::max( maxVal, testVal );
725 if ( !std::isnan( maxVal ) )
727 result = QVariant( maxVal );
735 double minVal = std::numeric_limits<double>::quiet_NaN();
736 for (
const QVariant &val : values )
739 if ( std::isnan( minVal ) )
743 else if ( !std::isnan( testVal ) )
745 minVal = std::min( minVal, testVal );
749 if ( !std::isnan( minVal ) )
751 result = QVariant( minVal );
763 QVariant value = node->
eval( parent, context );
768 QgsVectorLayer *vl = QgsExpressionUtils::getVectorLayer( value, context, parent );
772 parent->
setEvalErrorString( QObject::tr(
"Cannot find layer with name or ID '%1'" ).arg( value.toString() ) );
777 node = QgsExpressionUtils::getNode( values.at( 1 ), parent );
779 value = node->
eval( parent, context );
785 parent->
setEvalErrorString( QObject::tr(
"No such aggregate '%1'" ).arg( value.toString() ) );
790 node = QgsExpressionUtils::getNode( values.at( 2 ), parent );
792 QString subExpression = node->
dump();
796 if ( values.count() > 3 )
798 node = QgsExpressionUtils::getNode( values.at( 3 ), parent );
801 if ( !nl || nl->value().isValid() )
806 if ( values.count() > 4 )
808 node = QgsExpressionUtils::getNode( values.at( 4 ), parent );
810 value = node->
eval( parent, context );
817 if ( values.count() > 5 )
819 node = QgsExpressionUtils::getNode( values.at( 5 ), parent );
822 if ( !nl || nl->value().isValid() )
824 orderBy = node->
dump();
829 QString aggregateError;
837 const QSet< QString > filterVars = filterExp.referencedVariables();
838 const QSet< QString > subExpVars = subExp.referencedVariables();
839 QSet<QString> allVars = filterVars + subExpVars;
841 bool isStatic =
true;
842 if ( filterVars.contains( u
"parent"_s ) || filterVars.contains( QString() ) || subExpVars.contains( u
"parent"_s ) || subExpVars.contains( QString() ) )
848 for (
const QString &varName : allVars )
851 if ( scope && !scope->
isStatic( varName ) )
859 if ( isStatic && !parameters.
orderBy.isEmpty() )
861 for (
const auto &orderByClause : std::as_const( parameters.
orderBy ) )
863 const QgsExpression &orderByExpression { orderByClause.expression() };
875 const QString contextHash = context->
uniqueHash( ok, allVars );
878 cacheKey = u
"aggfcn:%1:%2:%3:%4:%5:%6"_s.arg( vl->id(), QString::number(
static_cast< int >( aggregate ) ), subExpression, parameters.
filter, orderBy, contextHash );
883 cacheKey = u
"aggfcn:%1:%2:%3:%4:%5"_s.arg( vl->id(), QString::number(
static_cast< int >( aggregate ) ), subExpression, parameters.
filter, orderBy );
894 subContext.appendScope( subScope );
895 result = vl->aggregate( aggregate, subExpression, parameters, &subContext, &ok,
nullptr, context->
feedback(), &aggregateError );
907 result = vl->aggregate( aggregate, subExpression, parameters,
nullptr, &ok,
nullptr,
nullptr, &aggregateError );
911 if ( !aggregateError.isEmpty() )
912 parent->
setEvalErrorString( QObject::tr(
"Could not calculate aggregate for: %1 (%2)" ).arg( subExpression, aggregateError ) );
914 parent->
setEvalErrorString( QObject::tr(
"Could not calculate aggregate for: %1" ).arg( subExpression ) );
925 parent->
setEvalErrorString( QObject::tr(
"Cannot use relation aggregate function in this context" ) );
933 QgsVectorLayer *vl = QgsExpressionUtils::getVectorLayer( context->
variable( u
"layer"_s ), context, parent );
937 parent->
setEvalErrorString( QObject::tr(
"Cannot use relation aggregate function in this context" ) );
946 QVariant value = node->
eval( parent, context );
948 QString relationId = value.toString();
954 parent->
setEvalErrorString( QObject::tr(
"Cannot use relation aggregate function in this context" ) );
965 if ( relations.isEmpty() || relations.at( 0 ).referencedLayer() != vl )
967 parent->
setEvalErrorString( QObject::tr(
"Cannot find relation with id '%1'" ).arg( relationId ) );
972 relation = relations.at( 0 );
979 node = QgsExpressionUtils::getNode( values.at( 1 ), parent );
981 value = node->
eval( parent, context );
987 parent->
setEvalErrorString( QObject::tr(
"No such aggregate '%1'" ).arg( value.toString() ) );
992 node = QgsExpressionUtils::getNode( values.at( 2 ), parent );
994 QString subExpression = node->
dump();
998 if ( values.count() > 3 )
1000 node = QgsExpressionUtils::getNode( values.at( 3 ), parent );
1002 value = node->
eval( parent, context );
1004 parameters.
delimiter = value.toString();
1009 if ( values.count() > 4 )
1011 node = QgsExpressionUtils::getNode( values.at( 4 ), parent );
1014 if ( !nl || nl->value().isValid() )
1016 orderBy = node->
dump();
1027 const QString
cacheKey = u
"relagg:%1%:%2:%3:%4:%5:%6"_s.arg( relationId, vl->id(), QString::number(
static_cast< int >( aggregate ) ), subExpression, parameters.
filter, orderBy );
1037 result = childLayer->
aggregate( aggregate, subExpression, parameters, &subContext, &ok,
nullptr, context->
feedback(), &error );
1041 if ( !error.isEmpty() )
1042 parent->
setEvalErrorString( QObject::tr(
"Could not calculate aggregate for: %1 (%2)" ).arg( subExpression, error ) );
1044 parent->
setEvalErrorString( QObject::tr(
"Could not calculate aggregate for: %1" ).arg( subExpression ) );
1054static QVariant fcnAggregateGeneric(
1060 parent->
setEvalErrorString( QObject::tr(
"Cannot use aggregate function in this context" ) );
1068 QgsVectorLayer *vl = QgsExpressionUtils::getVectorLayer( context->
variable( u
"layer"_s ), context, parent );
1072 parent->
setEvalErrorString( QObject::tr(
"Cannot use aggregate function in this context" ) );
1079 QgsExpressionNode *node = QgsExpressionUtils::getNode( values.at( 0 ), parent );
1081 QString subExpression = node->
dump();
1085 if ( values.count() > 1 )
1087 node = QgsExpressionUtils::getNode( values.at( 1 ), parent );
1090 if ( !nl || nl->value().isValid() )
1091 groupBy = node->
dump();
1095 if ( values.count() > 2 )
1097 node = QgsExpressionUtils::getNode( values.at( 2 ), parent );
1100 if ( !nl || nl->value().isValid() )
1106 if ( orderByPos >= 0 && values.count() > orderByPos )
1108 node = QgsExpressionUtils::getNode( values.at( orderByPos ), parent );
1111 if ( !nl || nl->value().isValid() )
1113 orderBy = node->
dump();
1121 if ( !groupBy.isEmpty() )
1124 QVariant groupByValue = groupByExp.evaluate( context );
1126 if ( !parameters.
filter.isEmpty() )
1127 parameters.
filter = u
"(%1) AND (%2)"_s.arg( parameters.
filter, groupByClause );
1129 parameters.
filter = groupByClause;
1135 bool isStatic =
true;
1136 const QSet<QString> refVars = filterExp.referencedVariables() + subExp.referencedVariables();
1137 for (
const QString &varName : refVars )
1140 if ( scope && !scope->
isStatic( varName ) )
1151 const QString contextHash = context->
uniqueHash( ok, refVars );
1154 cacheKey = u
"agg:%1:%2:%3:%4:%5:%6"_s.arg( vl->id(), QString::number(
static_cast< int >( aggregate ) ), subExpression, parameters.
filter, orderBy, contextHash );
1159 cacheKey = u
"agg:%1:%2:%3:%4:%5"_s.arg( vl->id(), QString::number(
static_cast< int >( aggregate ) ), subExpression, parameters.
filter, orderBy );
1171 subContext.appendScope( subScope );
1173 result = vl->aggregate( aggregate, subExpression, parameters, &subContext, &ok,
nullptr, context->
feedback(), &error );
1177 if ( !error.isEmpty() )
1178 parent->
setEvalErrorString( QObject::tr(
"Could not calculate aggregate for: %1 (%2)" ).arg( subExpression, error ) );
1180 parent->
setEvalErrorString( QObject::tr(
"Could not calculate aggregate for: %1" ).arg( subExpression ) );
1285 if ( values.count() > 3 )
1287 QgsExpressionNode *node = QgsExpressionUtils::getNode( values.at( 3 ), parent );
1289 QVariant value = node->
eval( parent, context );
1291 parameters.
delimiter = value.toString();
1302 if ( values.count() > 3 )
1304 QgsExpressionNode *node = QgsExpressionUtils::getNode( values.at( 3 ), parent );
1306 QVariant value = node->
eval( parent, context );
1308 parameters.
delimiter = value.toString();
1324 QVariant scale = context->
variable( u
"map_scale"_s );
1329 const double v = scale.toDouble( &ok );
1337 double minValue = QgsExpressionUtils::getDoubleValue( values.at( 0 ), parent );
1338 double testValue = QgsExpressionUtils::getDoubleValue( values.at( 1 ), parent );
1339 double maxValue = QgsExpressionUtils::getDoubleValue( values.at( 2 ), parent );
1342 if ( testValue <= minValue )
1344 return QVariant( minValue );
1346 else if ( testValue >= maxValue )
1348 return QVariant( maxValue );
1352 return QVariant( testValue );
1358 double x = QgsExpressionUtils::getDoubleValue( values.at( 0 ), parent );
1359 return QVariant( std::floor( x ) );
1364 double x = QgsExpressionUtils::getDoubleValue( values.at( 0 ), parent );
1365 return QVariant( std::ceil( x ) );
1370 const QVariant value = values.at( 0 );
1371 if ( QgsExpressionUtils::isNull( value.isValid() ) )
1373 return QVariant(
false );
1375 else if ( value.userType() == QMetaType::QString )
1378 return QVariant( !value.toString().isEmpty() );
1380 else if ( QgsExpressionUtils::isList( value ) )
1382 return !value.toList().isEmpty();
1384 return QVariant( value.toBool() );
1388 return QVariant( QgsExpressionUtils::getIntValue( values.at( 0 ), parent ) );
1392 return QVariant( QgsExpressionUtils::getDoubleValue( values.at( 0 ), parent ) );
1396 return QVariant( QgsExpressionUtils::getStringValue( values.at( 0 ), parent ) );
1401 QString format = QgsExpressionUtils::getStringValue( values.at( 1 ), parent );
1402 QString language = QgsExpressionUtils::getStringValue( values.at( 2 ), parent );
1403 if ( format.isEmpty() && !language.isEmpty() )
1405 parent->
setEvalErrorString( QObject::tr(
"A format is required to convert to DateTime when the language is specified" ) );
1406 return QVariant( QDateTime() );
1409 if ( format.isEmpty() && language.isEmpty() )
1410 return QVariant( QgsExpressionUtils::getDateTimeValue( values.at( 0 ), parent ) );
1412 QString datetimestring = QgsExpressionUtils::getStringValue( values.at( 0 ), parent );
1413 QLocale locale = QLocale();
1414 if ( !language.isEmpty() )
1416 locale = QLocale( language );
1419 QDateTime datetime = locale.toDateTime( datetimestring, format );
1420 if ( !datetime.isValid() )
1422 parent->
setEvalErrorString( QObject::tr(
"Cannot convert '%1' to DateTime" ).arg( datetimestring ) );
1423 datetime = QDateTime();
1425 return QVariant( datetime );
1430 const int year = QgsExpressionUtils::getIntValue( values.at( 0 ), parent );
1431 const int month = QgsExpressionUtils::getIntValue( values.at( 1 ), parent );
1432 const int day = QgsExpressionUtils::getIntValue( values.at( 2 ), parent );
1434 const QDate date( year, month, day );
1435 if ( !date.isValid() )
1437 parent->
setEvalErrorString( QObject::tr(
"'%1-%2-%3' is not a valid date" ).arg( year ).arg( month ).arg( day ) );
1440 return QVariant( date );
1445 const int hours = QgsExpressionUtils::getIntValue( values.at( 0 ), parent );
1446 const int minutes = QgsExpressionUtils::getIntValue( values.at( 1 ), parent );
1447 const double seconds = QgsExpressionUtils::getDoubleValue( values.at( 2 ), parent );
1449 const QTime time( hours, minutes, std::floor( seconds ), ( seconds - std::floor( seconds ) ) * 1000 );
1450 if ( !time.isValid() )
1452 parent->
setEvalErrorString( QObject::tr(
"'%1-%2-%3' is not a valid time" ).arg( hours ).arg( minutes ).arg( seconds ) );
1455 return QVariant( time );
1460 const int year = QgsExpressionUtils::getIntValue( values.at( 0 ), parent );
1461 const int month = QgsExpressionUtils::getIntValue( values.at( 1 ), parent );
1462 const int day = QgsExpressionUtils::getIntValue( values.at( 2 ), parent );
1463 const int hours = QgsExpressionUtils::getIntValue( values.at( 3 ), parent );
1464 const int minutes = QgsExpressionUtils::getIntValue( values.at( 4 ), parent );
1465 const double seconds = QgsExpressionUtils::getDoubleValue( values.at( 5 ), parent );
1467 const QDate date( year, month, day );
1468 if ( !date.isValid() )
1470 parent->
setEvalErrorString( QObject::tr(
"'%1-%2-%3' is not a valid date" ).arg( year ).arg( month ).arg( day ) );
1473 const QTime time( hours, minutes, std::floor( seconds ), ( seconds - std::floor( seconds ) ) * 1000 );
1474 if ( !time.isValid() )
1476 parent->
setEvalErrorString( QObject::tr(
"'%1-%2-%3' is not a valid time" ).arg( hours ).arg( minutes ).arg( seconds ) );
1479 return QVariant( QDateTime( date, time ) );
1484 const QString timeZoneId = QgsExpressionUtils::getStringValue( values.at( 0 ), parent );
1488#if QT_FEATURE_timezone > 0
1489 if ( !timeZoneId.isEmpty() )
1491 tz = QTimeZone( timeZoneId.toUtf8() );
1494 if ( !tz.isValid() )
1496 parent->
setEvalErrorString( QObject::tr(
"'%1' is not a valid time zone ID" ).arg( timeZoneId ) );
1501 parent->
setEvalErrorString( QObject::tr(
"Qt is built without Qt timezone support, cannot use fcnTimeZoneFromId" ) );
1503 return QVariant::fromValue( tz );
1508#if QT_FEATURE_timezone > 0
1509 const QDateTime datetime = QgsExpressionUtils::getDateTimeValue( values.at( 0 ), parent );
1510 if ( datetime.isValid() )
1512 return QVariant::fromValue( datetime.timeZone() );
1517 parent->
setEvalErrorString( QObject::tr(
"Qt is built without Qt timezone support, cannot use fcnGetTimeZone" ) );
1524#if QT_FEATURE_timezone > 0
1525 QDateTime datetime = QgsExpressionUtils::getDateTimeValue( values.at( 0 ), parent );
1526 const QTimeZone tz = QgsExpressionUtils::getTimeZoneValue( values.at( 1 ), parent );
1527 if ( datetime.isValid() && tz.isValid() )
1529 datetime.setTimeZone( tz );
1530 return QVariant::fromValue( datetime );
1535 parent->
setEvalErrorString( QObject::tr(
"Qt is built without Qt timezone support, cannot use fcnSetTimeZone" ) );
1542#if QT_FEATURE_timezone > 0
1543 const QDateTime datetime = QgsExpressionUtils::getDateTimeValue( values.at( 0 ), parent );
1544 const QTimeZone tz = QgsExpressionUtils::getTimeZoneValue( values.at( 1 ), parent );
1545 if ( datetime.isValid() && tz.isValid() )
1547 return QVariant::fromValue( datetime.toTimeZone( tz ) );
1552 parent->
setEvalErrorString( QObject::tr(
"Qt is built without Qt timezone support, cannot use fcnConvertTimeZone" ) );
1559#if QT_FEATURE_timezone > 0
1560 const QTimeZone timeZone = QgsExpressionUtils::getTimeZoneValue( values.at( 0 ), parent );
1561 if ( timeZone.isValid() )
1563 return QString( timeZone.id() );
1568 parent->
setEvalErrorString( QObject::tr(
"Qt is built without Qt timezone support, cannot use fcnTimeZoneToId" ) );
1575 const double years = QgsExpressionUtils::getDoubleValue( values.at( 0 ), parent );
1576 const double months = QgsExpressionUtils::getDoubleValue( values.at( 1 ), parent );
1577 const double weeks = QgsExpressionUtils::getDoubleValue( values.at( 2 ), parent );
1578 const double days = QgsExpressionUtils::getDoubleValue( values.at( 3 ), parent );
1579 const double hours = QgsExpressionUtils::getDoubleValue( values.at( 4 ), parent );
1580 const double minutes = QgsExpressionUtils::getDoubleValue( values.at( 5 ), parent );
1581 const double seconds = QgsExpressionUtils::getDoubleValue( values.at( 6 ), parent );
1583 return QVariant::fromValue(
QgsInterval( years, months, weeks, days, hours, minutes, seconds ) );
1588 for (
const QVariant &value : values )
1599 const QVariant val1 = values.at( 0 );
1600 const QVariant val2 = values.at( 1 );
1610 QString str = QgsExpressionUtils::getStringValue( values.at( 0 ), parent );
1611 return QVariant( str.toLower() );
1616 QString str = QgsExpressionUtils::getStringValue( values.at( 0 ), parent );
1617 return QVariant( str.toUpper() );
1622 QString str = QgsExpressionUtils::getStringValue( values.at( 0 ), parent );
1623 QStringList elems = str.split(
' ' );
1624 for (
int i = 0; i < elems.size(); i++ )
1626 if ( elems[i].size() > 1 )
1627 elems[i] = elems[i].at( 0 ).toUpper() + elems[i].mid( 1 ).toLower();
1629 return QVariant( elems.join(
' '_L1 ) );
1634 QString str = QgsExpressionUtils::getStringValue( values.at( 0 ), parent );
1635 return QVariant( str.trimmed() );
1640 QString str = QgsExpressionUtils::getStringValue( values.at( 0 ), parent );
1642 const QString characters = QgsExpressionUtils::getStringValue( values.at( 1 ), parent );
1644 const QRegularExpression re( u
"^([%1]*)"_s.arg( QRegularExpression::escape( characters ) ) );
1645 str.replace( re, QString() );
1646 return QVariant( str );
1651 QString str = QgsExpressionUtils::getStringValue( values.at( 0 ), parent );
1653 const QString characters = QgsExpressionUtils::getStringValue( values.at( 1 ), parent );
1655 const QRegularExpression re( u
"([%1]*)$"_s.arg( QRegularExpression::escape( characters ) ) );
1656 str.replace( re, QString() );
1657 return QVariant( str );
1662 QString string1 = QgsExpressionUtils::getStringValue( values.at( 0 ), parent );
1663 QString string2 = QgsExpressionUtils::getStringValue( values.at( 1 ), parent );
1669 QString string1 = QgsExpressionUtils::getStringValue( values.at( 0 ), parent );
1670 QString string2 = QgsExpressionUtils::getStringValue( values.at( 1 ), parent );
1676 QString string1 = QgsExpressionUtils::getStringValue( values.at( 0 ), parent );
1677 QString string2 = QgsExpressionUtils::getStringValue( values.at( 1 ), parent );
1684 QString
string = QgsExpressionUtils::getStringValue( values.at( 0 ), parent );
1690 QChar character = QChar( QgsExpressionUtils::getNativeIntValue( values.at( 0 ), parent ) );
1691 return QVariant( QString( character ) );
1696 QString value = QgsExpressionUtils::getStringValue( values.at( 0 ), parent );
1698 if ( value.isEmpty() )
1703 int res = value.at( 0 ).unicode();
1704 return QVariant( res );
1709 if ( values.length() == 2 || values.length() == 3 )
1711 QString str = QgsExpressionUtils::getStringValue( values.at( 0 ), parent );
1712 qlonglong wrap = QgsExpressionUtils::getIntValue( values.at( 1 ), parent );
1714 QString customdelimiter = QgsExpressionUtils::getStringValue( values.at( 2 ), parent );
1727 QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent,
true );
1731 return QVariant( geom.
length() );
1737 QString str = QgsExpressionUtils::getStringValue( values.at( 0 ), parent );
1738 return QVariant( str.length() );
1743 const QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
1748 double totalLength = 0;
1753 totalLength += line->length3D();
1758 totalLength += segmentized->length3D();
1768 const QString
string = QgsExpressionUtils::getStringValue( values.at( 0 ), parent );
1769 const qlonglong number = QgsExpressionUtils::getIntValue( values.at( 1 ), parent );
1770 return string.repeated( std::max(
static_cast< int >( number ), 0 ) );
1775 if ( values.count() == 2 && values.at( 1 ).userType() == QMetaType::Type::QVariantMap )
1777 QString str = QgsExpressionUtils::getStringValue( values.at( 0 ), parent );
1778 QVariantMap map = QgsExpressionUtils::getMapValue( values.at( 1 ), parent );
1779 QVector< QPair< QString, QString > > mapItems;
1781 for ( QVariantMap::const_iterator it = map.constBegin(); it != map.constEnd(); ++it )
1783 mapItems.append( qMakePair( it.key(), it.value().toString() ) );
1787 std::sort( mapItems.begin(), mapItems.end(), [](
const QPair< QString, QString > &pair1,
const QPair< QString, QString > &pair2 ) { return ( pair1.first.length() > pair2.first.length() ); } );
1789 for (
auto it = mapItems.constBegin(); it != mapItems.constEnd(); ++it )
1791 str = str.replace( it->first, it->second );
1794 return QVariant( str );
1796 else if ( values.count() == 3 )
1798 QString str = QgsExpressionUtils::getStringValue( values.at( 0 ), parent );
1799 QVariantList before;
1801 bool isSingleReplacement =
false;
1803 if ( !QgsExpressionUtils::isList( values.at( 1 ) ) && values.at( 2 ).userType() != QMetaType::Type::QStringList )
1805 before = QVariantList() << QgsExpressionUtils::getStringValue( values.at( 1 ), parent );
1809 before = QgsExpressionUtils::getListValue( values.at( 1 ), parent );
1812 if ( !QgsExpressionUtils::isList( values.at( 2 ) ) )
1814 after = QVariantList() << QgsExpressionUtils::getStringValue( values.at( 2 ), parent );
1815 isSingleReplacement =
true;
1819 after = QgsExpressionUtils::getListValue( values.at( 2 ), parent );
1822 if ( !isSingleReplacement && before.length() != after.length() )
1824 parent->
setEvalErrorString( QObject::tr(
"Invalid pair of array, length not identical" ) );
1828 for (
int i = 0; i < before.length(); i++ )
1830 str = str.replace( before.at( i ).toString(), after.at( isSingleReplacement ? 0 : i ).toString() );
1833 return QVariant( str );
1837 parent->
setEvalErrorString( QObject::tr(
"Function replace requires 2 or 3 arguments" ) );
1844 QString str = QgsExpressionUtils::getStringValue( values.at( 0 ), parent );
1845 QString regexp = QgsExpressionUtils::getStringValue( values.at( 1 ), parent );
1846 QString after = QgsExpressionUtils::getStringValue( values.at( 2 ), parent );
1848 QRegularExpression re( regexp, QRegularExpression::UseUnicodePropertiesOption );
1849 if ( !re.isValid() )
1851 parent->
setEvalErrorString( QObject::tr(
"Invalid regular expression '%1': %2" ).arg( regexp, re.errorString() ) );
1854 return QVariant( str.replace( re, after ) );
1859 QString str = QgsExpressionUtils::getStringValue( values.at( 0 ), parent );
1860 QString regexp = QgsExpressionUtils::getStringValue( values.at( 1 ), parent );
1862 QRegularExpression re( regexp, QRegularExpression::UseUnicodePropertiesOption );
1863 if ( !re.isValid() )
1865 parent->
setEvalErrorString( QObject::tr(
"Invalid regular expression '%1': %2" ).arg( regexp, re.errorString() ) );
1868 return QVariant( ( str.indexOf( re ) + 1 ) );
1873 QString str = QgsExpressionUtils::getStringValue( values.at( 0 ), parent );
1874 QString regexp = QgsExpressionUtils::getStringValue( values.at( 1 ), parent );
1875 QString empty = QgsExpressionUtils::getStringValue( values.at( 2 ), parent );
1877 QRegularExpression re( regexp, QRegularExpression::UseUnicodePropertiesOption );
1878 if ( !re.isValid() )
1880 parent->
setEvalErrorString( QObject::tr(
"Invalid regular expression '%1': %2" ).arg( regexp, re.errorString() ) );
1884 QRegularExpressionMatch matches = re.match( str );
1885 if ( matches.hasMatch() )
1888 QStringList list = matches.capturedTexts();
1891 for ( QStringList::const_iterator it = ++list.constBegin(); it != list.constEnd(); ++it )
1893 array += ( !( *it ).isEmpty() ) ? *it : empty;
1896 return QVariant( array );
1906 QString str = QgsExpressionUtils::getStringValue( values.at( 0 ), parent );
1907 QString regexp = QgsExpressionUtils::getStringValue( values.at( 1 ), parent );
1909 QRegularExpression re( regexp, QRegularExpression::UseUnicodePropertiesOption );
1910 if ( !re.isValid() )
1912 parent->
setEvalErrorString( QObject::tr(
"Invalid regular expression '%1': %2" ).arg( regexp, re.errorString() ) );
1917 QRegularExpressionMatch match = re.match( str );
1918 if ( match.hasMatch() )
1921 if ( match.lastCapturedIndex() > 0 )
1924 return QVariant( match.captured( 1 ) );
1929 return QVariant( match.captured( 0 ) );
1934 return QVariant(
"" );
1940 const int version = QgsExpressionUtils::getIntValue( values.at( 1 ), parent );
1945 uuid = QUuid::createUuid();
1948#if QT_VERSION >= QT_VERSION_CHECK( 6, 9, 0 )
1949 uuid = QUuid::createUuidV7();
1951 parent->
setEvalErrorString( QObject::tr(
"UUid version 7 is not supported on this QGIS build" ) );
1956 parent->
setEvalErrorString( QObject::tr(
"UUid version %1 is not supported" ).arg( version ) );
1960 const QString format = QgsExpressionUtils::getStringValue( values.at( 0 ), parent );
1961 if ( format.compare( u
"WithoutBraces"_s, Qt::CaseInsensitive ) == 0 )
1962 return uuid.toString( QUuid::StringFormat::WithoutBraces );
1963 else if ( format.compare( u
"Id128"_s, Qt::CaseInsensitive ) == 0 )
1964 return uuid.toString( QUuid::StringFormat::Id128 );
1965 return uuid.toString();
1970 if ( !values.at( 0 ).isValid() || !values.at( 1 ).isValid() )
1973 QString str = QgsExpressionUtils::getStringValue( values.at( 0 ), parent );
1974 int from = QgsExpressionUtils::getNativeIntValue( values.at( 1 ), parent );
1977 if ( values.at( 2 ).isValid() )
1978 len = QgsExpressionUtils::getNativeIntValue( values.at( 2 ), parent );
1984 from = str.size() + from;
1990 else if ( from > 0 )
1998 len = str.size() + len - from;
2005 return QVariant( str.mid( from, len ) );
2010 return QVariant( f.
id() );
2015 const int bandNb = QgsExpressionUtils::getNativeIntValue( values.at( 1 ), parent );
2016 const QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 2 ), parent );
2017 bool foundLayer =
false;
2018 const QVariant res = QgsExpressionUtils::runMapLayerFunctionThreadSafe(
2023 QgsRasterLayer *layer = qobject_cast< QgsRasterLayer * >( mapLayer );
2024 if ( !layer || !layer->dataProvider() )
2026 parent->setEvalErrorString( QObject::tr(
"Function `raster_value` requires a valid raster layer." ) );
2030 if ( bandNb < 1 || bandNb > layer->bandCount() )
2032 parent->setEvalErrorString( QObject::tr(
"Function `raster_value` requires a valid raster band number." ) );
2038 parent->setEvalErrorString( QObject::tr(
"Function `raster_value` requires a valid point geometry." ) );
2045 QgsMultiPointXY multiPoint = geom.asMultiPoint();
2046 if ( multiPoint.count() == 1 )
2048 point = multiPoint[0];
2057 double value = layer->dataProvider()->sample( point, bandNb );
2058 return std::isnan( value ) ? QVariant() : value;
2065 parent->
setEvalErrorString( QObject::tr(
"Function `raster_value` requires a valid raster layer." ) );
2076 const int bandNb = QgsExpressionUtils::getNativeIntValue( values.at( 1 ), parent );
2077 const double value = QgsExpressionUtils::getDoubleValue( values.at( 2 ), parent );
2079 bool foundLayer =
false;
2080 const QVariant res = QgsExpressionUtils::runMapLayerFunctionThreadSafe(
2084 [parent, bandNb, value](
QgsMapLayer *mapLayer ) -> QVariant {
2085 QgsRasterLayer *layer = qobject_cast< QgsRasterLayer *>( mapLayer );
2086 if ( !layer || !layer->dataProvider() )
2088 parent->setEvalErrorString( QObject::tr(
"Function `raster_attributes` requires a valid raster layer." ) );
2092 if ( bandNb < 1 || bandNb > layer->bandCount() )
2094 parent->setEvalErrorString( QObject::tr(
"Function `raster_attributes` requires a valid raster band number." ) );
2098 if ( std::isnan( value ) )
2100 parent->
setEvalErrorString( QObject::tr(
"Function `raster_attributes` requires a valid raster value." ) );
2104 if ( !layer->dataProvider()->attributeTable( bandNb ) )
2109 const QVariantList data = layer->dataProvider()->attributeTable( bandNb )->row( value );
2110 if ( data.isEmpty() )
2116 const QList<QgsRasterAttributeTable::Field> fields { layer->dataProvider()->attributeTable( bandNb )->fields() };
2117 for (
int idx = 0; idx < static_cast<int>( fields.count() ) && idx < static_cast<int>( data.count() ); ++idx )
2124 result.insert( fields.at( idx ).name, data.at( idx ) );
2134 parent->
setEvalErrorString( QObject::tr(
"Function `raster_attributes` requires a valid raster layer." ) );
2155 if ( values.size() == 1 )
2157 attr = QgsExpressionUtils::getStringValue( values.at( 0 ), parent );
2160 else if ( values.size() == 2 )
2162 feature = QgsExpressionUtils::getFeature( values.at( 0 ), parent );
2163 attr = QgsExpressionUtils::getStringValue( values.at( 1 ), parent );
2167 parent->
setEvalErrorString( QObject::tr(
"Function `attribute` requires one or two parameters. %n given.",
nullptr, values.length() ) );
2176 QString table { R
"html(
2179 <tr><th>%1</th></tr>
2182 <tr><td>%2</td></tr>
2186 if ( values.size() == 1 )
2188 dict = QgsExpressionUtils::getMapValue( values.at( 0 ), parent );
2192 parent->
setEvalErrorString( QObject::tr(
"Function `map_to_html_table` requires one parameter. %n given.",
nullptr, values.length() ) );
2196 if ( dict.isEmpty() )
2201 QStringList headers;
2204 for (
auto it = dict.cbegin(); it != dict.cend(); ++it )
2206 headers.push_back( it.key().toHtmlEscaped() );
2207 cells.push_back( it.value().toString().toHtmlEscaped() );
2210 return table.arg( headers.join(
"</th><th>"_L1 ), cells.join(
"</td><td>"_L1 ) );
2215 QString table { R
"html(
2220 if ( values.size() == 1 )
2222 dict = QgsExpressionUtils::getMapValue( values.at( 0 ), parent );
2226 parent->
setEvalErrorString( QObject::tr(
"Function `map_to_html_dl` requires one parameter. %n given.",
nullptr, values.length() ) );
2230 if ( dict.isEmpty() )
2237 for (
auto it = dict.cbegin(); it != dict.cend(); ++it )
2239 rows.append( u
"<dt>%1</dt><dd>%2</dd>"_s.arg( it.key().toHtmlEscaped(), it.value().toString().toHtmlEscaped() ) );
2242 return table.arg( rows );
2250 layer = context->
variable( u
"layer"_s );
2255 QgsExpressionNode *node = QgsExpressionUtils::getNode( values.at( 0 ), parent );
2257 layer = node->
eval( parent, context );
2268 feature = QgsExpressionUtils::getFeature( values.at( 1 ), parent );
2272 const QString strength = QgsExpressionUtils::getStringValue( values.at( 2 ), parent ).toLower();
2273 if ( strength ==
"hard"_L1 )
2277 else if ( strength ==
"soft"_L1 )
2282 bool foundLayer =
false;
2283 const QVariant res = QgsExpressionUtils::runMapLayerFunctionThreadSafe(
2287 [parent, feature, constraintStrength](
QgsMapLayer *mapLayer ) -> QVariant {
2288 QgsVectorLayer *layer = qobject_cast< QgsVectorLayer * >( mapLayer );
2291 parent->
setEvalErrorString( QObject::tr(
"No layer provided to conduct constraints checks" ) );
2297 for (
int i = 0; i < fields.
size(); i++ )
2314 parent->
setEvalErrorString( QObject::tr(
"No layer provided to conduct constraints checks" ) );
2326 layer = context->
variable( u
"layer"_s );
2331 QgsExpressionNode *node = QgsExpressionUtils::getNode( values.at( 1 ), parent );
2333 layer = node->
eval( parent, context );
2344 feature = QgsExpressionUtils::getFeature( values.at( 2 ), parent );
2348 const QString strength = QgsExpressionUtils::getStringValue( values.at( 3 ), parent ).toLower();
2349 if ( strength ==
"hard"_L1 )
2353 else if ( strength ==
"soft"_L1 )
2358 const QString attributeName = QgsExpressionUtils::getStringValue( values.at( 0 ), parent );
2360 bool foundLayer =
false;
2361 const QVariant res = QgsExpressionUtils::runMapLayerFunctionThreadSafe(
2365 [parent, feature, attributeName, constraintStrength](
QgsMapLayer *mapLayer ) -> QVariant {
2366 QgsVectorLayer *layer = qobject_cast< QgsVectorLayer * >( mapLayer );
2373 if ( fieldIndex == -1 )
2375 parent->
setEvalErrorString( QObject::tr(
"The attribute name did not match any field for the given feature" ) );
2388 parent->
setEvalErrorString( QObject::tr(
"No layer provided to conduct constraints checks" ) );
2404 feature = QgsExpressionUtils::getFeature( values.at( 0 ), parent );
2409 for (
int i = 0; i < fields.
count(); ++i )
2423 if ( values.isEmpty() )
2426 layer = QgsExpressionUtils::getVectorLayer( context->
variable( u
"layer"_s ), context, parent );
2428 else if ( values.size() == 1 )
2430 layer = QgsExpressionUtils::getVectorLayer( context->
variable( u
"layer"_s ), context, parent );
2431 feature = QgsExpressionUtils::getFeature( values.at( 0 ), parent );
2433 else if ( values.size() == 2 )
2435 layer = QgsExpressionUtils::getVectorLayer( values.at( 0 ), context, parent );
2436 feature = QgsExpressionUtils::getFeature( values.at( 1 ), parent );
2440 parent->
setEvalErrorString( QObject::tr(
"Function `represent_attributes` requires no more than two parameters. %n given.",
nullptr, values.length() ) );
2447 parent->
setEvalErrorString( QObject::tr(
"Cannot use represent attributes function: layer could not be resolved." ) );
2453 parent->
setEvalErrorString( QObject::tr(
"Cannot use represent attributes function: feature could not be resolved." ) );
2459 for (
int fieldIndex = 0; fieldIndex < fields.
count(); ++fieldIndex )
2461 const QString fieldName { fields.
at( fieldIndex ).
name() };
2462 const QVariant attributeVal = feature.
attribute( fieldIndex );
2463 const QString cacheValueKey = u
"repvalfcnval:%1:%2:%3"_s.arg( layer->
id(), fieldName, attributeVal.toString() );
2466 result.insert( fieldName, context->
cachedValue( cacheValueKey ) );
2475 const QString
cacheKey = u
"repvalfcn:%1:%2"_s.arg( layer->
id(), fieldName );
2487 QString value( fieldFormatter->
representValue( layer, fieldIndex, setup.
config(), cache, attributeVal ) );
2489 result.insert( fields.
at( fieldIndex ).
name(), value );
2504 bool evaluate =
true;
2508 if ( values.isEmpty() )
2511 layer = QgsExpressionUtils::getVectorLayer( context->
variable( u
"layer"_s ), context, parent );
2513 else if ( values.size() == 1 )
2515 layer = QgsExpressionUtils::getVectorLayer( context->
variable( u
"layer"_s ), context, parent );
2516 feature = QgsExpressionUtils::getFeature( values.at( 0 ), parent );
2518 else if ( values.size() == 2 )
2520 layer = QgsExpressionUtils::getVectorLayer( values.at( 0 ), context, parent );
2521 feature = QgsExpressionUtils::getFeature( values.at( 1 ), parent );
2523 else if ( values.size() == 3 )
2525 layer = QgsExpressionUtils::getVectorLayer( values.at( 0 ), context, parent );
2526 feature = QgsExpressionUtils::getFeature( values.at( 1 ), parent );
2527 evaluate = values.value( 2 ).toBool();
2533 parent->
setEvalErrorString( QObject::tr(
"Function `maptip` requires no more than three parameters. %n given.",
nullptr, values.length() ) );
2537 parent->
setEvalErrorString( QObject::tr(
"Function `display` requires no more than three parameters. %n given.",
nullptr, values.length() ) );
2569 subContext.setFeature( feature );
2578 exp.prepare( &subContext );
2579 return exp.evaluate( &subContext ).toString();
2585 return fcnCoreFeatureMaptipDisplay( values, context, parent,
false );
2590 return fcnCoreFeatureMaptipDisplay( values, context, parent,
true );
2597 if ( values.isEmpty() )
2600 layer = context->
variable( u
"layer"_s );
2602 else if ( values.size() == 1 )
2604 feature = QgsExpressionUtils::getFeature( values.at( 0 ), parent );
2605 layer = context->
variable( u
"layer"_s );
2607 else if ( values.size() == 2 )
2609 feature = QgsExpressionUtils::getFeature( values.at( 1 ), parent );
2610 layer = values.at( 0 );
2614 parent->
setEvalErrorString( QObject::tr(
"Function `is_selected` requires no more than two parameters. %n given.",
nullptr, values.length() ) );
2618 bool foundLayer =
false;
2619 const QVariant res = QgsExpressionUtils::runMapLayerFunctionThreadSafe(
2624 QgsVectorLayer *layer = qobject_cast< QgsVectorLayer * >( mapLayer );
2625 if ( !layer || !feature.
isValid() )
2644 if ( values.isEmpty() )
2645 layer = context->
variable( u
"layer"_s );
2646 else if ( values.count() == 1 )
2647 layer = values.at( 0 );
2650 parent->
setEvalErrorString( QObject::tr(
"Function `num_selected` requires no more than one parameter. %n given.",
nullptr, values.length() ) );
2654 bool foundLayer =
false;
2655 const QVariant res = QgsExpressionUtils::runMapLayerFunctionThreadSafe(
2660 QgsVectorLayer *layer = qobject_cast< QgsVectorLayer * >( mapLayer );
2678 static QMap<QString, qlonglong> counterCache;
2679 QVariant functionResult;
2681 auto fetchAndIncrementFunc = [values, parent, &functionResult](
QgsMapLayer *mapLayer,
const QString &databaseArgument ) {
2684 const QgsVectorLayer *layer = qobject_cast< QgsVectorLayer *>( mapLayer );
2689 database = decodedUri.value( u
"path"_s ).toString();
2690 if ( database.isEmpty() )
2692 parent->
setEvalErrorString( QObject::tr(
"Could not extract file path from layer `%1`." ).arg( layer->
name() ) );
2697 database = databaseArgument;
2700 const QString table = values.at( 1 ).toString();
2701 const QString idColumn = values.at( 2 ).toString();
2702 const QString filterAttribute = values.at( 3 ).toString();
2703 const QVariant filterValue = values.at( 4 ).toString();
2704 const QVariantMap defaultValues = values.at( 5 ).toMap();
2710 if ( sqliteDb.
open_v2( database, SQLITE_OPEN_READWRITE,
nullptr ) != SQLITE_OK )
2713 functionResult = QVariant();
2717 QString errorMessage;
2718 QString currentValSql;
2720 qlonglong nextId = 0;
2721 bool cachedMode =
false;
2722 bool valueRetrieved =
false;
2724 QString cacheString = u
"%1:%2:%3:%4:%5"_s.arg( database, table, idColumn, filterAttribute, filterValue.toString() );
2731 auto cachedCounter = counterCache.find( cacheString );
2733 if ( cachedCounter != counterCache.end() )
2735 qlonglong &cachedValue = cachedCounter.value();
2736 nextId = cachedValue;
2738 cachedValue = nextId;
2739 valueRetrieved =
true;
2744 if ( !cachedMode || !valueRetrieved )
2746 int result = SQLITE_ERROR;
2749 if ( !filterAttribute.isNull() )
2754 sqliteStatement = sqliteDb.
prepare( currentValSql, result );
2756 if ( result == SQLITE_OK )
2759 if ( sqliteStatement.
step() == SQLITE_ROW )
2765 if ( cachedMode && result == SQLITE_OK )
2767 counterCache.insert( cacheString, nextId );
2769 QObject::connect( layer->
dataProvider()->
transaction(), &QgsTransaction::destroyed, [cacheString]() { counterCache.remove( cacheString ); } );
2771 valueRetrieved =
true;
2775 if ( valueRetrieved )
2784 if ( !filterAttribute.isNull() )
2790 for ( QVariantMap::const_iterator iter = defaultValues.constBegin(); iter != defaultValues.constEnd(); ++iter )
2793 vals << iter.value().toString();
2796 upsertSql +=
" ("_L1 + cols.join(
',' ) +
')';
2797 upsertSql +=
" VALUES "_L1;
2798 upsertSql +=
'(' + vals.join(
',' ) +
')';
2800 int result = SQLITE_ERROR;
2804 if ( transaction->
executeSql( upsertSql, errorMessage ) )
2811 result = sqliteDb.
exec( upsertSql, errorMessage );
2813 if ( result == SQLITE_OK )
2815 functionResult = QVariant( nextId );
2820 parent->
setEvalErrorString( u
"Could not increment value: SQLite error: \"%1\" (%2)."_s.arg( errorMessage, QString::number( result ) ) );
2821 functionResult = QVariant();
2826 functionResult = QVariant();
2829 bool foundLayer =
false;
2830 QgsExpressionUtils::executeLambdaForMapLayer( values.at( 0 ), context, parent, [&fetchAndIncrementFunc](
QgsMapLayer *layer ) { fetchAndIncrementFunc( layer, QString() ); }, foundLayer );
2833 const QString databasePath = values.at( 0 ).toString();
2837 return functionResult;
2850 QString definition = QgsExpressionUtils::getStringValue( values.at( 0 ), parent );
2855 parent->
setEvalErrorString( QObject::tr(
"Cannot convert '%1' to coordinate reference system" ).arg( definition ) );
2858 return QVariant::fromValue( crs );
2863 QString concat(
"" );
2864 for (
const QVariant &value : values )
2867 concat += QgsExpressionUtils::getStringValue( value, parent );
2874 if ( values.length() < 2 )
2876 parent->
setEvalErrorString( QObject::tr(
"Function concat_ws requires at least 2 arguments" ) );
2880 const QString separator = QgsExpressionUtils::getStringValue( values.at( 0 ), parent );
2882 QStringList stringValues;
2883 stringValues.reserve( values.size() - 1 );
2884 for (
int i = 1; i < values.size(); ++i )
2886 const QVariant value = values.at( i );
2889 stringValues.append( QgsExpressionUtils::getStringValue( value, parent ) );
2893 return stringValues.join( separator );
2898 QString
string = QgsExpressionUtils::getStringValue( values.at( 0 ), parent );
2899 return string.indexOf( QgsExpressionUtils::getStringValue( values.at( 1 ), parent ) ) + 1;
2907 if ( values.isEmpty() || values[0].isNull() )
2915 QString
string = QgsExpressionUtils::getStringValue( values.at( 0 ), parent );
2916 int pos = QgsExpressionUtils::getNativeIntValue( values.at( 1 ), parent );
2917 return string.right( pos );
2922 if ( values.length() < 2 || values.length() > 3 )
2925 const QString input = QgsExpressionUtils::getStringValue( values.at( 0 ), parent );
2926 const QString substring = QgsExpressionUtils::getStringValue( values.at( 1 ), parent );
2928 bool overlapping =
false;
2929 if ( values.length() == 3 )
2931 overlapping = values.at( 2 ).toBool();
2934 if ( substring.isEmpty() )
2935 return QVariant( 0 );
2940 count = input.count( substring );
2945 while ( ( pos = input.indexOf( substring, pos ) ) != -1 )
2948 pos += substring.length();
2952 return QVariant( count );
2957 QString
string = QgsExpressionUtils::getStringValue( values.at( 0 ), parent );
2958 int pos = QgsExpressionUtils::getNativeIntValue( values.at( 1 ), parent );
2959 return string.left( pos );
2964 const QString
string = QgsExpressionUtils::getStringValue( values.at( 0 ), parent );
2965 const int length = QgsExpressionUtils::getNativeIntValue( values.at( 1 ), parent );
2966 QString fill = QgsExpressionUtils::getStringValue( values.at( 2 ), parent );
2967 if ( fill.isEmpty() )
2971 return string.leftJustified( length, fill.at( 0 ),
true );
2976 const QString
string = QgsExpressionUtils::getStringValue( values.at( 0 ), parent );
2977 const int length = QgsExpressionUtils::getNativeIntValue( values.at( 1 ), parent );
2978 QString fill = QgsExpressionUtils::getStringValue( values.at( 2 ), parent );
2979 if ( fill.isEmpty() )
2983 return string.rightJustified( length, fill.at( 0 ),
true );
2988 if ( values.size() < 1 )
2990 parent->
setEvalErrorString( QObject::tr(
"Function format requires at least 1 argument" ) );
2994 QString
string = QgsExpressionUtils::getStringValue( values.at( 0 ), parent );
2995 for (
int n = 1; n < values.length(); n++ )
2997 string =
string.arg( QgsExpressionUtils::getStringValue( values.at( n ), parent ) );
3005 return QVariant( QDateTime::currentDateTime() );
3010 QString format = QgsExpressionUtils::getStringValue( values.at( 1 ), parent );
3011 QString language = QgsExpressionUtils::getStringValue( values.at( 2 ), parent );
3012 if ( format.isEmpty() && !language.isEmpty() )
3014 parent->
setEvalErrorString( QObject::tr(
"A format is required to convert to Date when the language is specified" ) );
3015 return QVariant( QDate() );
3018 if ( format.isEmpty() && language.isEmpty() )
3019 return QVariant( QgsExpressionUtils::getDateValue( values.at( 0 ), parent ) );
3021 QString datestring = QgsExpressionUtils::getStringValue( values.at( 0 ), parent );
3022 QLocale locale = QLocale();
3023 if ( !language.isEmpty() )
3025 locale = QLocale( language );
3028 QDate date = locale.toDate( datestring, format );
3029 if ( !date.isValid() )
3031 parent->
setEvalErrorString( QObject::tr(
"Cannot convert '%1' to Date" ).arg( datestring ) );
3034 return QVariant( date );
3039 QString format = QgsExpressionUtils::getStringValue( values.at( 1 ), parent );
3040 QString language = QgsExpressionUtils::getStringValue( values.at( 2 ), parent );
3041 if ( format.isEmpty() && !language.isEmpty() )
3043 parent->
setEvalErrorString( QObject::tr(
"A format is required to convert to Time when the language is specified" ) );
3044 return QVariant( QTime() );
3047 if ( format.isEmpty() && language.isEmpty() )
3048 return QVariant( QgsExpressionUtils::getTimeValue( values.at( 0 ), parent ) );
3050 QString timestring = QgsExpressionUtils::getStringValue( values.at( 0 ), parent );
3051 QLocale locale = QLocale();
3052 if ( !language.isEmpty() )
3054 locale = QLocale( language );
3057 QTime time = locale.toTime( timestring, format );
3058 if ( !time.isValid() )
3060 parent->
setEvalErrorString( QObject::tr(
"Cannot convert '%1' to Time" ).arg( timestring ) );
3063 return QVariant( time );
3068 return QVariant::fromValue( QgsExpressionUtils::getInterval( values.at( 0 ), parent ) );
3077 double value = QgsExpressionUtils::getDoubleValue( values.at( 0 ), parent );
3078 QString axis = QgsExpressionUtils::getStringValue( values.at( 1 ), parent );
3079 int precision = QgsExpressionUtils::getNativeIntValue( values.at( 2 ), parent );
3081 QString formatString;
3082 if ( values.count() > 3 )
3083 formatString = QgsExpressionUtils::getStringValue( values.at( 3 ), parent );
3086 if ( formatString.compare(
"suffix"_L1, Qt::CaseInsensitive ) == 0 )
3090 else if ( formatString.compare(
"aligned"_L1, Qt::CaseInsensitive ) == 0 )
3094 else if ( !formatString.isEmpty() )
3096 parent->
setEvalErrorString( QObject::tr(
"Invalid formatting parameter: '%1'. It must be empty, or 'suffix' or 'aligned'." ).arg( formatString ) );
3100 if ( axis.compare(
'x'_L1, Qt::CaseInsensitive ) == 0 )
3104 else if ( axis.compare(
'y'_L1, Qt::CaseInsensitive ) == 0 )
3110 parent->
setEvalErrorString( QObject::tr(
"Invalid axis name: '%1'. It must be either 'x' or 'y'." ).arg( axis ) );
3118 return floatToDegreeFormat( format, values, context, parent, node );
3125 value = QgsCoordinateUtils::dmsToDecimal( QgsExpressionUtils::getStringValue( values.at( 0 ), parent ), &ok );
3127 return ok ? QVariant( value ) : QVariant();
3133 return floatToDegreeFormat( format, values, context, parent, node );
3138 const double decimalDegrees = QgsExpressionUtils::getDoubleValue( values.at( 0 ), parent );
3139 return static_cast< int >( decimalDegrees );
3144 const double absoluteDecimalDegrees = std::abs( QgsExpressionUtils::getDoubleValue( values.at( 0 ), parent ) );
3145 const double remainder = absoluteDecimalDegrees -
static_cast<int>( absoluteDecimalDegrees );
3146 return static_cast< int >( remainder * 60 );
3151 const double absoluteDecimalDegrees = std::abs( QgsExpressionUtils::getDoubleValue( values.at( 0 ), parent ) );
3152 const double remainder = absoluteDecimalDegrees -
static_cast<int>( absoluteDecimalDegrees );
3153 const double remainderInMinutes = remainder * 60;
3154 const double remainderSecondsFraction = remainderInMinutes -
static_cast< int >( remainderInMinutes );
3156 return remainderSecondsFraction * 60;
3161 QDateTime d1 = QgsExpressionUtils::getDateTimeValue( values.at( 0 ), parent );
3162 QDateTime d2 = QgsExpressionUtils::getDateTimeValue( values.at( 1 ), parent );
3163 qint64 seconds = d2.secsTo( d1 );
3164 return QVariant::fromValue(
QgsInterval( seconds ) );
3169 if ( !values.at( 0 ).canConvert<QDate>() )
3172 QDate date = QgsExpressionUtils::getDateValue( values.at( 0 ), parent );
3173 if ( !date.isValid() )
3178 return date.dayOfWeek() % 7;
3183 QVariant value = values.at( 0 );
3184 QgsInterval inter = QgsExpressionUtils::getInterval( value, parent,
false );
3187 return QVariant( inter.
days() );
3191 QDateTime d1 = QgsExpressionUtils::getDateTimeValue( value, parent );
3192 return QVariant( d1.date().day() );
3198 QVariant value = values.at( 0 );
3199 QgsInterval inter = QgsExpressionUtils::getInterval( value, parent,
false );
3202 return QVariant( inter.
years() );
3206 QDateTime d1 = QgsExpressionUtils::getDateTimeValue( value, parent );
3207 return QVariant( d1.date().year() );
3213 QVariant value = values.at( 0 );
3214 QgsInterval inter = QgsExpressionUtils::getInterval( value, parent,
false );
3217 return QVariant( inter.
months() );
3221 QDateTime d1 = QgsExpressionUtils::getDateTimeValue( value, parent );
3222 return QVariant( d1.date().month() );
3228 QVariant value = values.at( 0 );
3229 QgsInterval inter = QgsExpressionUtils::getInterval( value, parent,
false );
3232 return QVariant( inter.
weeks() );
3236 QDateTime d1 = QgsExpressionUtils::getDateTimeValue( value, parent );
3237 return QVariant( d1.date().weekNumber() );
3243 QVariant value = values.at( 0 );
3244 QgsInterval inter = QgsExpressionUtils::getInterval( value, parent,
false );
3247 return QVariant( inter.
hours() );
3251 QTime t1 = QgsExpressionUtils::getTimeValue( value, parent );
3252 return QVariant( t1.hour() );
3258 QVariant value = values.at( 0 );
3259 QgsInterval inter = QgsExpressionUtils::getInterval( value, parent,
false );
3262 return QVariant( inter.
minutes() );
3266 QTime t1 = QgsExpressionUtils::getTimeValue( value, parent );
3267 return QVariant( t1.minute() );
3273 QVariant value = values.at( 0 );
3274 QgsInterval inter = QgsExpressionUtils::getInterval( value, parent,
false );
3277 return QVariant( inter.
seconds() );
3281 QTime t1 = QgsExpressionUtils::getTimeValue( value, parent );
3282 return QVariant( t1.second() );
3288 QDateTime dt = QgsExpressionUtils::getDateTimeValue( values.at( 0 ), parent );
3291 return QVariant( dt.toMSecsSinceEpoch() );
3301 long long millisecs_since_epoch = QgsExpressionUtils::getIntValue( values.at( 0 ), parent );
3303 return QVariant( QDateTime::fromMSecsSinceEpoch( millisecs_since_epoch ) );
3308 const QString filepath = QgsExpressionUtils::getFilePathValue( values.at( 0 ), context, parent );
3311 parent->
setEvalErrorString( QObject::tr(
"Function `%1` requires a value which represents a possible file path" ).arg(
"exif"_L1 ) );
3314 QString tag = QgsExpressionUtils::getStringValue( values.at( 1 ), parent );
3320 const QString filepath = QgsExpressionUtils::getFilePathValue( values.at( 0 ), context, parent );
3323 parent->
setEvalErrorString( QObject::tr(
"Function `%1` requires a value which represents a possible file path" ).arg(
"exif_geotag"_L1 ) );
3332 if ( !dateTime.isValid() )
3337 const int year = dateTime.date().year();
3338 const QDateTime startOfYear( QDate( year, 1, 1 ), QTime( 0, 0, 0 ) );
3339 const QDateTime startOfNextYear( QDate( year + 1, 1, 1 ), QTime( 0, 0, 0 ) );
3340 const qint64 secondsFromStartOfYear = startOfYear.secsTo( dateTime );
3341 const qint64 totalSecondsInYear = startOfYear.secsTo( startOfNextYear );
3342 return static_cast<double>( year ) + (
static_cast<double>( secondsFromStartOfYear ) /
static_cast< double >( totalSecondsInYear ) );
3347 const QString name = QgsExpressionUtils::getStringValue( values.at( 0 ), parent );
3348 const QDateTime dt = QgsExpressionUtils::getDateTimeValue( values.at( 1 ), parent );
3351 parent->
setEvalErrorString( QObject::tr(
"Function `%1` requires a valid date" ).arg(
"magnetic_declination"_L1 ) );
3354 const double latitude = QgsExpressionUtils::getDoubleValue( values.at( 2 ), parent );
3359 const double longitude = QgsExpressionUtils::getDoubleValue( values.at( 3 ), parent );
3364 const double height = QgsExpressionUtils::getDoubleValue( values.at( 4 ), parent );
3369 const QString filePath = QgsExpressionUtils::getFilePathValue( values.at( 5 ), context, parent );
3374 double declination = 0;
3381 parent->
setEvalErrorString( QObject::tr(
"Cannot evaluate magnetic declination: %1" ).arg( model.error() ) );
3393 const QString name = QgsExpressionUtils::getStringValue( values.at( 0 ), parent );
3394 const QDateTime dt = QgsExpressionUtils::getDateTimeValue( values.at( 1 ), parent );
3397 parent->
setEvalErrorString( QObject::tr(
"Function `%1` requires a valid date" ).arg(
"magnetic_inclination"_L1 ) );
3400 const double latitude = QgsExpressionUtils::getDoubleValue( values.at( 2 ), parent );
3405 const double longitude = QgsExpressionUtils::getDoubleValue( values.at( 3 ), parent );
3410 const double height = QgsExpressionUtils::getDoubleValue( values.at( 4 ), parent );
3415 const QString filePath = QgsExpressionUtils::getFilePathValue( values.at( 5 ), context, parent );
3420 double inclination = 0;
3427 parent->
setEvalErrorString( QObject::tr(
"Cannot evaluate magnetic inclination: %1" ).arg( model.error() ) );
3439 const QString name = QgsExpressionUtils::getStringValue( values.at( 0 ), parent );
3440 const QDateTime dt = QgsExpressionUtils::getDateTimeValue( values.at( 1 ), parent );
3443 parent->
setEvalErrorString( QObject::tr(
"Function `%1` requires a valid date" ).arg(
"magnetic_declination_rate_of_change"_L1 ) );
3446 const double latitude = QgsExpressionUtils::getDoubleValue( values.at( 2 ), parent );
3451 const double longitude = QgsExpressionUtils::getDoubleValue( values.at( 3 ), parent );
3456 const double height = QgsExpressionUtils::getDoubleValue( values.at( 4 ), parent );
3461 const QString filePath = QgsExpressionUtils::getFilePathValue( values.at( 5 ), context, parent );
3466 double declination = 0;
3474 if ( model.getComponentsWithTimeDerivatives(
qDateTimeToDecimalYear( dt ), latitude, longitude, height, Bx, By, Bz, Bxt, Byt, Bzt ) )
3484 if (
QgsMagneticModel::fieldComponentsWithTimeDerivatives( Bx, By, Bz, Bxt, Byt, Bzt, H, F, D, I, Ht, Ft, Dt, It ) )
3490 parent->
setEvalErrorString( QObject::tr(
"Cannot evaluate magnetic declination rate of change" ) );
3496 parent->
setEvalErrorString( QObject::tr(
"Cannot evaluate magnetic declination rate of change: %1" ).arg( model.error() ) );
3501 parent->
setEvalErrorString( QObject::tr(
"Cannot evaluate magnetic declination rate of change: %1" ).arg( e.
what() ) );
3508 const QString name = QgsExpressionUtils::getStringValue( values.at( 0 ), parent );
3509 const QDateTime dt = QgsExpressionUtils::getDateTimeValue( values.at( 1 ), parent );
3512 parent->
setEvalErrorString( QObject::tr(
"Function `%1` requires a valid date" ).arg(
"magnetic_inclination_rate_of_change"_L1 ) );
3515 const double latitude = QgsExpressionUtils::getDoubleValue( values.at( 2 ), parent );
3520 const double longitude = QgsExpressionUtils::getDoubleValue( values.at( 3 ), parent );
3525 const double height = QgsExpressionUtils::getDoubleValue( values.at( 4 ), parent );
3530 const QString filePath = QgsExpressionUtils::getFilePathValue( values.at( 5 ), context, parent );
3535 double declination = 0;
3543 if ( model.getComponentsWithTimeDerivatives(
qDateTimeToDecimalYear( dt ), latitude, longitude, height, Bx, By, Bz, Bxt, Byt, Bzt ) )
3553 if (
QgsMagneticModel::fieldComponentsWithTimeDerivatives( Bx, By, Bz, Bxt, Byt, Bzt, H, F, D, I, Ht, Ft, Dt, It ) )
3559 parent->
setEvalErrorString( QObject::tr(
"Cannot evaluate magnetic inclination rate of change" ) );
3565 parent->
setEvalErrorString( QObject::tr(
"Cannot evaluate magnetic inclination rate of change: %1" ).arg( model.error() ) );
3570 parent->
setEvalErrorString( QObject::tr(
"Cannot evaluate magnetic inclination rate of change: %1" ).arg( e.
what() ) );
3575#define ENSURE_GEOM_TYPE( f, g, geomtype ) \
3576 if ( !( f ).hasGeometry() ) \
3577 return QVariant(); \
3578 QgsGeometry g = ( f ).geometry(); \
3579 if ( ( g ).type() != ( geomtype ) ) \
3586 if ( g.isMultipart() )
3588 return g.asMultiPoint().at( 0 ).x();
3592 return g.asPoint().x();
3600 if ( g.isMultipart() )
3602 return g.asMultiPoint().at( 0 ).y();
3606 return g.asPoint().y();
3620 if ( g.isEmpty() || !abGeom->
is3D() )
3633 if ( collection->numGeometries() > 0 )
3646 QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
3652 return QVariant( isValid );
3657 QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
3661 const QString methodString = QgsExpressionUtils::getStringValue( values.at( 1 ), parent ).trimmed();
3662#if GEOS_VERSION_NUM < GEOS_COMPUTE_VERSION( 3, 10, 0 )
3667 if ( methodString.compare(
"linework"_L1, Qt::CaseInsensitive ) == 0 )
3669 else if ( methodString.compare(
"structure"_L1, Qt::CaseInsensitive ) == 0 )
3672 const bool keepCollapsed = values.value( 2 ).toBool();
3677 valid = geom.
makeValid( method, keepCollapsed );
3681 parent->
setEvalErrorString( QObject::tr(
"The make_valid parameters require a newer GEOS library version" ) );
3685 return QVariant::fromValue( valid );
3690 QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
3696 for (
int i = 0; i < multiGeom.size(); ++i )
3698 array += QVariant::fromValue( multiGeom.at( i ) );
3706 QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
3718 QVariant result( centroid.
asPoint().
x() );
3724 QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
3736 QVariant result( centroid.
asPoint().
y() );
3742 QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
3760 if ( collection->numGeometries() == 1 )
3773 QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
3791 if ( collection->numGeometries() == 1 )
3804 QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
3809 int idx = QgsExpressionUtils::getNativeIntValue( values.at( 1 ), parent );
3836 QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
3853 QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
3870 QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
3875 bool ignoreClosing =
false;
3876 if ( values.length() > 1 )
3878 ignoreClosing = QgsExpressionUtils::getIntValue( values.at( 1 ), parent );
3888 bool skipLast =
false;
3889 if ( ignoreClosing && ring.count() > 2 && ring.first() == ring.last() )
3894 for (
int i = 0; i < ( skipLast ? ring.count() - 1 : ring.count() ); ++i )
3906 QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
3917 for (
int i = 0; i < line->numPoints() - 1; ++i )
3931 QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
3941 if ( collection->numGeometries() == 1 )
3948 if ( !curvePolygon )
3952 qlonglong idx = QgsExpressionUtils::getIntValue( values.at( 1 ), parent ) - 1;
3958 QVariant result = curve ? QVariant::fromValue(
QgsGeometry( curve ) ) : QVariant();
3964 QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
3974 qlonglong idx = QgsExpressionUtils::getIntValue( values.at( 1 ), parent ) - 1;
3980 QVariant result = part ? QVariant::fromValue(
QgsGeometry( part ) ) : QVariant();
3986 QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
3995 return QVariant::fromValue(
QgsGeometry( boundary ) );
4000 QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
4009 return QVariant::fromValue( merged );
4014 const QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
4018 const QgsGeometry geom2 = QgsExpressionUtils::getGeometry( values.at( 1 ), parent );
4023 if ( sharedPaths.
isNull() )
4026 return QVariant::fromValue( sharedPaths );
4032 QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
4037 double tolerance = QgsExpressionUtils::getDoubleValue( values.at( 1 ), parent );
4040 if ( simplified.
isNull() )
4048 QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
4053 double tolerance = QgsExpressionUtils::getDoubleValue( values.at( 1 ), parent );
4058 if ( simplified.
isNull() )
4066 QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
4071 int iterations = std::min( QgsExpressionUtils::getNativeIntValue( values.at( 1 ), parent ), 10 );
4072 double offset = std::clamp( QgsExpressionUtils::getDoubleValue( values.at( 2 ), parent ), 0.0, 0.5 );
4073 double minLength = QgsExpressionUtils::getDoubleValue( values.at( 3 ), parent );
4074 double maxAngle = std::clamp( QgsExpressionUtils::getDoubleValue( values.at( 4 ), parent ), 0.0, 180.0 );
4076 QgsGeometry smoothed = geom.
smooth(
static_cast<unsigned int>( iterations ), offset, minLength, maxAngle );
4085 const QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
4090 const double wavelength = QgsExpressionUtils::getDoubleValue( values.at( 1 ), parent );
4091 const double amplitude = QgsExpressionUtils::getDoubleValue( values.at( 2 ), parent );
4092 const bool strict = QgsExpressionUtils::getIntValue( values.at( 3 ), parent );
4103 const QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
4108 const double minWavelength = QgsExpressionUtils::getDoubleValue( values.at( 1 ), parent );
4109 const double maxWavelength = QgsExpressionUtils::getDoubleValue( values.at( 2 ), parent );
4110 const double minAmplitude = QgsExpressionUtils::getDoubleValue( values.at( 3 ), parent );
4111 const double maxAmplitude = QgsExpressionUtils::getDoubleValue( values.at( 4 ), parent );
4112 const long long seed = QgsExpressionUtils::getIntValue( values.at( 5 ), parent );
4123 const QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
4128 const double wavelength = QgsExpressionUtils::getDoubleValue( values.at( 1 ), parent );
4129 const double amplitude = QgsExpressionUtils::getDoubleValue( values.at( 2 ), parent );
4130 const bool strict = QgsExpressionUtils::getIntValue( values.at( 3 ), parent );
4141 const QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
4146 const double minWavelength = QgsExpressionUtils::getDoubleValue( values.at( 1 ), parent );
4147 const double maxWavelength = QgsExpressionUtils::getDoubleValue( values.at( 2 ), parent );
4148 const double minAmplitude = QgsExpressionUtils::getDoubleValue( values.at( 3 ), parent );
4149 const double maxAmplitude = QgsExpressionUtils::getDoubleValue( values.at( 4 ), parent );
4150 const long long seed = QgsExpressionUtils::getIntValue( values.at( 5 ), parent );
4161 const QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
4166 const double wavelength = QgsExpressionUtils::getDoubleValue( values.at( 1 ), parent );
4167 const double amplitude = QgsExpressionUtils::getDoubleValue( values.at( 2 ), parent );
4168 const bool strict = QgsExpressionUtils::getIntValue( values.at( 3 ), parent );
4179 const QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
4184 const double minWavelength = QgsExpressionUtils::getDoubleValue( values.at( 1 ), parent );
4185 const double maxWavelength = QgsExpressionUtils::getDoubleValue( values.at( 2 ), parent );
4186 const double minAmplitude = QgsExpressionUtils::getDoubleValue( values.at( 3 ), parent );
4187 const double maxAmplitude = QgsExpressionUtils::getDoubleValue( values.at( 4 ), parent );
4188 const long long seed = QgsExpressionUtils::getIntValue( values.at( 5 ), parent );
4199 const QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
4204 const QVariantList pattern = QgsExpressionUtils::getListValue( values.at( 1 ), parent );
4205 QVector< double > dashPattern;
4206 dashPattern.reserve( pattern.size() );
4207 for (
const QVariant &value : std::as_const( pattern ) )
4210 double v = value.toDouble( &ok );
4222 if ( dashPattern.size() % 2 != 0 )
4224 parent->
setEvalErrorString( u
"Dash pattern must contain an even number of elements"_s );
4228 const QString startRuleString = QgsExpressionUtils::getStringValue( values.at( 2 ), parent ).trimmed();
4230 if ( startRuleString.compare(
"no_rule"_L1, Qt::CaseInsensitive ) == 0 )
4232 else if ( startRuleString.compare(
"full_dash"_L1, Qt::CaseInsensitive ) == 0 )
4234 else if ( startRuleString.compare(
"half_dash"_L1, Qt::CaseInsensitive ) == 0 )
4236 else if ( startRuleString.compare(
"full_gap"_L1, Qt::CaseInsensitive ) == 0 )
4238 else if ( startRuleString.compare(
"half_gap"_L1, Qt::CaseInsensitive ) == 0 )
4242 parent->
setEvalErrorString( u
"'%1' is not a valid dash pattern rule"_s.arg( startRuleString ) );
4246 const QString endRuleString = QgsExpressionUtils::getStringValue( values.at( 3 ), parent ).trimmed();
4248 if ( endRuleString.compare(
"no_rule"_L1, Qt::CaseInsensitive ) == 0 )
4250 else if ( endRuleString.compare(
"full_dash"_L1, Qt::CaseInsensitive ) == 0 )
4252 else if ( endRuleString.compare(
"half_dash"_L1, Qt::CaseInsensitive ) == 0 )
4254 else if ( endRuleString.compare(
"full_gap"_L1, Qt::CaseInsensitive ) == 0 )
4256 else if ( endRuleString.compare(
"half_gap"_L1, Qt::CaseInsensitive ) == 0 )
4260 parent->
setEvalErrorString( u
"'%1' is not a valid dash pattern rule"_s.arg( endRuleString ) );
4264 const QString adjustString = QgsExpressionUtils::getStringValue( values.at( 4 ), parent ).trimmed();
4266 if ( adjustString.compare(
"both"_L1, Qt::CaseInsensitive ) == 0 )
4268 else if ( adjustString.compare(
"dash"_L1, Qt::CaseInsensitive ) == 0 )
4270 else if ( adjustString.compare(
"gap"_L1, Qt::CaseInsensitive ) == 0 )
4274 parent->
setEvalErrorString( u
"'%1' is not a valid dash pattern size adjustment"_s.arg( adjustString ) );
4278 const double patternOffset = QgsExpressionUtils::getDoubleValue( values.at( 5 ), parent );
4289 const QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
4294 const long long count = QgsExpressionUtils::getIntValue( values.at( 1 ), parent );
4296 if ( densified.
isNull() )
4304 const QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
4309 const double distance = QgsExpressionUtils::getDoubleValue( values.at( 1 ), parent );
4311 if ( densified.
isNull() )
4320 if ( values.size() == 1 && QgsExpressionUtils::isList( values.at( 0 ) ) )
4322 list = QgsExpressionUtils::getListValue( values.at( 0 ), parent );
4329 QVector< QgsGeometry > parts;
4330 parts.reserve( list.size() );
4331 for (
const QVariant &value : std::as_const( list ) )
4333 QgsGeometry part = QgsExpressionUtils::getGeometry( value, parent );
4344 if ( values.count() < 2 || values.count() > 4 )
4346 parent->
setEvalErrorString( QObject::tr(
"Function make_point requires 2-4 arguments" ) );
4350 double x = QgsExpressionUtils::getDoubleValue( values.at( 0 ), parent );
4351 double y = QgsExpressionUtils::getDoubleValue( values.at( 1 ), parent );
4352 double z = values.count() >= 3 ? QgsExpressionUtils::getDoubleValue( values.at( 2 ), parent ) : 0.0;
4353 double m = values.count() >= 4 ? QgsExpressionUtils::getDoubleValue( values.at( 3 ), parent ) : 0.0;
4354 switch ( values.count() )
4368 double x = QgsExpressionUtils::getDoubleValue( values.at( 0 ), parent );
4369 double y = QgsExpressionUtils::getDoubleValue( values.at( 1 ), parent );
4370 double m = QgsExpressionUtils::getDoubleValue( values.at( 2 ), parent );
4376 if ( values.empty() )
4381 QVector<QgsPoint> points;
4382 points.reserve( values.count() );
4384 auto addPoint = [&points](
const QgsGeometry &geom ) {
4398 for (
const QVariant &value : values )
4400 if ( value.userType() == QMetaType::Type::QVariantList )
4402 const QVariantList list = value.toList();
4403 for (
const QVariant &v : list )
4405 addPoint( QgsExpressionUtils::getGeometry( v, parent ) );
4410 addPoint( QgsExpressionUtils::getGeometry( value, parent ) );
4414 if ( points.count() < 2 )
4422 if ( values.count() < 1 )
4424 parent->
setEvalErrorString( QObject::tr(
"Function make_polygon requires an argument" ) );
4428 QgsGeometry outerRing = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
4436 auto polygon = std::make_unique< QgsPolygon >();
4450 if ( !exteriorRing )
4453 polygon->setExteriorRing( exteriorRing->
segmentize() );
4456 for (
int i = 1; i < values.count(); ++i )
4458 QgsGeometry ringGeom = QgsExpressionUtils::getGeometry( values.at( i ), parent );
4480 polygon->addInteriorRing( ring->
segmentize() );
4483 return QVariant::fromValue(
QgsGeometry( std::move( polygon ) ) );
4488 auto tr = std::make_unique<QgsTriangle>();
4489 auto lineString = std::make_unique<QgsLineString>();
4490 lineString->clear();
4492 for (
const QVariant &value : values )
4494 QgsGeometry geom = QgsExpressionUtils::getGeometry( value, parent );
4516 lineString->addVertex( *point );
4519 tr->setExteriorRing( lineString.release() );
4521 return QVariant::fromValue(
QgsGeometry( tr.release() ) );
4526 QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
4533 double radius = QgsExpressionUtils::getDoubleValue( values.at( 1 ), parent );
4534 int segment = QgsExpressionUtils::getNativeIntValue( values.at( 2 ), parent );
4556 return QVariant::fromValue(
QgsGeometry( circ.toPolygon(
static_cast<unsigned int>(
segment ) ) ) );
4561 QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
4568 double majorAxis = QgsExpressionUtils::getDoubleValue( values.at( 1 ), parent );
4569 double minorAxis = QgsExpressionUtils::getDoubleValue( values.at( 2 ), parent );
4570 double azimuth = QgsExpressionUtils::getDoubleValue( values.at( 3 ), parent );
4571 int segment = QgsExpressionUtils::getNativeIntValue( values.at( 4 ), parent );
4591 QgsEllipse elp( *point, majorAxis, minorAxis, azimuth );
4592 return QVariant::fromValue(
QgsGeometry( elp.toPolygon(
static_cast<unsigned int>(
segment ) ) ) );
4597 QgsGeometry pt1 = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
4604 QgsGeometry pt2 = QgsExpressionUtils::getGeometry( values.at( 1 ), parent );
4611 unsigned int nbEdges =
static_cast<unsigned int>( QgsExpressionUtils::getIntValue( values.at( 2 ), parent ) );
4614 parent->
setEvalErrorString( QObject::tr(
"Number of edges/sides must be greater than 2" ) );
4621 parent->
setEvalErrorString( QObject::tr(
"Option can be 0 (inscribed) or 1 (circumscribed)" ) );
4660 QgsGeometry pt1 = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
4666 QgsGeometry pt2 = QgsExpressionUtils::getGeometry( values.at( 1 ), parent );
4681 QgsGeometry pt1 = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
4687 QgsGeometry pt2 = QgsExpressionUtils::getGeometry( values.at( 1 ), parent );
4693 QgsGeometry pt3 = QgsExpressionUtils::getGeometry( values.at( 2 ), parent );
4702 parent->
setEvalErrorString( QObject::tr(
"Option can be 0 (distance) or 1 (projected)" ) );
4726 return QVariant::fromValue( geom.
vertexAt( idx ) );
4734 const int idx = QgsExpressionUtils::getNativeIntValue( values.at( 0 ), parent );
4736 const QVariant v = pointAt( geom, idx, parent );
4739 return QVariant( v.value<
QgsPoint>().
x() );
4745 if ( values.at( 1 ).isNull() && !values.at( 0 ).isNull() )
4747 return fcnOldXat( values, f, parent, node );
4749 else if ( values.at( 0 ).isNull() && !values.at( 1 ).isNull() )
4751 return fcnOldXat( QVariantList() << values[1], f, parent, node );
4754 const QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
4760 const int vertexNumber = QgsExpressionUtils::getNativeIntValue( values.at( 1 ), parent );
4762 const QVariant v = pointAt( geom, vertexNumber, parent );
4764 return QVariant( v.value<
QgsPoint>().
x() );
4774 const int idx = QgsExpressionUtils::getNativeIntValue( values.at( 0 ), parent );
4776 const QVariant v = pointAt( geom, idx, parent );
4779 return QVariant( v.value<
QgsPoint>().
y() );
4785 if ( values.at( 1 ).isNull() && !values.at( 0 ).isNull() )
4787 return fcnOldYat( values, f, parent, node );
4789 else if ( values.at( 0 ).isNull() && !values.at( 1 ).isNull() )
4791 return fcnOldYat( QVariantList() << values[1], f, parent, node );
4794 const QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
4800 const int vertexNumber = QgsExpressionUtils::getNativeIntValue( values.at( 1 ), parent );
4802 const QVariant v = pointAt( geom, vertexNumber, parent );
4804 return QVariant( v.value<
QgsPoint>().
y() );
4811 const QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
4817 const int vertexNumber = QgsExpressionUtils::getNativeIntValue( values.at( 1 ), parent );
4819 const QVariant v = pointAt( geom, vertexNumber, parent );
4821 return QVariant( v.value<
QgsPoint>().
z() );
4828 const QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
4834 const int vertexNumber = QgsExpressionUtils::getNativeIntValue( values.at( 1 ), parent );
4836 const QVariant v = pointAt( geom, vertexNumber, parent );
4838 return QVariant( v.value<
QgsPoint>().
m() );
4846 QString wkt = QgsExpressionUtils::getStringValue( values.at( 0 ), parent );
4848 QVariant result = !geom.
isNull() ? QVariant::fromValue( geom ) : QVariant();
4854 const QByteArray wkb = QgsExpressionUtils::getBinaryValue( values.at( 0 ), parent );
4860 return !geom.
isNull() ? QVariant::fromValue( geom ) : QVariant();
4865 QString gml = QgsExpressionUtils::getStringValue( values.at( 0 ), parent );
4872 ogcContext.
layer = mapLayerPtr.data();
4877 QVariant result = !geom.
isNull() ? QVariant::fromValue( geom ) : QVariant();
4892 return QVariant( area );
4896 parent->
setEvalErrorString( QObject::tr(
"An error occurred while calculating area" ) );
4908 QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
4913 return QVariant( geom.
area() );
4927 return QVariant( len );
4931 parent->
setEvalErrorString( QObject::tr(
"An error occurred while calculating length" ) );
4952 return QVariant( len );
4956 parent->
setEvalErrorString( QObject::tr(
"An error occurred while calculating perimeter" ) );
4962 return f.
geometry().
isNull() ? QVariant( 0 ) : QVariant( f.geometry().constGet()->perimeter() );
4968 QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
4974 return QVariant( geom.
length() );
4979 QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
4985 QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
4994 QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
5003 QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
5019 if ( !curvePolygon )
5031 QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
5038 return QVariant( curvePolygon->
ringCount() );
5040 bool foundPoly =
false;
5049 if ( !curvePolygon )
5060 return QVariant( ringCount );
5065 QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
5067 QVariant result = !geomBounds.
isNull() ? QVariant::fromValue( geomBounds ) : QVariant();
5073 QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
5079 QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
5085 const QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
5094 QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
5100 QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
5106 QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
5112 QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
5118 QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
5126 double max = std::numeric_limits< double >::lowest();
5130 double z = ( *it ).z();
5136 if ( max == std::numeric_limits< double >::lowest() )
5139 return QVariant( max );
5144 QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
5152 double min = std::numeric_limits< double >::max();
5156 double z = ( *it ).z();
5162 if ( min == std::numeric_limits< double >::max() )
5165 return QVariant( min );
5170 QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
5178 double min = std::numeric_limits< double >::max();
5182 double m = ( *it ).m();
5188 if ( min == std::numeric_limits< double >::max() )
5191 return QVariant( min );
5196 QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
5204 double max = std::numeric_limits< double >::lowest();
5208 double m = ( *it ).m();
5214 if ( max == std::numeric_limits< double >::lowest() )
5217 return QVariant( max );
5222 QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
5226 parent->
setEvalErrorString( QObject::tr(
"Function `sinuosity` requires a line geometry." ) );
5235 const QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
5239 parent->
setEvalErrorString( QObject::tr(
"Function `straight_distance_2d` requires a line geometry or a multi line geometry with a single part." ) );
5248 QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
5253 parent->
setEvalErrorString( QObject::tr(
"Function `roundness` requires a polygon geometry or a multi polygon geometry with a single part." ) );
5263 QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
5267 std::unique_ptr< QgsAbstractGeometry > flipped( geom.
constGet()->
clone() );
5269 return QVariant::fromValue(
QgsGeometry( std::move( flipped ) ) );
5274 QgsGeometry fGeom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
5293 return QVariant::fromValue( curve->
isClosed() );
5298 QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
5311 std::unique_ptr< QgsLineString > closedLine( line->
clone() );
5312 closedLine->close();
5314 result = QVariant::fromValue(
QgsGeometry( std::move( closedLine ) ) );
5328 std::unique_ptr< QgsLineString > closedLine( line->
clone() );
5329 closedLine->close();
5331 closed->addGeometry( closedLine.release() );
5334 result = QVariant::fromValue(
QgsGeometry( std::move( closed ) ) );
5342 QgsGeometry fGeom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
5346 return QVariant::fromValue( fGeom.
isEmpty() );
5352 return QVariant::fromValue(
true );
5354 QgsGeometry fGeom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
5355 return QVariant::fromValue( fGeom.
isNull() || fGeom.
isEmpty() );
5360 if ( values.length() < 2 || values.length() > 3 )
5363 QgsGeometry fGeom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
5364 QgsGeometry sGeom = QgsExpressionUtils::getGeometry( values.at( 1 ), parent );
5371 if ( values.length() == 2 )
5374 QString result = engine->relate( sGeom.
constGet() );
5375 return QVariant::fromValue( result );
5380 QString pattern = QgsExpressionUtils::getStringValue( values.at( 2 ), parent );
5381 bool result = engine->relatePattern( sGeom.
constGet(), pattern );
5382 return QVariant::fromValue( result );
5388 QgsGeometry fGeom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
5389 QgsGeometry sGeom = QgsExpressionUtils::getGeometry( values.at( 1 ), parent );
5394 QgsGeometry fGeom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
5395 QgsGeometry sGeom = QgsExpressionUtils::getGeometry( values.at( 1 ), parent );
5396 return fGeom.
disjoint( sGeom ) ? TVL_True : TVL_False;
5400 QgsGeometry fGeom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
5401 QgsGeometry sGeom = QgsExpressionUtils::getGeometry( values.at( 1 ), parent );
5402 return fGeom.
intersects( sGeom ) ? TVL_True : TVL_False;
5406 QgsGeometry fGeom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
5407 QgsGeometry sGeom = QgsExpressionUtils::getGeometry( values.at( 1 ), parent );
5408 return fGeom.
touches( sGeom ) ? TVL_True : TVL_False;
5412 QgsGeometry fGeom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
5413 QgsGeometry sGeom = QgsExpressionUtils::getGeometry( values.at( 1 ), parent );
5414 return fGeom.
crosses( sGeom ) ? TVL_True : TVL_False;
5418 QgsGeometry fGeom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
5419 QgsGeometry sGeom = QgsExpressionUtils::getGeometry( values.at( 1 ), parent );
5420 return fGeom.
contains( sGeom ) ? TVL_True : TVL_False;
5424 QgsGeometry fGeom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
5425 QgsGeometry sGeom = QgsExpressionUtils::getGeometry( values.at( 1 ), parent );
5426 return fGeom.
overlaps( sGeom ) ? TVL_True : TVL_False;
5430 QgsGeometry fGeom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
5431 QgsGeometry sGeom = QgsExpressionUtils::getGeometry( values.at( 1 ), parent );
5432 return fGeom.
within( sGeom ) ? TVL_True : TVL_False;
5437 QgsGeometry fGeom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
5438 QgsGeometry sGeom = QgsExpressionUtils::getGeometry( values.at( 1 ), parent );
5444 QgsGeometry fGeom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
5445 QgsGeometry sGeom = QgsExpressionUtils::getGeometry( values.at( 1 ), parent );
5446 const QString backendStr = QgsExpressionUtils::getStringValue( values.at( 2 ), parent );
5451 SET_EVAL_ERROR( u
"Geometry backend '%1' does not exist!"_s.arg( backendStr ) );
5453 QVariant ret = TVL_False;
5456 ret = fGeom.
isExactlyEqual( sGeom, backend ) ? TVL_True : TVL_False;
5467 QgsGeometry fGeom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
5468 QgsGeometry sGeom = QgsExpressionUtils::getGeometry( values.at( 1 ), parent );
5469 const QString backendStr = QgsExpressionUtils::getStringValue( values.at( 2 ), parent );
5474 SET_EVAL_ERROR( u
"Geometry backend '%1' does not exist!"_s.arg( backendStr ) );
5476 QVariant ret = TVL_False;
5490 QgsGeometry fGeom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
5491 QgsGeometry sGeom = QgsExpressionUtils::getGeometry( values.at( 1 ), parent );
5492 const QString backendStr = QgsExpressionUtils::getStringValue( values.at( 2 ), parent );
5497 SET_EVAL_ERROR( u
"Geometry backend '%1' does not exist!"_s.arg( backendStr ) );
5499 double epsilon = QgsExpressionUtils::getDoubleValue( values.at( 3 ), parent );
5501 QVariant ret = TVL_False;
5504 ret = fGeom.
isFuzzyEqual( sGeom, epsilon, backend ) ? TVL_True : TVL_False;
5515 const QgsGeometry fGeom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
5516 const double dist = QgsExpressionUtils::getDoubleValue( values.at( 1 ), parent );
5517 const int seg = QgsExpressionUtils::getNativeIntValue( values.at( 2 ), parent );
5518 const QString endCapString = QgsExpressionUtils::getStringValue( values.at( 3 ), parent ).trimmed();
5519 const QString joinString = QgsExpressionUtils::getStringValue( values.at( 4 ), parent ).trimmed();
5520 const double miterLimit = QgsExpressionUtils::getDoubleValue( values.at( 5 ), parent );
5523 if ( endCapString.compare(
"flat"_L1, Qt::CaseInsensitive ) == 0 )
5525 else if ( endCapString.compare(
"square"_L1, Qt::CaseInsensitive ) == 0 )
5529 if ( joinString.compare(
"miter"_L1, Qt::CaseInsensitive ) == 0 )
5531 else if ( joinString.compare(
"bevel"_L1, Qt::CaseInsensitive ) == 0 )
5535 QVariant result = !geom.
isNull() ? QVariant::fromValue( geom ) : QVariant();
5541 const QgsGeometry fGeom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
5543 return !reoriented.
isNull() ? QVariant::fromValue( reoriented ) : QVariant();
5548 const QgsGeometry fGeom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
5550 return !reoriented.
isNull() ? QVariant::fromValue( reoriented ) : QVariant();
5555 const QgsGeometry fGeom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
5557 return !reoriented.
isNull() ? QVariant::fromValue( reoriented ) : QVariant();
5562 QgsGeometry fGeom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
5577 parent->
setEvalErrorString( QObject::tr(
"Function `wedge_buffer` requires a point value for the center." ) );
5581 double azimuth = QgsExpressionUtils::getDoubleValue( values.at( 1 ), parent );
5582 double width = QgsExpressionUtils::getDoubleValue( values.at( 2 ), parent );
5583 double outerRadius = QgsExpressionUtils::getDoubleValue( values.at( 3 ), parent );
5584 double innerRadius = QgsExpressionUtils::getDoubleValue( values.at( 4 ), parent );
5587 QVariant result = !geom.
isNull() ? QVariant::fromValue( geom ) : QVariant();
5593 QgsGeometry fGeom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
5596 parent->
setEvalErrorString( QObject::tr(
"Function `tapered_buffer` requires a line geometry." ) );
5600 double startWidth = QgsExpressionUtils::getDoubleValue( values.at( 1 ), parent );
5601 double endWidth = QgsExpressionUtils::getDoubleValue( values.at( 2 ), parent );
5602 int segments =
static_cast< int >( QgsExpressionUtils::getIntValue( values.at( 3 ), parent ) );
5605 QVariant result = !geom.
isNull() ? QVariant::fromValue( geom ) : QVariant();
5611 QgsGeometry fGeom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
5614 parent->
setEvalErrorString( QObject::tr(
"Function `buffer_by_m` requires a line geometry." ) );
5618 int segments =
static_cast< int >( QgsExpressionUtils::getIntValue( values.at( 1 ), parent ) );
5621 QVariant result = !geom.
isNull() ? QVariant::fromValue( geom ) : QVariant();
5627 QgsGeometry fGeom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
5628 double dist = QgsExpressionUtils::getDoubleValue( values.at( 1 ), parent );
5629 int segments = QgsExpressionUtils::getNativeIntValue( values.at( 2 ), parent );
5630 const int joinInt = QgsExpressionUtils::getIntValue( values.at( 3 ), parent );
5631 if ( joinInt < 1 || joinInt > 3 )
5635 double miterLimit = QgsExpressionUtils::getDoubleValue( values.at( 3 ), parent );
5638 QVariant result = !geom.
isNull() ? QVariant::fromValue( geom ) : QVariant();
5644 QgsGeometry fGeom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
5645 double dist = QgsExpressionUtils::getDoubleValue( values.at( 1 ), parent );
5646 int segments = QgsExpressionUtils::getNativeIntValue( values.at( 2 ), parent );
5648 const int joinInt = QgsExpressionUtils::getIntValue( values.at( 3 ), parent );
5649 if ( joinInt < 1 || joinInt > 3 )
5653 double miterLimit = QgsExpressionUtils::getDoubleValue( values.at( 3 ), parent );
5656 QVariant result = !geom.
isNull() ? QVariant::fromValue( geom ) : QVariant();
5662 QgsGeometry fGeom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
5663 const double distStart = QgsExpressionUtils::getDoubleValue( values.at( 1 ), parent );
5664 const double distEnd = QgsExpressionUtils::getDoubleValue( values.at( 2 ), parent );
5666 const double deflectionStart = QgsExpressionUtils::getDoubleValue( values.at( 3 ), parent );
5667 const double deflectionEnd = QgsExpressionUtils::getDoubleValue( values.at( 4 ), parent );
5670 QVariant result = !geom.
isNull() ? QVariant::fromValue( geom ) : QVariant();
5676 QgsGeometry fGeom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
5677 double dx = QgsExpressionUtils::getDoubleValue( values.at( 1 ), parent );
5678 double dy = QgsExpressionUtils::getDoubleValue( values.at( 2 ), parent );
5680 return QVariant::fromValue( fGeom );
5685 QgsGeometry fGeom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
5686 const double rotation = QgsExpressionUtils::getDoubleValue( values.at( 1 ), parent );
5688 const bool perPart = values.value( 3 ).toBool();
5695 std::unique_ptr< QgsGeometryCollection > collection( qgsgeometry_cast< QgsGeometryCollection * >( fGeom.constGet()->clone() ) );
5696 for ( auto it = collection->parts_begin(); it != collection->parts_end(); ++it )
5698 const QgsPointXY partCenter = ( *it )->boundingBox().center();
5699 QTransform t = QTransform::fromTranslate( partCenter.x(), partCenter.y() );
5700 t.rotate( -rotation );
5701 t.translate( -partCenter.x(), -partCenter.y() );
5702 ( *it )->transform( t );
5704 return QVariant::fromValue(
QgsGeometry( std::move( collection ) ) );
5716 parent->
setEvalErrorString( QObject::tr(
"Function 'rotate' requires a point value for the center" ) );
5724 fGeom.
rotate( rotation, pt );
5725 return QVariant::fromValue( fGeom );
5731 QgsGeometry fGeom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
5732 const double xScale = QgsExpressionUtils::getDoubleValue( values.at( 1 ), parent );
5733 const double yScale = QgsExpressionUtils::getDoubleValue( values.at( 2 ), parent );
5734 const QgsGeometry center = values.at( 3 ).isValid() ? QgsExpressionUtils::getGeometry( values.at( 3 ), parent ) :
QgsGeometry();
5740 pt = fGeom.boundingBox().center();
5744 parent->setEvalErrorString( QObject::tr(
"Function 'scale' requires a point value for the center" ) );
5749 pt = center.asPoint();
5752 QTransform t = QTransform::fromTranslate( pt.
x(), pt.
y() );
5753 t.scale( xScale, yScale );
5754 t.translate( -pt.
x(), -pt.
y() );
5756 return QVariant::fromValue( fGeom );
5761 QgsGeometry fGeom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
5767 const double deltaX = QgsExpressionUtils::getDoubleValue( values.at( 1 ), parent );
5768 const double deltaY = QgsExpressionUtils::getDoubleValue( values.at( 2 ), parent );
5770 const double rotationZ = QgsExpressionUtils::getDoubleValue( values.at( 3 ), parent );
5772 const double scaleX = QgsExpressionUtils::getDoubleValue( values.at( 4 ), parent );
5773 const double scaleY = QgsExpressionUtils::getDoubleValue( values.at( 5 ), parent );
5775 const double deltaZ = QgsExpressionUtils::getDoubleValue( values.at( 6 ), parent );
5776 const double deltaM = QgsExpressionUtils::getDoubleValue( values.at( 7 ), parent );
5777 const double scaleZ = QgsExpressionUtils::getDoubleValue( values.at( 8 ), parent );
5778 const double scaleM = QgsExpressionUtils::getDoubleValue( values.at( 9 ), parent );
5789 QTransform transform;
5790 transform.translate( deltaX, deltaY );
5791 transform.rotate( rotationZ );
5792 transform.scale( scaleX, scaleY );
5793 fGeom.
transform( transform, deltaZ, scaleZ, deltaM, scaleM );
5795 return QVariant::fromValue( fGeom );
5801 QgsGeometry fGeom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
5803 QVariant result = !geom.
isNull() ? QVariant::fromValue( geom ) : QVariant();
5808 QgsGeometry fGeom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
5810 QVariant result = !geom.
isNull() ? QVariant::fromValue( geom ) : QVariant();
5816 QgsGeometry fGeom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
5817 double tolerance = QgsExpressionUtils::getDoubleValue( values.at( 1 ), parent );
5819 QVariant result = !geom.
isNull() ? QVariant::fromValue( geom ) : QVariant();
5825 QgsGeometry fGeom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
5827 QVariant result = !geom.
isNull() ? QVariant::fromValue( geom ) : QVariant();
5831#if GEOS_VERSION_NUM >= GEOS_COMPUTE_VERSION( 3, 11, 0 )
5836 QgsGeometry fGeom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
5837 const double targetPercent = QgsExpressionUtils::getDoubleValue( values.at( 1 ), parent );
5838 const bool allowHoles = values.value( 2 ).toBool();
5840 QVariant result = !geom.
isNull() ? QVariant::fromValue( geom ) : QVariant();
5853 QgsGeometry fGeom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
5855 if ( values.length() == 2 )
5856 segments = QgsExpressionUtils::getNativeIntValue( values.at( 1 ), parent );
5864 QVariant result = !geom.
isNull() ? QVariant::fromValue( geom ) : QVariant();
5870 QgsGeometry fGeom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
5872 QVariant result = !geom.
isNull() ? QVariant::fromValue( geom ) : QVariant();
5878 const QgsGeometry fGeom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
5884 double area,
angle, width, height;
5897 QgsGeometry fGeom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
5898 QgsGeometry sGeom = QgsExpressionUtils::getGeometry( values.at( 1 ), parent );
5900 QVariant result = !geom.
isNull() ? QVariant::fromValue( geom ) : QVariant();
5911 QgsGeometry fGeom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent,
true );
5922 result = reversed ? QVariant::fromValue(
QgsGeometry( reversed ) ) : QVariant();
5932 reversed->addGeometry( curve->
reversed() );
5939 result = reversed ? QVariant::fromValue(
QgsGeometry( std::move( reversed ) ) ) : QVariant();
5945 QString
string = QgsExpressionUtils::getStringValue( values.at( 0 ), parent );
5946 std::reverse(
string.begin(),
string.end() );
5952 QgsGeometry fGeom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
5972 QVariant result = exterior ? QVariant::fromValue(
QgsGeometry( exterior ) ) : QVariant();
5978 QgsGeometry fGeom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
5979 QgsGeometry sGeom = QgsExpressionUtils::getGeometry( values.at( 1 ), parent );
5980 return QVariant( fGeom.
distance( sGeom ) );
5985 QgsGeometry g1 = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
5986 QgsGeometry g2 = QgsExpressionUtils::getGeometry( values.at( 1 ), parent );
5989 if ( values.length() == 3 && values.at( 2 ).isValid() )
5991 double densify = QgsExpressionUtils::getDoubleValue( values.at( 2 ), parent );
5992 densify = std::clamp( densify, 0.0, 1.0 );
6000 return res > -1 ? QVariant( res ) : QVariant();
6005 QgsGeometry fGeom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
6006 QgsGeometry sGeom = QgsExpressionUtils::getGeometry( values.at( 1 ), parent );
6008 QVariant result = !geom.
isNull() ? QVariant::fromValue( geom ) : QVariant();
6013 QgsGeometry fGeom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
6014 QgsGeometry sGeom = QgsExpressionUtils::getGeometry( values.at( 1 ), parent );
6016 QVariant result = !geom.
isNull() ? QVariant::fromValue( geom ) : QVariant();
6021 QgsGeometry fGeom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
6022 QgsGeometry sGeom = QgsExpressionUtils::getGeometry( values.at( 1 ), parent );
6024 QVariant result = !geom.
isNull() ? QVariant::fromValue( geom ) : QVariant();
6030 if ( values.length() < 1 || values.length() > 2 )
6033 QgsGeometry fGeom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
6035 if ( values.length() == 2 )
6036 prec = QgsExpressionUtils::getNativeIntValue( values.at( 1 ), parent );
6037 QString wkt = fGeom.
asWkt( prec );
6038 return QVariant( wkt );
6043 QgsGeometry fGeom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
6044 return fGeom.
isNull() ? QVariant() : QVariant( fGeom.asWkb() );
6049 if ( values.length() != 2 )
6051 parent->
setEvalErrorString( QObject::tr(
"Function `azimuth` requires exactly two parameters. %n given.",
nullptr, values.length() ) );
6055 QgsGeometry fGeom1 = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
6056 QgsGeometry fGeom2 = QgsExpressionUtils::getGeometry( values.at( 1 ), parent );
6084 parent->
setEvalErrorString( QObject::tr(
"Function `azimuth` requires two points as arguments." ) );
6091 if ( pt1->
y() < pt2->
y() )
6093 else if ( pt1->
y() > pt2->
y() )
6101 if ( pt1->
x() < pt2->
x() )
6103 else if ( pt1->
x() > pt2->
x() )
6104 return M_PI + ( M_PI_2 );
6109 if ( pt1->
x() < pt2->
x() )
6111 if ( pt1->
y() < pt2->
y() )
6113 return std::atan( std::fabs( pt1->
x() - pt2->
x() ) / std::fabs( pt1->
y() - pt2->
y() ) );
6117 return std::atan( std::fabs( pt1->
y() - pt2->
y() ) / std::fabs( pt1->
x() - pt2->
x() ) ) + ( M_PI_2 );
6123 if ( pt1->
y() > pt2->
y() )
6125 return std::atan( std::fabs( pt1->
x() - pt2->
x() ) / std::fabs( pt1->
y() - pt2->
y() ) ) + M_PI;
6129 return std::atan( std::fabs( pt1->
y() - pt2->
y() ) / std::fabs( pt1->
x() - pt2->
x() ) ) + ( M_PI + ( M_PI_2 ) );
6136 const QgsGeometry geom1 = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
6137 const QgsGeometry geom2 = QgsExpressionUtils::getGeometry( values.at( 1 ), parent );
6139 QString ellipsoid = QgsExpressionUtils::getStringValue( values.at( 3 ), parent );
6143 parent->
setEvalErrorString( QObject::tr(
"Function `bearing` requires two valid point geometries." ) );
6151 parent->
setEvalErrorString( QObject::tr(
"Function `bearing` requires point geometries or multi point geometries with a single part." ) );
6165 if ( ellipsoid.isEmpty() )
6167 ellipsoid = context->
variable( u
"project_ellipsoid"_s ).toString();
6173 parent->
setEvalErrorString( QObject::tr(
"Function `bearing` requires a valid source CRS." ) );
6181 parent->
setEvalErrorString( QObject::tr(
"Function `bearing` requires a valid ellipsoid acronym or ellipsoid authority ID." ) );
6187 const double bearing = da.
bearing( point1, point2 );
6188 if ( std::isfinite( bearing ) )
6190 return std::fmod( bearing + 2 * M_PI, 2 * M_PI );
6203 QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
6211 double distance = QgsExpressionUtils::getDoubleValue( values.at( 1 ), parent );
6212 double azimuth = QgsExpressionUtils::getDoubleValue( values.at( 2 ), parent );
6213 double inclination = QgsExpressionUtils::getDoubleValue( values.at( 3 ), parent );
6216 QgsPoint newPoint = p->
project( distance, 180.0 * azimuth / M_PI, 180.0 * inclination / M_PI );
6223 QgsGeometry fGeom1 = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
6224 QgsGeometry fGeom2 = QgsExpressionUtils::getGeometry( values.at( 1 ), parent );
6251 parent->
setEvalErrorString( u
"Function 'inclination' requires two points as arguments."_s );
6260 if ( values.length() != 3 )
6263 QgsGeometry fGeom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
6264 double x = QgsExpressionUtils::getDoubleValue( values.at( 1 ), parent );
6265 double y = QgsExpressionUtils::getDoubleValue( values.at( 2 ), parent );
6269 QVariant result = geom.
constGet() ? QVariant::fromValue( geom ) : QVariant();
6275 if ( values.length() < 2 )
6278 QgsGeometry fGeom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
6281 return values.at( 0 );
6283 QString expString = QgsExpressionUtils::getStringValue( values.at( 1 ), parent );
6284 QVariant cachedExpression;
6289 if ( cachedExpression.isValid() )
6296 bool asc = values.value( 2 ).toBool();
6314 Q_ASSERT( collection );
6318 QgsExpressionSorter sorter( orderBy );
6320 QList<QgsFeature> partFeatures;
6321 partFeatures.reserve( collection->
partCount() );
6322 for (
int i = 0; i < collection->
partCount(); ++i )
6328 sorter.sortFeatures( partFeatures, unconstedContext );
6332 Q_ASSERT( orderedGeom );
6337 for (
const QgsFeature &feature : std::as_const( partFeatures ) )
6342 QVariant result = QVariant::fromValue(
QgsGeometry( orderedGeom ) );
6345 delete unconstedContext;
6352 QgsGeometry fromGeom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
6353 QgsGeometry toGeom = QgsExpressionUtils::getGeometry( values.at( 1 ), parent );
6357 QVariant result = !geom.
isNull() ? QVariant::fromValue( geom ) : QVariant();
6363 QgsGeometry fromGeom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
6364 QgsGeometry toGeom = QgsExpressionUtils::getGeometry( values.at( 1 ), parent );
6368 QVariant result = !geom.
isNull() ? QVariant::fromValue( geom ) : QVariant();
6374 QgsGeometry lineGeom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
6375 double distance = QgsExpressionUtils::getDoubleValue( values.at( 1 ), parent );
6379 QVariant result = !geom.
isNull() ? QVariant::fromValue( geom ) : QVariant();
6385 const QgsGeometry lineGeom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
6386 const double m = QgsExpressionUtils::getDoubleValue( values.at( 1 ), parent );
6387 const bool use3DDistance = values.at( 2 ).toBool();
6389 double x, y, z, distance;
6412 QgsGeometry lineGeom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
6415 parent->
setEvalErrorString( QObject::tr(
"line_substring requires a curve geometry input" ) );
6435 double startDistance = QgsExpressionUtils::getDoubleValue( values.at( 1 ), parent );
6436 double endDistance = QgsExpressionUtils::getDoubleValue( values.at( 2 ), parent );
6438 std::unique_ptr< QgsCurve > substring( curve->
curveSubstring( startDistance, endDistance ) );
6440 return !result.isNull() ? QVariant::fromValue( result ) : QVariant();
6445 QgsGeometry lineGeom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
6446 double distance = QgsExpressionUtils::getDoubleValue( values.at( 1 ), parent );
6453 QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
6454 int vertex = QgsExpressionUtils::getNativeIntValue( values.at( 1 ), parent );
6459 vertex = count + vertex;
6467 QgsGeometry geom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
6468 int vertex = QgsExpressionUtils::getNativeIntValue( values.at( 1 ), parent );
6473 vertex = count + vertex;
6481 QgsGeometry lineGeom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
6482 QgsGeometry pointGeom = QgsExpressionUtils::getGeometry( values.at( 1 ), parent );
6486 return distance >= 0 ? distance : QVariant();
6491 const QgsGeometry lineGeom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
6492 const double m = QgsExpressionUtils::getDoubleValue( values.at( 1 ), parent );
6493 const bool use3DDistance = values.at( 2 ).toBool();
6495 double x, y, z, distance;
6504 return found ? distance : QVariant();
6509 if ( values.length() == 2 && values.at( 1 ).toInt() != 0 )
6511 double number = QgsExpressionUtils::getDoubleValue( values.at( 0 ), parent );
6512 return qgsRound( number, QgsExpressionUtils::getNativeIntValue( values.at( 1 ), parent ) );
6515 if ( values.length() >= 1 )
6517 double number = QgsExpressionUtils::getDoubleValue( values.at( 0 ), parent );
6518 return QVariant( qlonglong( std::round( number ) ) );
6533 const double value = QgsExpressionUtils::getDoubleValue( values.at( 0 ), parent );
6534 const int places = QgsExpressionUtils::getNativeIntValue( values.at( 1 ), parent );
6535 const QString language = QgsExpressionUtils::getStringValue( values.at( 2 ), parent );
6542 const bool omitGroupSeparator = values.value( 3 ).toBool();
6543 const bool trimTrailingZeros = values.value( 4 ).toBool();
6545 QLocale locale = !language.isEmpty() ? QLocale( language ) : QLocale();
6546 if ( !omitGroupSeparator )
6547 locale.setNumberOptions( locale.numberOptions() & ~QLocale::NumberOption::OmitGroupSeparator );
6549 locale.setNumberOptions( locale.numberOptions() | QLocale::NumberOption::OmitGroupSeparator );
6551 QString res = locale.toString( value,
'f', places );
6553 if ( trimTrailingZeros )
6555 const QChar decimal = locale.decimalPoint().at( 0 );
6556 const QChar zeroDigit = locale.zeroDigit().at( 0 );
6558 if ( res.contains( decimal ) )
6560 int trimPoint = res.length() - 1;
6562 while ( res.at( trimPoint ) == zeroDigit )
6565 if ( res.at( trimPoint ) == decimal )
6568 res.truncate( trimPoint + 1 );
6577 QDateTime datetime = QgsExpressionUtils::getDateTimeValue( values.at( 0 ), parent );
6578 const QString format = QgsExpressionUtils::getStringValue( values.at( 1 ), parent );
6579 const QString language = QgsExpressionUtils::getStringValue( values.at( 2 ), parent );
6582 if ( format.indexOf(
"Z" ) > 0 )
6583 datetime = datetime.toUTC();
6585 QLocale locale = !language.isEmpty() ? QLocale( language ) : QLocale();
6586 return locale.toString( datetime, format );
6591 const QVariant variant = values.at( 0 );
6593 QColor color = QgsExpressionUtils::getColorValue( variant, parent, isQColor );
6594 if ( !color.isValid() )
6597 const float alpha = color.alphaF();
6598 if ( color.spec() == QColor::Spec::Cmyk )
6600 const float avg = ( color.cyanF() + color.magentaF() + color.yellowF() )
6602 color = QColor::fromCmykF( avg, avg, avg, color.blackF(), alpha );
6606 const float avg = ( color.redF() + color.greenF() + color.blueF() )
6608 color.setRgbF( avg, avg, avg, alpha );
6611 return isQColor ? QVariant( color ) : QVariant(
QgsSymbolLayerUtils::encodeColor( color ) );
6618 double ratio = QgsExpressionUtils::getDoubleValue( values.at( 2 ), parent );
6623 else if ( ratio < 0 )
6628 int red =
static_cast<int>( color1.red() * ( 1 - ratio ) + color2.red() * ratio );
6629 int green =
static_cast<int>( color1.green() * ( 1 - ratio ) + color2.green() * ratio );
6630 int blue =
static_cast<int>( color1.blue() * ( 1 - ratio ) + color2.blue() * ratio );
6631 int alpha =
static_cast<int>( color1.alpha() * ( 1 - ratio ) + color2.alpha() * ratio );
6633 QColor newColor( red, green, blue, alpha );
6640 const QVariant variant1 = values.at( 0 );
6641 const QVariant variant2 = values.at( 1 );
6643 if ( variant1.userType() != variant2.userType() )
6645 parent->
setEvalErrorString( QObject::tr(
"Both color arguments must have the same type (string or color object)" ) );
6650 const QColor color1 = QgsExpressionUtils::getColorValue( variant1, parent, isQColor );
6651 if ( !color1.isValid() )
6654 const QColor color2 = QgsExpressionUtils::getColorValue( variant2, parent, isQColor );
6655 if ( !color2.isValid() )
6658 if ( ( color1.spec() == QColor::Cmyk ) != ( color2.spec() == QColor::Cmyk ) )
6660 parent->
setEvalErrorString( QObject::tr(
"Both color arguments must have compatible color type (CMYK or RGB/HSV/HSL)" ) );
6664 const float ratio =
static_cast<float>( std::clamp( QgsExpressionUtils::getDoubleValue( values.at( 2 ), parent ), 0., 1. ) );
6670 const float alpha = color1.alphaF() * ( 1 - ratio ) + color2.alphaF() * ratio;
6671 if ( color1.spec() == QColor::Spec::Cmyk )
6673 float cyan = color1.cyanF() * ( 1 - ratio ) + color2.cyanF() * ratio;
6674 float magenta = color1.magentaF() * ( 1 - ratio ) + color2.magentaF() * ratio;
6675 float yellow = color1.yellowF() * ( 1 - ratio ) + color2.yellowF() * ratio;
6676 float black = color1.blackF() * ( 1 - ratio ) + color2.blackF() * ratio;
6677 newColor = QColor::fromCmykF( cyan, magenta, yellow, black, alpha );
6681 float red = color1.redF() * ( 1 - ratio ) + color2.redF() * ratio;
6682 float green = color1.greenF() * ( 1 - ratio ) + color2.greenF() * ratio;
6683 float blue = color1.blueF() * ( 1 - ratio ) + color2.blueF() * ratio;
6684 newColor = QColor::fromRgbF( red, green, blue, alpha );
6689 return isQColor ? QVariant( newColor ) : QVariant(
QgsSymbolLayerUtils::encodeColor( newColor ) );
6694 int red = QgsExpressionUtils::getNativeIntValue( values.at( 0 ), parent );
6695 int green = QgsExpressionUtils::getNativeIntValue( values.at( 1 ), parent );
6696 int blue = QgsExpressionUtils::getNativeIntValue( values.at( 2 ), parent );
6697 QColor color = QColor( red, green, blue );
6698 if ( !color.isValid() )
6700 parent->
setEvalErrorString( QObject::tr(
"Cannot convert '%1:%2:%3' to color" ).arg( red ).arg( green ).arg( blue ) );
6701 color = QColor( 0, 0, 0 );
6704 return u
"%1,%2,%3"_s.arg( color.red() ).arg( color.green() ).arg( color.blue() );
6709 const float red = std::clamp(
static_cast<float>( QgsExpressionUtils::getDoubleValue( values.at( 0 ), parent ) ), 0.f, 1.f );
6710 const float green = std::clamp(
static_cast<float>( QgsExpressionUtils::getDoubleValue( values.at( 1 ), parent ) ), 0.f, 1.f );
6711 const float blue = std::clamp(
static_cast<float>( QgsExpressionUtils::getDoubleValue( values.at( 2 ), parent ) ), 0.f, 1.f );
6712 const float alpha = std::clamp(
static_cast<float>( QgsExpressionUtils::getDoubleValue( values.at( 3 ), parent ) ), 0.f, 1.f );
6713 QColor color = QColor::fromRgbF( red, green, blue, alpha );
6714 if ( !color.isValid() )
6716 parent->
setEvalErrorString( QObject::tr(
"Cannot convert '%1:%2:%3:%4' to color" ).arg( red ).arg( green ).arg( blue ).arg( alpha ) );
6725 QgsExpressionNode *node = QgsExpressionUtils::getNode( values.at( 0 ), parent );
6726 QVariant value = node->
eval( parent, context );
6730 node = QgsExpressionUtils::getNode( values.at( 1 ), parent );
6732 value = node->
eval( parent, context );
6740 QgsExpressionNode *node = QgsExpressionUtils::getNode( values.at( 0 ), parent );
6742 QVariant value = node->
eval( parent, context );
6744 if ( value.toBool() )
6746 node = QgsExpressionUtils::getNode( values.at( 1 ), parent );
6748 value = node->
eval( parent, context );
6753 node = QgsExpressionUtils::getNode( values.at( 2 ), parent );
6755 value = node->
eval( parent, context );
6763 int red = QgsExpressionUtils::getNativeIntValue( values.at( 0 ), parent );
6764 int green = QgsExpressionUtils::getNativeIntValue( values.at( 1 ), parent );
6765 int blue = QgsExpressionUtils::getNativeIntValue( values.at( 2 ), parent );
6766 int alpha = QgsExpressionUtils::getNativeIntValue( values.at( 3 ), parent );
6767 QColor color = QColor( red, green, blue, alpha );
6768 if ( !color.isValid() )
6770 parent->
setEvalErrorString( QObject::tr(
"Cannot convert '%1:%2:%3:%4' to color" ).arg( red ).arg( green ).arg( blue ).arg( alpha ) );
6771 color = QColor( 0, 0, 0 );
6780 if ( values.at( 0 ).userType() == qMetaTypeId< QgsGradientColorRamp>() )
6782 expRamp = QgsExpressionUtils::getRamp( values.at( 0 ), parent );
6787 QString rampName = QgsExpressionUtils::getStringValue( values.at( 0 ), parent );
6791 parent->
setEvalErrorString( QObject::tr(
"\"%1\" is not a valid color ramp" ).arg( rampName ) );
6796 double value = QgsExpressionUtils::getDoubleValue( values.at( 1 ), parent );
6797 QColor color = ramp->
color( value );
6810 double hue = QgsExpressionUtils::getIntValue( values.at( 0 ), parent ) / 360.0;
6812 double saturation = QgsExpressionUtils::getIntValue( values.at( 1 ), parent ) / 100.0;
6814 double lightness = QgsExpressionUtils::getIntValue( values.at( 2 ), parent ) / 100.0;
6816 QColor color = QColor::fromHslF( hue, saturation, lightness );
6818 if ( !color.isValid() )
6820 parent->
setEvalErrorString( QObject::tr(
"Cannot convert '%1:%2:%3' to color" ).arg( hue ).arg( saturation ).arg( lightness ) );
6821 color = QColor( 0, 0, 0 );
6824 return u
"%1,%2,%3"_s.arg( color.red() ).arg( color.green() ).arg( color.blue() );
6830 double hue = QgsExpressionUtils::getIntValue( values.at( 0 ), parent ) / 360.0;
6832 double saturation = QgsExpressionUtils::getIntValue( values.at( 1 ), parent ) / 100.0;
6834 double lightness = QgsExpressionUtils::getIntValue( values.at( 2 ), parent ) / 100.0;
6836 double alpha = QgsExpressionUtils::getIntValue( values.at( 3 ), parent ) / 255.0;
6838 QColor color = QColor::fromHslF( hue, saturation, lightness, alpha );
6839 if ( !color.isValid() )
6841 parent->
setEvalErrorString( QObject::tr(
"Cannot convert '%1:%2:%3:%4' to color" ).arg( hue ).arg( saturation ).arg( lightness ).arg( alpha ) );
6842 color = QColor( 0, 0, 0 );
6849 float hue = std::clamp(
static_cast<float>( QgsExpressionUtils::getDoubleValue( values.at( 0 ), parent ) ), 0.f, 1.f );
6850 float saturation = std::clamp(
static_cast<float>( QgsExpressionUtils::getDoubleValue( values.at( 1 ), parent ) ), 0.f, 1.f );
6851 float lightness = std::clamp(
static_cast<float>( QgsExpressionUtils::getDoubleValue( values.at( 2 ), parent ) ), 0.f, 1.f );
6852 float alpha = std::clamp(
static_cast<float>( QgsExpressionUtils::getDoubleValue( values.at( 3 ), parent ) ), 0.f, 1.f );
6854 QColor color = QColor::fromHslF( hue, saturation, lightness, alpha );
6855 if ( !color.isValid() )
6857 parent->
setEvalErrorString( QObject::tr(
"Cannot convert '%1:%2:%3:%4' to color" ).arg( hue ).arg( saturation ).arg( lightness ).arg( alpha ) );
6867 double hue = QgsExpressionUtils::getIntValue( values.at( 0 ), parent ) / 360.0;
6869 double saturation = QgsExpressionUtils::getIntValue( values.at( 1 ), parent ) / 100.0;
6871 double value = QgsExpressionUtils::getIntValue( values.at( 2 ), parent ) / 100.0;
6873 QColor color = QColor::fromHsvF( hue, saturation, value );
6875 if ( !color.isValid() )
6877 parent->
setEvalErrorString( QObject::tr(
"Cannot convert '%1:%2:%3' to color" ).arg( hue ).arg( saturation ).arg( value ) );
6878 color = QColor( 0, 0, 0 );
6881 return u
"%1,%2,%3"_s.arg( color.red() ).arg( color.green() ).arg( color.blue() );
6887 double hue = QgsExpressionUtils::getIntValue( values.at( 0 ), parent ) / 360.0;
6889 double saturation = QgsExpressionUtils::getIntValue( values.at( 1 ), parent ) / 100.0;
6891 double value = QgsExpressionUtils::getIntValue( values.at( 2 ), parent ) / 100.0;
6893 double alpha = QgsExpressionUtils::getIntValue( values.at( 3 ), parent ) / 255.0;
6895 QColor color = QColor::fromHsvF( hue, saturation, value, alpha );
6896 if ( !color.isValid() )
6898 parent->
setEvalErrorString( QObject::tr(
"Cannot convert '%1:%2:%3:%4' to color" ).arg( hue ).arg( saturation ).arg( value ).arg( alpha ) );
6899 color = QColor( 0, 0, 0 );
6906 float hue = std::clamp(
static_cast<float>( QgsExpressionUtils::getDoubleValue( values.at( 0 ), parent ) ), 0.f, 1.f );
6907 float saturation = std::clamp(
static_cast<float>( QgsExpressionUtils::getDoubleValue( values.at( 1 ), parent ) ), 0.f, 1.f );
6908 float value = std::clamp(
static_cast<float>( QgsExpressionUtils::getDoubleValue( values.at( 2 ), parent ) ), 0.f, 1.f );
6909 float alpha = std::clamp(
static_cast<float>( QgsExpressionUtils::getDoubleValue( values.at( 3 ), parent ) ), 0.f, 1.f );
6910 QColor color = QColor::fromHsvF( hue, saturation, value, alpha );
6912 if ( !color.isValid() )
6914 parent->
setEvalErrorString( QObject::tr(
"Cannot convert '%1:%2:%3:%4' to color" ).arg( hue ).arg( saturation ).arg( value ).arg( alpha ) );
6923 const float cyan = std::clamp(
static_cast<float>( QgsExpressionUtils::getDoubleValue( values.at( 0 ), parent ) ), 0.f, 1.f );
6924 const float magenta = std::clamp(
static_cast<float>( QgsExpressionUtils::getDoubleValue( values.at( 1 ), parent ) ), 0.f, 1.f );
6925 const float yellow = std::clamp(
static_cast<float>( QgsExpressionUtils::getDoubleValue( values.at( 2 ), parent ) ), 0.f, 1.f );
6926 const float black = std::clamp(
static_cast<float>( QgsExpressionUtils::getDoubleValue( values.at( 3 ), parent ) ), 0.f, 1.f );
6927 const float alpha = std::clamp(
static_cast<float>( QgsExpressionUtils::getDoubleValue( values.at( 4 ), parent ) ), 0.f, 1.f );
6929 QColor color = QColor::fromCmykF( cyan, magenta, yellow, black, alpha );
6930 if ( !color.isValid() )
6932 parent->
setEvalErrorString( QObject::tr(
"Cannot convert '%1:%2:%3:%4:%5' to color" ).arg( cyan ).arg( magenta ).arg( yellow ).arg( black ).arg( alpha ) );
6942 double cyan = QgsExpressionUtils::getIntValue( values.at( 0 ), parent ) / 100.0;
6944 double magenta = QgsExpressionUtils::getIntValue( values.at( 1 ), parent ) / 100.0;
6946 double yellow = QgsExpressionUtils::getIntValue( values.at( 2 ), parent ) / 100.0;
6948 double black = QgsExpressionUtils::getIntValue( values.at( 3 ), parent ) / 100.0;
6950 QColor color = QColor::fromCmykF( cyan, magenta, yellow, black );
6952 if ( !color.isValid() )
6954 parent->
setEvalErrorString( QObject::tr(
"Cannot convert '%1:%2:%3:%4' to color" ).arg( cyan ).arg( magenta ).arg( yellow ).arg( black ) );
6955 color = QColor( 0, 0, 0 );
6958 return u
"%1,%2,%3"_s.arg( color.red() ).arg( color.green() ).arg( color.blue() );
6964 double cyan = QgsExpressionUtils::getIntValue( values.at( 0 ), parent ) / 100.0;
6966 double magenta = QgsExpressionUtils::getIntValue( values.at( 1 ), parent ) / 100.0;
6968 double yellow = QgsExpressionUtils::getIntValue( values.at( 2 ), parent ) / 100.0;
6970 double black = QgsExpressionUtils::getIntValue( values.at( 3 ), parent ) / 100.0;
6972 double alpha = QgsExpressionUtils::getIntValue( values.at( 4 ), parent ) / 255.0;
6974 QColor color = QColor::fromCmykF( cyan, magenta, yellow, black, alpha );
6975 if ( !color.isValid() )
6977 parent->
setEvalErrorString( QObject::tr(
"Cannot convert '%1:%2:%3:%4:%5' to color" ).arg( cyan ).arg( magenta ).arg( yellow ).arg( black ).arg( alpha ) );
6978 color = QColor( 0, 0, 0 );
6985 const QVariant variant = values.at( 0 );
6987 const QColor color = QgsExpressionUtils::getColorValue( variant, parent, isQColor );
6988 if ( !color.isValid() )
6991 QString part = QgsExpressionUtils::getStringValue( values.at( 1 ), parent );
6992 if ( part.compare(
"red"_L1, Qt::CaseInsensitive ) == 0 )
6994 else if ( part.compare(
"green"_L1, Qt::CaseInsensitive ) == 0 )
6995 return color.green();
6996 else if ( part.compare(
"blue"_L1, Qt::CaseInsensitive ) == 0 )
6997 return color.blue();
6998 else if ( part.compare(
"alpha"_L1, Qt::CaseInsensitive ) == 0 )
6999 return color.alpha();
7000 else if ( part.compare(
"hue"_L1, Qt::CaseInsensitive ) == 0 )
7001 return static_cast< double >( color.hsvHueF() * 360 );
7002 else if ( part.compare(
"saturation"_L1, Qt::CaseInsensitive ) == 0 )
7003 return static_cast< double >( color.hsvSaturationF() * 100 );
7004 else if ( part.compare(
"value"_L1, Qt::CaseInsensitive ) == 0 )
7005 return static_cast< double >( color.valueF() * 100 );
7006 else if ( part.compare(
"hsl_hue"_L1, Qt::CaseInsensitive ) == 0 )
7007 return static_cast< double >( color.hslHueF() * 360 );
7008 else if ( part.compare(
"hsl_saturation"_L1, Qt::CaseInsensitive ) == 0 )
7009 return static_cast< double >( color.hslSaturationF() * 100 );
7010 else if ( part.compare(
"lightness"_L1, Qt::CaseInsensitive ) == 0 )
7011 return static_cast< double >( color.lightnessF() * 100 );
7012 else if ( part.compare(
"cyan"_L1, Qt::CaseInsensitive ) == 0 )
7013 return static_cast< double >( color.cyanF() * 100 );
7014 else if ( part.compare(
"magenta"_L1, Qt::CaseInsensitive ) == 0 )
7015 return static_cast< double >( color.magentaF() * 100 );
7016 else if ( part.compare(
"yellow"_L1, Qt::CaseInsensitive ) == 0 )
7017 return static_cast< double >( color.yellowF() * 100 );
7018 else if ( part.compare(
"black"_L1, Qt::CaseInsensitive ) == 0 )
7019 return static_cast< double >( color.blackF() * 100 );
7021 parent->
setEvalErrorString( QObject::tr(
"Unknown color component '%1'" ).arg( part ) );
7027 const QVariantMap map = QgsExpressionUtils::getMapValue( values.at( 0 ), parent );
7030 parent->
setEvalErrorString( QObject::tr(
"A minimum of two colors is required to create a ramp" ) );
7034 QList< QColor > colors;
7036 for ( QVariantMap::const_iterator it = map.constBegin(); it != map.constEnd(); ++it )
7039 if ( !colors.last().isValid() )
7041 parent->
setEvalErrorString( QObject::tr(
"Cannot convert '%1' to color" ).arg( it.value().toString() ) );
7045 double step = it.key().toDouble();
7046 if ( it == map.constBegin() )
7051 else if ( it == map.constEnd() )
7061 bool discrete = values.at( 1 ).toBool();
7063 if ( colors.empty() )
7066 return QVariant::fromValue(
QgsGradientColorRamp( colors.first(), colors.last(), discrete, stops ) );
7071 const QVariant variant = values.at( 0 );
7073 QColor color = QgsExpressionUtils::getColorValue( variant, parent, isQColor );
7074 if ( !color.isValid() )
7077 QString part = QgsExpressionUtils::getStringValue( values.at( 1 ), parent );
7078 int value = QgsExpressionUtils::getNativeIntValue( values.at( 2 ), parent );
7079 if ( part.compare(
"red"_L1, Qt::CaseInsensitive ) == 0 )
7080 color.setRed( std::clamp( value, 0, 255 ) );
7081 else if ( part.compare(
"green"_L1, Qt::CaseInsensitive ) == 0 )
7082 color.setGreen( std::clamp( value, 0, 255 ) );
7083 else if ( part.compare(
"blue"_L1, Qt::CaseInsensitive ) == 0 )
7084 color.setBlue( std::clamp( value, 0, 255 ) );
7085 else if ( part.compare(
"alpha"_L1, Qt::CaseInsensitive ) == 0 )
7086 color.setAlpha( std::clamp( value, 0, 255 ) );
7087 else if ( part.compare(
"hue"_L1, Qt::CaseInsensitive ) == 0 )
7088 color.setHsv( std::clamp( value, 0, 359 ), color.hsvSaturation(), color.value(), color.alpha() );
7089 else if ( part.compare(
"saturation"_L1, Qt::CaseInsensitive ) == 0 )
7090 color.setHsvF( color.hsvHueF(), std::clamp( value, 0, 100 ) / 100.0, color.valueF(), color.alphaF() );
7091 else if ( part.compare(
"value"_L1, Qt::CaseInsensitive ) == 0 )
7092 color.setHsvF( color.hsvHueF(), color.hsvSaturationF(), std::clamp( value, 0, 100 ) / 100.0, color.alphaF() );
7093 else if ( part.compare(
"hsl_hue"_L1, Qt::CaseInsensitive ) == 0 )
7094 color.setHsl( std::clamp( value, 0, 359 ), color.hslSaturation(), color.lightness(), color.alpha() );
7095 else if ( part.compare(
"hsl_saturation"_L1, Qt::CaseInsensitive ) == 0 )
7096 color.setHslF( color.hslHueF(), std::clamp( value, 0, 100 ) / 100.0, color.lightnessF(), color.alphaF() );
7097 else if ( part.compare(
"lightness"_L1, Qt::CaseInsensitive ) == 0 )
7098 color.setHslF( color.hslHueF(), color.hslSaturationF(), std::clamp( value, 0, 100 ) / 100.0, color.alphaF() );
7099 else if ( part.compare(
"cyan"_L1, Qt::CaseInsensitive ) == 0 )
7100 color.setCmykF( std::clamp( value, 0, 100 ) / 100.0, color.magentaF(), color.yellowF(), color.blackF(), color.alphaF() );
7101 else if ( part.compare(
"magenta"_L1, Qt::CaseInsensitive ) == 0 )
7102 color.setCmykF( color.cyanF(), std::clamp( value, 0, 100 ) / 100.0, color.yellowF(), color.blackF(), color.alphaF() );
7103 else if ( part.compare(
"yellow"_L1, Qt::CaseInsensitive ) == 0 )
7104 color.setCmykF( color.cyanF(), color.magentaF(), std::clamp( value, 0, 100 ) / 100.0, color.blackF(), color.alphaF() );
7105 else if ( part.compare(
"black"_L1, Qt::CaseInsensitive ) == 0 )
7106 color.setCmykF( color.cyanF(), color.magentaF(), color.yellowF(), std::clamp( value, 0, 100 ) / 100.0, color.alphaF() );
7109 parent->
setEvalErrorString( QObject::tr(
"Unknown color component '%1'" ).arg( part ) );
7112 return isQColor ? QVariant( color ) : QVariant(
QgsSymbolLayerUtils::encodeColor( color ) );
7117 const QVariant variant = values.at( 0 );
7119 QColor color = QgsExpressionUtils::getColorValue( variant, parent, isQColor );
7120 if ( !color.isValid() )
7123 color = color.darker( QgsExpressionUtils::getNativeIntValue( values.at( 1 ), parent ) );
7125 return isQColor ? QVariant( color ) : QVariant(
QgsSymbolLayerUtils::encodeColor( color ) );
7130 const QVariant variant = values.at( 0 );
7132 QColor color = QgsExpressionUtils::getColorValue( variant, parent, isQColor );
7133 if ( !color.isValid() )
7136 color = color.lighter( QgsExpressionUtils::getNativeIntValue( values.at( 1 ), parent ) );
7138 return isQColor ? QVariant( color ) : QVariant(
QgsSymbolLayerUtils::encodeColor( color ) );
7143 QgsFeature feat = QgsExpressionUtils::getFeature( values.at( 0 ), parent );
7146 return QVariant::fromValue( geom );
7152 const QgsFeature feat = QgsExpressionUtils::getFeature( values.at( 0 ), parent );
7160 QgsGeometry fGeom = QgsExpressionUtils::getGeometry( values.at( 0 ), parent );
7165 return QVariant::fromValue( fGeom );
7168 return QVariant::fromValue( fGeom );
7177 return QVariant::fromValue( fGeom );
7190 bool foundLayer =
false;
7191 std::unique_ptr<QgsVectorLayerFeatureSource> featureSource = QgsExpressionUtils::getFeatureSource( values.at( 0 ), context, parent, foundLayer );
7194 if ( !featureSource || !foundLayer )
7199 const QgsFeatureId fid = QgsExpressionUtils::getIntValue( values.at( 1 ), parent );
7212 result = QVariant::fromValue( fet );
7220 bool foundLayer =
false;
7221 std::unique_ptr<QgsVectorLayerFeatureSource> featureSource = QgsExpressionUtils::getFeatureSource( values.at( 0 ), context, parent, foundLayer );
7224 if ( !featureSource || !foundLayer )
7229 QString cacheValueKey;
7230 if ( values.at( 1 ).userType() == QMetaType::Type::QVariantMap )
7232 QVariantMap attributeMap = QgsExpressionUtils::getMapValue( values.at( 1 ), parent );
7234 QMap<QString, QVariant>::const_iterator i = attributeMap.constBegin();
7235 QString filterString;
7236 for ( ; i != attributeMap.constEnd(); ++i )
7238 if ( !filterString.isEmpty() )
7240 filterString.append(
" AND " );
7244 cacheValueKey = u
"getfeature:%1:%2"_s.arg( featureSource->id(), filterString );
7253 QString attribute = QgsExpressionUtils::getStringValue( values.at( 1 ), parent );
7254 int attributeId = featureSource->fields().lookupField( attribute );
7255 if ( attributeId == -1 )
7260 const QVariant &attVal = values.at( 2 );
7262 cacheValueKey = u
"getfeature:%1:%2:%3"_s.arg( featureSource->id(), QString::number( attributeId ), attVal.toString() );
7285 res = QVariant::fromValue( fet );
7300 if ( !values.isEmpty() )
7303 if ( col && ( values.size() == 1 || !values.at( 1 ).isValid() ) )
7304 fieldName = col->
name();
7305 else if ( values.size() == 2 )
7306 fieldName = QgsExpressionUtils::getStringValue( values.at( 1 ), parent );
7309 QVariant value = values.at( 0 );
7314 if ( fieldIndex == -1 )
7316 parent->
setEvalErrorString( QCoreApplication::translate(
"expression",
"%1: Field not found %2" ).arg( u
"represent_value"_s, fieldName ) );
7322 QgsVectorLayer *layer = QgsExpressionUtils::getVectorLayer( context->
variable( u
"layer"_s ), context, parent );
7325 const QString cacheValueKey = u
"repvalfcnval:%1:%2:%3"_s.arg( layer ? layer->id() : u
"[None]"_s, fieldName, value.toString() );
7336 const QString
cacheKey = u
"repvalfcn:%1:%2"_s.arg( layer ? layer->id() : u
"[None]"_s, fieldName );
7355 parent->
setEvalErrorString( QCoreApplication::translate(
"expression",
"%1: function cannot be evaluated without a context." ).arg( u
"represent_value"_s, fieldName ) );
7363 const QVariant data = values.at( 0 );
7364 const QMimeDatabase db;
7365 return db.mimeTypeForData( data.toByteArray() ).name();
7370 const QString layerProperty = QgsExpressionUtils::getStringValue( values.at( 1 ), parent );
7372 bool translate =
true;
7373 if ( values.length() >= 3 )
7375 translate = QgsExpressionUtils::getTVLValue( values.at( 2 ), parent ) == QgsExpressionUtils::TVL::True;
7378 bool foundLayer =
false;
7379 const QVariant res = QgsExpressionUtils::runMapLayerFunctionThreadSafe(
7383 [layerProperty, translate](
QgsMapLayer *layer ) -> QVariant {
7388 if ( QString::compare( layerProperty, u
"name"_s, Qt::CaseInsensitive ) == 0 )
7389 return layer->name();
7390 else if ( QString::compare( layerProperty, u
"id"_s, Qt::CaseInsensitive ) == 0 )
7392 else if ( QString::compare( layerProperty, u
"title"_s, Qt::CaseInsensitive ) == 0 )
7393 return !layer->metadata().title().isEmpty() ? layer->metadata().title() : layer->serverProperties()->title();
7394 else if ( QString::compare( layerProperty, u
"abstract"_s, Qt::CaseInsensitive ) == 0 )
7395 return !layer->metadata().abstract().isEmpty() ? layer->metadata().abstract() : layer->serverProperties()->abstract();
7396 else if ( QString::compare( layerProperty, u
"keywords"_s, Qt::CaseInsensitive ) == 0 )
7398 QStringList keywords;
7399 const QgsAbstractMetadataBase::KeywordMap keywordMap = layer->metadata().keywords();
7400 for ( auto it = keywordMap.constBegin(); it != keywordMap.constEnd(); ++it )
7402 keywords.append( it.value() );
7404 if ( !keywords.isEmpty() )
7406 return layer->serverProperties()->keywordList();
7408 else if ( QString::compare( layerProperty, u
"data_url"_s, Qt::CaseInsensitive ) == 0 )
7410 else if ( QString::compare( layerProperty, u
"attribution"_s, Qt::CaseInsensitive ) == 0 )
7412 return !layer->
metadata().
rights().isEmpty() ? QVariant( layer->
metadata().
rights() ) : QVariant( layer->serverProperties()->attribution() );
7414 else if ( QString::compare( layerProperty, u
"attribution_url"_s, Qt::CaseInsensitive ) == 0 )
7416 else if ( QString::compare( layerProperty, u
"source"_s, Qt::CaseInsensitive ) == 0 )
7418 else if ( QString::compare( layerProperty, u
"min_scale"_s, Qt::CaseInsensitive ) == 0 )
7420 else if ( QString::compare( layerProperty, u
"max_scale"_s, Qt::CaseInsensitive ) == 0 )
7422 else if ( QString::compare( layerProperty, u
"is_editable"_s, Qt::CaseInsensitive ) == 0 )
7424 else if ( QString::compare( layerProperty, u
"crs"_s, Qt::CaseInsensitive ) == 0 )
7426 else if ( QString::compare( layerProperty, u
"crs_definition"_s, Qt::CaseInsensitive ) == 0 )
7428 else if ( QString::compare( layerProperty, u
"crs_description"_s, Qt::CaseInsensitive ) == 0 )
7430 else if ( QString::compare( layerProperty, u
"crs_ellipsoid"_s, Qt::CaseInsensitive ) == 0 )
7432 else if ( QString::compare( layerProperty, u
"extent"_s, Qt::CaseInsensitive ) == 0 )
7435 QVariant result = QVariant::fromValue( extentGeom );
7438 else if ( QString::compare( layerProperty, u
"distance_units"_s, Qt::CaseInsensitive ) == 0 )
7440 else if ( QString::compare( layerProperty, u
"path"_s, Qt::CaseInsensitive ) == 0 )
7443 return decodedUri.value( u
"path"_s );
7445 else if ( QString::compare( layerProperty, u
"type"_s, Qt::CaseInsensitive ) == 0 )
7447 switch ( layer->
type() )
7450 return translate ? QCoreApplication::translate(
"expressions",
"Vector" ) : u
"Vector"_s;
7452 return translate ? QCoreApplication::translate(
"expressions",
"Raster" ) : u
"Raster"_s;
7454 return translate ? QCoreApplication::translate(
"expressions",
"Mesh" ) : u
"Mesh"_s;
7456 return translate ? QCoreApplication::translate(
"expressions",
"Vector Tile" ) : u
"Vector Tile"_s;
7458 return translate ? QCoreApplication::translate(
"expressions",
"Plugin" ) : u
"Plugin"_s;
7460 return translate ? QCoreApplication::translate(
"expressions",
"Annotation" ) : u
"Annotation"_s;
7462 return translate ? QCoreApplication::translate(
"expressions",
"Point Cloud" ) : u
"Point Cloud"_s;
7464 return translate ? QCoreApplication::translate(
"expressions",
"Group" ) : u
"Group"_s;
7466 return translate ? QCoreApplication::translate(
"expressions",
"Tiled Scene" ) : u
"Tiled Scene"_s;
7472 QgsVectorLayer *vLayer = qobject_cast< QgsVectorLayer * >( layer );
7475 if ( QString::compare( layerProperty, u
"storage_type"_s, Qt::CaseInsensitive ) == 0 )
7477 else if ( QString::compare( layerProperty, u
"geometry_type"_s, Qt::CaseInsensitive ) == 0 )
7479 else if ( QString::compare( layerProperty, u
"feature_count"_s, Qt::CaseInsensitive ) == 0 )
7497 const QString uriPart = values.at( 1 ).toString();
7499 bool foundLayer =
false;
7501 const QVariant res = QgsExpressionUtils::runMapLayerFunctionThreadSafe(
7505 [parent, uriPart](
QgsMapLayer *layer ) -> QVariant {
7506 if ( !layer->dataProvider() )
7508 parent->setEvalErrorString( QObject::tr(
"Layer %1 has invalid data provider" ).arg( layer->name() ) );
7514 if ( !uriPart.isNull() )
7516 return decodedUri.value( uriPart );
7528 parent->
setEvalErrorString( QObject::tr(
"Function `decode_uri` requires a valid layer." ) );
7539 const int band = QgsExpressionUtils::getNativeIntValue( values.at( 1 ), parent );
7540 const QString layerProperty = QgsExpressionUtils::getStringValue( values.at( 2 ), parent );
7542 bool foundLayer =
false;
7543 const QVariant res = QgsExpressionUtils::runMapLayerFunctionThreadSafe(
7547 [parent, band, layerProperty](
QgsMapLayer *layer ) -> QVariant {
7548 QgsRasterLayer *rl = qobject_cast< QgsRasterLayer * >( layer );
7552 if ( band < 1 || band > rl->bandCount() )
7554 parent->setEvalErrorString( QObject::tr(
"Invalid band number %1 for layer" ).arg( band ) );
7560 if ( QString::compare( layerProperty, u
"avg"_s, Qt::CaseInsensitive ) == 0 )
7562 else if ( QString::compare( layerProperty, u
"stdev"_s, Qt::CaseInsensitive ) == 0 )
7564 else if ( QString::compare( layerProperty, u
"min"_s, Qt::CaseInsensitive ) == 0 )
7566 else if ( QString::compare( layerProperty, u
"max"_s, Qt::CaseInsensitive ) == 0 )
7568 else if ( QString::compare( layerProperty, u
"range"_s, Qt::CaseInsensitive ) == 0 )
7570 else if ( QString::compare( layerProperty, u
"sum"_s, Qt::CaseInsensitive ) == 0 )
7574 parent->
setEvalErrorString( QObject::tr(
"Invalid raster statistic: '%1'" ).arg( layerProperty ) );
7604 parent->
setEvalErrorString( QObject::tr(
"Function `raster_statistic` requires a valid raster layer." ) );
7621 QVariantList list = QgsExpressionUtils::getListValue( values.at( 0 ), parent );
7622 bool ascending = values.value( 1 ).toBool();
7623 std::sort( list.begin(), list.end(), [ascending]( QVariant a, QVariant b ) ->
bool { return ( !ascending ? qgsVariantLessThan( b, a ) : qgsVariantLessThan( a, b ) ); } );
7629 return QgsExpressionUtils::getListValue( values.at( 0 ), parent ).length();
7634 return QVariant( QgsExpressionUtils::getListValue( values.at( 0 ), parent ).contains( values.at( 1 ) ) );
7639 return QVariant( QgsExpressionUtils::getListValue( values.at( 0 ), parent ).count( values.at( 1 ) ) );
7644 QVariantList listA = QgsExpressionUtils::getListValue( values.at( 0 ), parent );
7645 QVariantList listB = QgsExpressionUtils::getListValue( values.at( 1 ), parent );
7647 for (
const auto &item : listB )
7649 if ( listA.contains( item ) )
7653 return QVariant( match == listB.count() );
7658 return QgsExpressionUtils::getListValue( values.at( 0 ), parent ).indexOf( values.at( 1 ) );
7663 const QVariantList list = QgsExpressionUtils::getListValue( values.at( 0 ), parent );
7664 const int pos = QgsExpressionUtils::getNativeIntValue( values.at( 1 ), parent );
7665 if ( pos < list.length() && pos >= 0 )
7666 return list.at( pos );
7667 else if ( pos < 0 && ( list.length() + pos ) >= 0 )
7668 return list.at( list.length() + pos );
7674 const QVariantList list = QgsExpressionUtils::getListValue( values.at( 0 ), parent );
7675 return list.value( 0 );
7680 const QVariantList list = QgsExpressionUtils::getListValue( values.at( 0 ), parent );
7681 return list.value( list.size() - 1 );
7686 const QVariantList list = QgsExpressionUtils::getListValue( values.at( 0 ), parent );
7687 return list.isEmpty() ? QVariant() : *std::min_element( list.constBegin(), list.constEnd(), []( QVariant a, QVariant b ) -> bool { return (
qgsVariantLessThan( a, b ) ); } );
7692 const QVariantList list = QgsExpressionUtils::getListValue( values.at( 0 ), parent );
7693 return list.isEmpty() ? QVariant() : *std::max_element( list.constBegin(), list.constEnd(), []( QVariant a, QVariant b ) -> bool { return (
qgsVariantLessThan( a, b ) ); } );
7698 const QVariantList list = QgsExpressionUtils::getListValue( values.at( 0 ), parent );
7701 for (
const QVariant &item : list )
7703 switch ( item.userType() )
7705 case QMetaType::Int:
7706 case QMetaType::UInt:
7707 case QMetaType::LongLong:
7708 case QMetaType::ULongLong:
7709 case QMetaType::Float:
7710 case QMetaType::Double:
7711 total += item.toDouble();
7716 return i == 0 ? QVariant() : total / i;
7721 const QVariantList list = QgsExpressionUtils::getListValue( values.at( 0 ), parent );
7722 QVariantList numbers;
7723 for (
const auto &item : list )
7725 switch ( item.userType() )
7727 case QMetaType::Int:
7728 case QMetaType::UInt:
7729 case QMetaType::LongLong:
7730 case QMetaType::ULongLong:
7731 case QMetaType::Float:
7732 case QMetaType::Double:
7733 numbers.append( item );
7737 std::sort( numbers.begin(), numbers.end(), []( QVariant a, QVariant b ) ->
bool { return ( qgsVariantLessThan( a, b ) ); } );
7738 const int count = numbers.count();
7743 else if ( count % 2 )
7745 return numbers.at( count / 2 );
7749 return ( numbers.at( count / 2 - 1 ).toDouble() + numbers.at( count / 2 ).toDouble() ) / 2;
7755 const QVariantList list = QgsExpressionUtils::getListValue( values.at( 0 ), parent );
7758 for (
const QVariant &item : list )
7760 switch ( item.userType() )
7762 case QMetaType::Int:
7763 case QMetaType::UInt:
7764 case QMetaType::LongLong:
7765 case QMetaType::ULongLong:
7766 case QMetaType::Float:
7767 case QMetaType::Double:
7768 total += item.toDouble();
7773 return i == 0 ? QVariant() : total;
7776static QVariant convertToSameType(
const QVariant &value, QMetaType::Type type )
7778 QVariant result = value;
7779 ( void ) result.convert(
static_cast<int>( type ) );
7785 const QVariantList list = QgsExpressionUtils::getListValue( values.at( 0 ), parent );
7786 QHash< QVariant, int > hash;
7787 for (
const auto &item : list )
7791 const QList< int > occurrences = hash.values();
7792 if ( occurrences.empty() )
7793 return QVariantList();
7795 const int maxValue = *std::max_element( occurrences.constBegin(), occurrences.constEnd() );
7797 const QString option = values.at( 1 ).toString();
7798 if ( option.compare(
"all"_L1, Qt::CaseInsensitive ) == 0 )
7800 return convertToSameType( hash.keys( maxValue ),
static_cast<QMetaType::Type
>( values.at( 0 ).userType() ) );
7802 else if ( option.compare(
"any"_L1, Qt::CaseInsensitive ) == 0 )
7804 if ( hash.isEmpty() )
7807 return QVariant( hash.key( maxValue ) );
7809 else if ( option.compare(
"median"_L1, Qt::CaseInsensitive ) == 0 )
7811 return fcnArrayMedian( QVariantList() << convertToSameType( hash.keys( maxValue ),
static_cast<QMetaType::Type
>( values.at( 0 ).userType() ) ), context, parent, node );
7813 else if ( option.compare(
"real_majority"_L1, Qt::CaseInsensitive ) == 0 )
7815 if ( maxValue * 2 <= list.size() )
7818 return QVariant( hash.key( maxValue ) );
7829 const QVariantList list = QgsExpressionUtils::getListValue( values.at( 0 ), parent );
7830 QHash< QVariant, int > hash;
7831 for (
const auto &item : list )
7835 const QList< int > occurrences = hash.values();
7836 if ( occurrences.empty() )
7837 return QVariantList();
7839 const int minValue = *std::min_element( occurrences.constBegin(), occurrences.constEnd() );
7841 const QString option = values.at( 1 ).toString();
7842 if ( option.compare(
"all"_L1, Qt::CaseInsensitive ) == 0 )
7844 return convertToSameType( hash.keys( minValue ),
static_cast<QMetaType::Type
>( values.at( 0 ).userType() ) );
7846 else if ( option.compare(
"any"_L1, Qt::CaseInsensitive ) == 0 )
7848 if ( hash.isEmpty() )
7851 return QVariant( hash.key( minValue ) );
7853 else if ( option.compare(
"median"_L1, Qt::CaseInsensitive ) == 0 )
7855 return fcnArrayMedian( QVariantList() << convertToSameType( hash.keys( minValue ),
static_cast<QMetaType::Type
>( values.at( 0 ).userType() ) ), context, parent, node );
7857 else if ( option.compare(
"real_minority"_L1, Qt::CaseInsensitive ) == 0 )
7859 if ( hash.isEmpty() )
7863 const int maxValue = *std::max_element( occurrences.constBegin(), occurrences.constEnd() );
7864 if ( maxValue * 2 > list.size() )
7865 hash.remove( hash.key( maxValue ) );
7867 return convertToSameType( hash.keys(),
static_cast<QMetaType::Type
>( values.at( 0 ).userType() ) );
7878 QVariantList list = QgsExpressionUtils::getListValue( values.at( 0 ), parent );
7879 list.append( values.at( 1 ) );
7880 return convertToSameType( list,
static_cast<QMetaType::Type
>( values.at( 0 ).userType() ) );
7885 QVariantList list = QgsExpressionUtils::getListValue( values.at( 0 ), parent );
7886 list.prepend( values.at( 1 ) );
7887 return convertToSameType( list,
static_cast<QMetaType::Type
>( values.at( 0 ).userType() ) );
7892 QVariantList list = QgsExpressionUtils::getListValue( values.at( 0 ), parent );
7893 list.insert( QgsExpressionUtils::getNativeIntValue( values.at( 1 ), parent ), values.at( 2 ) );
7894 return convertToSameType( list,
static_cast<QMetaType::Type
>( values.at( 0 ).userType() ) );
7899 QVariantList list = QgsExpressionUtils::getListValue( values.at( 0 ), parent );
7900 int position = QgsExpressionUtils::getNativeIntValue( values.at( 1 ), parent );
7902 position = position + list.length();
7903 if ( position >= 0 && position < list.length() )
7904 list.removeAt( position );
7905 return convertToSameType( list,
static_cast<QMetaType::Type
>( values.at( 0 ).userType() ) );
7913 QVariantList list = QgsExpressionUtils::getListValue( values.at( 0 ), parent );
7915 const QVariant toRemove = values.at( 1 );
7918 list.erase( std::remove_if( list.begin(), list.end(), [](
const QVariant &element ) { return QgsVariantUtils::isNull( element ); } ), list.end() );
7922 list.removeAll( toRemove );
7924 return convertToSameType( list,
static_cast<QMetaType::Type
>( values.at( 0 ).userType() ) );
7929 if ( values.count() == 2 && values.at( 1 ).userType() == QMetaType::Type::QVariantMap )
7931 QVariantMap map = QgsExpressionUtils::getMapValue( values.at( 1 ), parent );
7933 QVariantList list = QgsExpressionUtils::getListValue( values.at( 0 ), parent );
7934 for ( QVariantMap::const_iterator it = map.constBegin(); it != map.constEnd(); ++it )
7936 int index = list.indexOf( it.key() );
7937 while ( index >= 0 )
7939 list.replace( index, it.value() );
7940 index = list.indexOf( it.key() );
7944 return convertToSameType( list,
static_cast<QMetaType::Type
>( values.at( 0 ).userType() ) );
7946 else if ( values.count() == 3 )
7948 QVariantList before;
7950 bool isSingleReplacement =
false;
7952 if ( !QgsExpressionUtils::isList( values.at( 1 ) ) && values.at( 2 ).userType() != QMetaType::Type::QStringList )
7954 before = QVariantList() << values.at( 1 );
7958 before = QgsExpressionUtils::getListValue( values.at( 1 ), parent );
7961 if ( !QgsExpressionUtils::isList( values.at( 2 ) ) )
7963 after = QVariantList() << values.at( 2 );
7964 isSingleReplacement =
true;
7968 after = QgsExpressionUtils::getListValue( values.at( 2 ), parent );
7971 if ( !isSingleReplacement && before.length() != after.length() )
7973 parent->
setEvalErrorString( QObject::tr(
"Invalid pair of array, length not identical" ) );
7977 QVariantList list = QgsExpressionUtils::getListValue( values.at( 0 ), parent );
7978 for (
int i = 0; i < before.length(); i++ )
7980 int index = list.indexOf( before.at( i ) );
7981 while ( index >= 0 )
7983 list.replace( index, after.at( isSingleReplacement ? 0 : i ) );
7984 index = list.indexOf( before.at( i ) );
7988 return convertToSameType( list,
static_cast<QMetaType::Type
>( values.at( 0 ).userType() ) );
7992 parent->
setEvalErrorString( QObject::tr(
"Function array_replace requires 2 or 3 arguments" ) );
7999 QVariantList list = QgsExpressionUtils::getListValue( values.at( 0 ), parent );
8000 QVariantList list_new;
8002 for (
const QVariant &cur : QgsExpressionUtils::getListValue( values.at( 1 ), parent ) )
8004 while ( list.removeOne( cur ) )
8006 list_new.append( cur );
8010 list_new.append( list );
8012 return convertToSameType( list_new,
static_cast<QMetaType::Type
>( values.at( 0 ).userType() ) );
8018 for (
const QVariant &cur : values )
8020 list += QgsExpressionUtils::getListValue( cur, parent );
8022 return convertToSameType( list,
static_cast<QMetaType::Type
>( values.at( 0 ).userType() ) );
8027 QVariantList list = QgsExpressionUtils::getListValue( values.at( 0 ), parent );
8028 int start_pos = QgsExpressionUtils::getNativeIntValue( values.at( 1 ), parent );
8029 const int end_pos = QgsExpressionUtils::getNativeIntValue( values.at( 2 ), parent );
8030 int slice_length = 0;
8032 if ( start_pos < 0 )
8034 start_pos = list.length() + start_pos;
8038 slice_length = end_pos - start_pos + 1;
8042 slice_length = list.length() + end_pos - start_pos + 1;
8045 if ( slice_length < 0 )
8049 list = list.mid( start_pos, slice_length );
8055 QVariantList list = QgsExpressionUtils::getListValue( values.at( 0 ), parent );
8056 std::reverse( list.begin(), list.end() );
8062 const QVariantList array1 = QgsExpressionUtils::getListValue( values.at( 0 ), parent );
8063 const QVariantList array2 = QgsExpressionUtils::getListValue( values.at( 1 ), parent );
8064 for (
const QVariant &cur : array2 )
8066 if ( array1.contains( cur ) )
8067 return QVariant(
true );
8069 return QVariant(
false );
8074 QVariantList array = QgsExpressionUtils::getListValue( values.at( 0 ), parent );
8076 QVariantList distinct;
8078 for ( QVariantList::const_iterator it = array.constBegin(); it != array.constEnd(); ++it )
8080 if ( !distinct.contains( *it ) )
8082 distinct += ( *it );
8091 QVariantList array = QgsExpressionUtils::getListValue( values.at( 0 ), parent );
8092 QString delimiter = QgsExpressionUtils::getStringValue( values.at( 1 ), parent );
8093 QString empty = QgsExpressionUtils::getStringValue( values.at( 2 ), parent );
8097 for ( QVariantList::const_iterator it = array.constBegin(); it != array.constEnd(); ++it )
8099 str += ( !( *it ).toString().isEmpty() ) ? ( *it ).toString() : empty;
8100 if ( it != ( array.constEnd() - 1 ) )
8106 return QVariant( str );
8111 QString str = QgsExpressionUtils::getStringValue( values.at( 0 ), parent );
8112 QString delimiter = QgsExpressionUtils::getStringValue( values.at( 1 ), parent );
8113 QString empty = QgsExpressionUtils::getStringValue( values.at( 2 ), parent );
8115 QStringList list = str.split( delimiter );
8118 for ( QStringList::const_iterator it = list.constBegin(); it != list.constEnd(); ++it )
8120 array += ( !( *it ).isEmpty() ) ? *it : empty;
8128 QString str = QgsExpressionUtils::getStringValue( values.at( 0 ), parent );
8129 QJsonDocument document = QJsonDocument::fromJson( str.toUtf8() );
8130 if ( document.isNull() )
8133 return document.toVariant();
8139 QJsonDocument document = QJsonDocument::fromVariant( values.at( 0 ) );
8140 return QString( document.toJson( QJsonDocument::Compact ) );
8145 QString str = QgsExpressionUtils::getStringValue( values.at( 0 ), parent );
8146 if ( str.isEmpty() )
8147 return QVariantMap();
8148 str = str.trimmed();
8155 QVariantMap map = QgsExpressionUtils::getMapValue( values.at( 0 ), parent );
8162 for (
int i = 0; i + 1 < values.length(); i += 2 )
8164 result.insert( QgsExpressionUtils::getStringValue( values.at( i ), parent ), values.at( i + 1 ) );
8171 const QVariantMap map = QgsExpressionUtils::getMapValue( values.at( 0 ), parent );
8172 const QString prefix = QgsExpressionUtils::getStringValue( values.at( 1 ), parent );
8173 QVariantMap resultMap;
8175 for (
auto it = map.cbegin(); it != map.cend(); it++ )
8177 resultMap.insert( QString( it.key() ).prepend( prefix ), it.value() );
8185 return QgsExpressionUtils::getMapValue( values.at( 0 ), parent ).value( values.at( 1 ).toString() );
8190 return QgsExpressionUtils::getMapValue( values.at( 0 ), parent ).contains( values.at( 1 ).toString() );
8195 QVariantMap map = QgsExpressionUtils::getMapValue( values.at( 0 ), parent );
8196 map.remove( values.at( 1 ).toString() );
8202 QVariantMap map = QgsExpressionUtils::getMapValue( values.at( 0 ), parent );
8203 map.insert( values.at( 1 ).toString(), values.at( 2 ) );
8210 for (
const QVariant &cur : values )
8212 const QVariantMap curMap = QgsExpressionUtils::getMapValue( cur, parent );
8213 for ( QVariantMap::const_iterator it = curMap.constBegin(); it != curMap.constEnd(); ++it )
8214 result.insert( it.key(), it.value() );
8221 return QStringList( QgsExpressionUtils::getMapValue( values.at( 0 ), parent ).keys() );
8226 return QgsExpressionUtils::getMapValue( values.at( 0 ), parent ).values();
8231 const QString envVarName = values.at( 0 ).toString();
8232 if ( !QProcessEnvironment::systemEnvironment().contains( envVarName ) )
8235 return QProcessEnvironment::systemEnvironment().value( envVarName );
8240 const QString file = QgsExpressionUtils::getFilePathValue( values.at( 0 ), context, parent );
8243 parent->
setEvalErrorString( QObject::tr(
"Function `%1` requires a value which represents a possible file path" ).arg(
"base_file_name"_L1 ) );
8246 return QFileInfo( file ).completeBaseName();
8251 const QString file = QgsExpressionUtils::getFilePathValue( values.at( 0 ), context, parent );
8254 parent->
setEvalErrorString( QObject::tr(
"Function `%1` requires a value which represents a possible file path" ).arg(
"file_suffix"_L1 ) );
8257 return QFileInfo( file ).completeSuffix();
8262 const QString file = QgsExpressionUtils::getFilePathValue( values.at( 0 ), context, parent );
8265 parent->
setEvalErrorString( QObject::tr(
"Function `%1` requires a value which represents a possible file path" ).arg(
"file_exists"_L1 ) );
8268 return QFileInfo::exists( file );
8273 const QString file = QgsExpressionUtils::getFilePathValue( values.at( 0 ), context, parent );
8276 parent->
setEvalErrorString( QObject::tr(
"Function `%1` requires a value which represents a possible file path" ).arg(
"file_name"_L1 ) );
8279 return QFileInfo( file ).fileName();
8284 const QString file = QgsExpressionUtils::getFilePathValue( values.at( 0 ), context, parent );
8287 parent->
setEvalErrorString( QObject::tr(
"Function `%1` requires a value which represents a possible file path" ).arg(
"is_file"_L1 ) );
8290 return QFileInfo( file ).isFile();
8295 const QString file = QgsExpressionUtils::getFilePathValue( values.at( 0 ), context, parent );
8298 parent->
setEvalErrorString( QObject::tr(
"Function `%1` requires a value which represents a possible file path" ).arg(
"is_directory"_L1 ) );
8301 return QFileInfo( file ).isDir();
8306 const QString file = QgsExpressionUtils::getFilePathValue( values.at( 0 ), context, parent );
8309 parent->
setEvalErrorString( QObject::tr(
"Function `%1` requires a value which represents a possible file path" ).arg(
"file_path"_L1 ) );
8312 return QDir::toNativeSeparators( QFileInfo( file ).path() );
8317 const QString file = QgsExpressionUtils::getFilePathValue( values.at( 0 ), context, parent );
8320 parent->
setEvalErrorString( QObject::tr(
"Function `%1` requires a value which represents a possible file path" ).arg(
"file_size"_L1 ) );
8323 return QFileInfo( file ).size();
8326static QVariant fcnHash(
const QString &str,
const QCryptographicHash::Algorithm
algorithm )
8328 return QString( QCryptographicHash::hash( str.toUtf8(),
algorithm ).toHex() );
8334 QString str = QgsExpressionUtils::getStringValue( values.at( 0 ), parent );
8335 QString method = QgsExpressionUtils::getStringValue( values.at( 1 ), parent ).toLower();
8337 if ( method ==
"md4"_L1 )
8339 hash = fcnHash( str, QCryptographicHash::Md4 );
8341 else if ( method ==
"md5"_L1 )
8343 hash = fcnHash( str, QCryptographicHash::Md5 );
8345 else if ( method ==
"sha1"_L1 )
8347 hash = fcnHash( str, QCryptographicHash::Sha1 );
8349 else if ( method ==
"sha224"_L1 )
8351 hash = fcnHash( str, QCryptographicHash::Sha224 );
8353 else if ( method ==
"sha256"_L1 )
8355 hash = fcnHash( str, QCryptographicHash::Sha256 );
8357 else if ( method ==
"sha384"_L1 )
8359 hash = fcnHash( str, QCryptographicHash::Sha384 );
8361 else if ( method ==
"sha512"_L1 )
8363 hash = fcnHash( str, QCryptographicHash::Sha512 );
8365 else if ( method ==
"sha3_224"_L1 )
8367 hash = fcnHash( str, QCryptographicHash::Sha3_224 );
8369 else if ( method ==
"sha3_256"_L1 )
8371 hash = fcnHash( str, QCryptographicHash::Sha3_256 );
8373 else if ( method ==
"sha3_384"_L1 )
8375 hash = fcnHash( str, QCryptographicHash::Sha3_384 );
8377 else if ( method ==
"sha3_512"_L1 )
8379 hash = fcnHash( str, QCryptographicHash::Sha3_512 );
8381 else if ( method ==
"keccak_224"_L1 )
8383 hash = fcnHash( str, QCryptographicHash::Keccak_224 );
8385 else if ( method ==
"keccak_256"_L1 )
8387 hash = fcnHash( str, QCryptographicHash::Keccak_256 );
8389 else if ( method ==
"keccak_384"_L1 )
8391 hash = fcnHash( str, QCryptographicHash::Keccak_384 );
8393 else if ( method ==
"keccak_512"_L1 )
8395 hash = fcnHash( str, QCryptographicHash::Keccak_512 );
8399 parent->
setEvalErrorString( QObject::tr(
"Hash method %1 is not available on this system." ).arg( str ) );
8406 return fcnHash( QgsExpressionUtils::getStringValue( values.at( 0 ), parent ), QCryptographicHash::Md5 );
8411 return fcnHash( QgsExpressionUtils::getStringValue( values.at( 0 ), parent ), QCryptographicHash::Sha256 );
8416 const QByteArray input = values.at( 0 ).toByteArray();
8417 return QVariant( QString( input.toBase64() ) );
8422 const QVariantMap map = QgsExpressionUtils::getMapValue( values.at( 0 ), parent );
8424 for (
auto it = map.cbegin(); it != map.cend(); it++ )
8426 query.addQueryItem( it.key(), it.value().toString() );
8428 return query.toString( QUrl::ComponentFormattingOption::FullyEncoded );
8433 const QString value = QgsExpressionUtils::getStringValue( values.at( 0 ), parent );
8434 const QByteArray base64 = value.toLocal8Bit();
8435 const QByteArray decoded = QByteArray::fromBase64( base64 );
8436 return QVariant( decoded );
8442static QVariant executeGeomOverlay(
8443 const QVariantList &values,
8447 bool invert =
false,
8448 double bboxGrow = 0,
8449 bool isNearestFunc =
false,
8450 bool isIntersectsFunc =
false
8455 parent->
setEvalErrorString( u
"This function was called without an expression context."_s );
8459 const QVariant sourceLayerRef = context->
variable( u
"layer"_s );
8462 QgsVectorLayer *sourceLayer = QgsExpressionUtils::getVectorLayer( sourceLayerRef, context, parent );
8471 QgsExpressionNode *node = QgsExpressionUtils::getNode( values.at( 0 ), parent );
8474 const bool layerCanBeCached = node->
isStatic( parent, context );
8475 QVariant targetLayerValue = node->
eval( parent, context );
8479 node = QgsExpressionUtils::getNode( values.at( 1 ), parent );
8481 QString subExpString = node->dump();
8483 bool testOnly = ( subExpString ==
"NULL" );
8486 QgsVectorLayer *targetLayer = QgsExpressionUtils::getVectorLayer( targetLayerValue, context, parent );
8490 parent->
setEvalErrorString( QObject::tr(
"Layer '%1' could not be loaded." ).arg( targetLayerValue.toString() ) );
8495 node = QgsExpressionUtils::getNode( values.at( 2 ), parent );
8497 QString filterString = node->dump();
8498 if ( filterString !=
"NULL" )
8500 request.setFilterExpression( filterString );
8504 node = QgsExpressionUtils::getNode( values.at( 3 ), parent );
8506 QVariant limitValue = node->eval( parent, context );
8508 qlonglong limit = QgsExpressionUtils::getIntValue( limitValue, parent );
8510 double max_distance = 0;
8511 bool cacheEnabled =
false;
8513 double minOverlap { -1 };
8514 double minInscribedCircleRadius { -1 };
8515 bool returnDetails =
false;
8516 bool sortByMeasure =
false;
8517 bool sortAscending =
false;
8518 bool requireMeasures =
false;
8519 bool overlapOrRadiusFilter =
false;
8523 if ( isNearestFunc )
8526 node = QgsExpressionUtils::getNode( values.at( 4 ), parent );
8528 QVariant distanceValue = node->eval( parent, context );
8530 max_distance = QgsExpressionUtils::getDoubleValue( distanceValue, parent );
8533 node = QgsExpressionUtils::getNode( values.at( 5 ), parent );
8535 QVariant cacheValue = node->eval( parent, context );
8537 cacheEnabled = cacheValue.toBool();
8542 node = QgsExpressionUtils::getNode( values.at( 4 ), parent );
8544 QVariant cacheValue = node->eval( parent, context );
8546 cacheEnabled = cacheValue.toBool();
8549 node = QgsExpressionUtils::getNode( values.at( 5 ), parent );
8551 const QVariant minOverlapValue = node->eval( parent, context );
8553 minOverlap = QgsExpressionUtils::getDoubleValue( minOverlapValue, parent );
8556 node = QgsExpressionUtils::getNode( values.at( 6 ), parent );
8558 const QVariant minInscribedCircleRadiusValue = node->eval( parent, context );
8560 minInscribedCircleRadius = QgsExpressionUtils::getDoubleValue( minInscribedCircleRadiusValue, parent );
8563 node = QgsExpressionUtils::getNode( values.at( 7 ), parent );
8565 returnDetails = !testOnly && node->eval( parent, context ).toBool();
8568 node = QgsExpressionUtils::getNode( values.at( 8 ), parent );
8570 const QString sorting { node->eval( parent, context ).toString().toLower() };
8571 sortByMeasure = !testOnly && ( sorting.startsWith(
"asc" ) || sorting.startsWith(
"des" ) );
8572 sortAscending = sorting.startsWith(
"asc" );
8573 requireMeasures = sortByMeasure || returnDetails;
8574 overlapOrRadiusFilter = minInscribedCircleRadius != -1 || minOverlap != -1;
8577 node = QgsExpressionUtils::getNode( values.at( 9 ), parent );
8579 const QString backendStr = node->eval( parent, context ).toString().toUpper();
8585 SET_EVAL_ERROR( u
"Geometry backend '%1' does not exist!"_s.arg( backendStr ) );
8591 if ( sourceLayer && targetLayer->crs() != sourceLayer->crs() )
8594 request.setDestinationCrs( sourceLayer->crs(), TransformContext );
8597 bool sameLayers = ( sourceLayer && sourceLayer->id() == targetLayer->id() );
8600 if ( bboxGrow != 0 )
8602 intDomain.
grow( bboxGrow );
8605 const QString cacheBase { u
"%1:%2:%3"_s.arg( targetLayer->id(), subExpString, filterString ) };
8611 QList<QgsFeature> features;
8612 if ( isNearestFunc || ( layerCanBeCached && cacheEnabled ) )
8616 const QString cacheLayer { u
"ovrlaylyr:%1"_s.arg( cacheBase ) };
8617 const QString cacheIndex { u
"ovrlayidx:%1"_s.arg( cacheBase ) };
8621 cachedTarget = targetLayer->
materialize( request );
8622 if ( layerCanBeCached )
8623 context->
setCachedValue( cacheLayer, QVariant::fromValue( cachedTarget ) );
8633 if ( layerCanBeCached )
8634 context->
setCachedValue( cacheIndex, QVariant::fromValue( spatialIndex ) );
8641 QList<QgsFeatureId> fidsList;
8642 if ( isNearestFunc )
8644 fidsList = spatialIndex.
nearestNeighbor( geometry, sameLayers ? limit + 1 : limit, max_distance );
8648 fidsList = spatialIndex.
intersects( intDomain );
8651 QListIterator<QgsFeatureId> i( fidsList );
8652 while ( i.hasNext() )
8655 if ( sameLayers && feat.
id() == fId2 )
8657 features.append( cachedTarget->
getFeature( fId2 ) );
8664 request.setFilterRect( intDomain );
8669 if ( sameLayers && feat.
id() == feat2.
id() )
8671 features.append( feat2 );
8679 const QString expCacheKey { u
"exp:%1"_s.arg( cacheBase ) };
8680 const QString ctxCacheKey { u
"ctx:%1"_s.arg( cacheBase ) };
8686 subExpression.
prepare( &subContext );
8699 auto testLinestring = [minOverlap, requireMeasures](
const QgsGeometry intersection,
double &overlapValue ) ->
bool {
8700 bool testResult {
false };
8702 QVector<double> overlapValues;
8703 const QgsGeometry merged { intersection.mergeLines() };
8708 if ( minOverlap != -1 || requireMeasures )
8710 overlapValue = geom->
length();
8711 overlapValues.append( overlapValue );
8712 if ( minOverlap != -1 )
8714 if ( overlapValue >= minOverlap )
8726 if ( !overlapValues.isEmpty() )
8728 overlapValue = *std::max_element( overlapValues.cbegin(), overlapValues.cend() );
8735 auto testPolygon = [minOverlap, requireMeasures, minInscribedCircleRadius](
const QgsGeometry intersection,
double &radiusValue,
double &overlapValue ) ->
bool {
8737 bool testResult {
false };
8739 QVector<double> overlapValues;
8740 QVector<double> radiusValues;
8741 for (
auto it = intersection.const_parts_begin(); ( !testResult || requireMeasures ) && it != intersection.const_parts_end(); ++it )
8745 if ( minOverlap != -1 || requireMeasures )
8747 overlapValue = geom->
area();
8748 overlapValues.append( geom->
area() );
8749 if ( minOverlap != -1 )
8751 if ( overlapValue >= minOverlap )
8763 if ( minInscribedCircleRadius != -1 || requireMeasures )
8766 const double width = bbox.
width();
8767 const double height = bbox.
height();
8768 const double size = width > height ? width : height;
8769 const double tolerance = size / 100.0;
8771 testResult = radiusValue >= minInscribedCircleRadius;
8772 radiusValues.append( radiusValues );
8777 if ( !radiusValues.isEmpty() )
8779 radiusValue = *std::max_element( radiusValues.cbegin(), radiusValues.cend() );
8782 if ( !overlapValues.isEmpty() )
8784 overlapValue = *std::max_element( overlapValues.cbegin(), overlapValues.cend() );
8793 QVariantList results;
8795 QListIterator<QgsFeature> i( features );
8798 while ( i.hasNext() && ( sortByMeasure || limit == -1 || foundCount < limit ) )
8803 if ( relationFunction( geometry, feat2.
geometry(), values, backend ) )
8805 double overlapValue = -1;
8806 double radiusValue = -1;
8808 if ( isIntersectsFunc && ( requireMeasures || overlapOrRadiusFilter ) )
8820 for (
const auto &geom : std::as_const( geometries ) )
8822 switch ( geom.type() )
8826 poly.append( geom.asPolygon() );
8831 line.append( geom.asPolyline() );
8836 point.append( geom.asPoint() );
8847 switch ( geometry.
type() )
8875 switch ( intersection.
type() )
8880 bool testResult { testPolygon( intersection, radiusValue, overlapValue ) };
8882 if ( !testResult && overlapOrRadiusFilter )
8894 if ( minInscribedCircleRadius != -1 )
8900 const bool testResult { testLinestring( intersection, overlapValue ) };
8902 if ( !testResult && overlapOrRadiusFilter )
8914 if ( minInscribedCircleRadius != -1 )
8919 bool testResult {
false };
8920 if ( minOverlap != -1 || requireMeasures )
8940 testResult = testLinestring( feat2.
geometry(), overlapValue );
8945 testResult = testPolygon( feat2.
geometry(), radiusValue, overlapValue );
8951 if ( !testResult && overlapOrRadiusFilter )
8978 const QVariant expResult = subExpression.
evaluate( &subContext );
8980 if ( requireMeasures )
8982 QVariantMap resultRecord;
8983 resultRecord.insert( u
"id"_s, feat2.
id() );
8984 resultRecord.insert( u
"result"_s, expResult );
8986 resultRecord.insert( u
"overlap"_s, overlapValue );
8988 if ( radiusValue != -1 )
8990 resultRecord.insert( u
"radius"_s, radiusValue );
8992 results.append( resultRecord );
8996 results.append( expResult );
9002 results.append( feat2.
id() );
9022 if ( requireMeasures )
9024 if ( sortByMeasure )
9026 std::sort( results.begin(), results.end(), [sortAscending](
const QVariant &recordA,
const QVariant &recordB ) ->
bool {
9027 return sortAscending ? recordB.toMap().value( u
"overlap"_s ).toDouble() > recordA.toMap().value( u
"overlap"_s ).toDouble()
9028 : recordA.toMap().value( u
"overlap"_s ).toDouble() > recordB.toMap().value( u
"overlap"_s ).toDouble();
9032 if ( limit > 0 && results.size() > limit )
9034 results.erase( results.begin() + limit );
9037 if ( !returnDetails )
9039 QVariantList expResults;
9040 for (
auto it = results.constBegin(); it != results.constEnd(); ++it )
9042 expResults.append( it->toMap().value( u
"result"_s ) );
9052 QVariantList disjoint_results;
9061 if ( !results.contains( feat2.
id() ) )
9064 disjoint_results.append( subExpression.
evaluate( &subContext ) );
9067 return disjoint_results;
9075 return executeGeomOverlay( values, context, parent, geomFunction,
false, 0,
false,
true );
9081 return executeGeomOverlay( values, context, parent, geomFunction );
9087 return executeGeomOverlay( values, context, parent, geomFunction );
9095 return executeGeomOverlay( values, context, parent, geomFunction,
false, 0.01 );
9103 return executeGeomOverlay( values, context, parent, geomFunction,
false, 0.01 );
9111 return executeGeomOverlay( values, context, parent, geomFunction,
false, 0.01 );
9117 QgsExpressionNode *node = QgsExpressionUtils::getNode( values.at( 10 ), parent );
9119 QVariant epsilonValue = node->
eval( parent, context );
9121 double epsilon = QgsExpressionUtils::getDoubleValue( epsilonValue, parent );
9124 return geometry.
isFuzzyEqual( other, epsilon, backend );
9126 return executeGeomOverlay( values, context, parent, geomFunction,
false, 0.01 );
9132 return executeGeomOverlay( values, context, parent, geomFunction,
false, 0.01 );
9138 return executeGeomOverlay( values, context, parent, geomFunction );
9144 return executeGeomOverlay( values, context, parent, geomFunction,
true, 0,
false,
true );
9152 return executeGeomOverlay( values, context, parent, geomFunction,
false, 0,
true );
9157 static std::once_flag initialized;
9158 std::call_once( initialized, []() {
9160 << QgsExpressionFunction::Parameter( u
"expression"_s )
9161 << QgsExpressionFunction::Parameter( u
"group_by"_s,
true )
9162 << QgsExpressionFunction::Parameter( u
"filter"_s,
true );
9165 aggParamsConcat << QgsExpressionFunction::Parameter( u
"concatenator"_s,
true ) << QgsExpressionFunction::Parameter( u
"order_by"_s,
true, QVariant(),
true );
9168 aggParamsArray << QgsExpressionFunction::Parameter( u
"order_by"_s,
true, QVariant(),
true );
9173 << std::make_shared< QgsStaticExpressionFunction >( u
"radians"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"degrees"_s ), fcnRadians, u
"Math"_s )
9174 << std::make_shared< QgsStaticExpressionFunction >( u
"degrees"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"radians"_s ), fcnDegrees, u
"Math"_s )
9175 << std::make_shared<
9176 QgsStaticExpressionFunction >( u
"azimuth"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"point1"_s ) << QgsExpressionFunction::Parameter( u
"point2"_s ), fcnAzimuth, u
"GeometryGroup"_s )
9177 << std::make_shared< QgsStaticExpressionFunction >(
9180 << QgsExpressionFunction::Parameter( u
"point1"_s )
9181 << QgsExpressionFunction::Parameter( u
"point2"_s )
9182 << QgsExpressionFunction::Parameter( u
"source_crs"_s,
true, QVariant() )
9183 << QgsExpressionFunction::Parameter( u
"ellipsoid"_s,
true, QVariant() ),
9187 << std::make_shared<
9188 QgsStaticExpressionFunction >( u
"inclination"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"point1"_s ) << QgsExpressionFunction::Parameter( u
"point2"_s ), fcnInclination, u
"GeometryGroup"_s )
9189 << std::make_shared< QgsStaticExpressionFunction >(
9192 << QgsExpressionFunction::Parameter( u
"point"_s )
9193 << QgsExpressionFunction::Parameter( u
"distance"_s )
9194 << QgsExpressionFunction::Parameter( u
"azimuth"_s )
9195 << QgsExpressionFunction::Parameter( u
"elevation"_s,
true, M_PI_2 ),
9206 << std::make_shared<
9207 QgsStaticExpressionFunction >( u
"atan2"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"dx"_s ) << QgsExpressionFunction::Parameter( u
"dy"_s ), fcnAtan2, u
"Math"_s )
9210 << std::make_shared< QgsStaticExpressionFunction >( u
"log10"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"value"_s ), fcnLog10, u
"Math"_s )
9211 << std::make_shared<
9212 QgsStaticExpressionFunction >( u
"log"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"base"_s ) << QgsExpressionFunction::Parameter( u
"value"_s ), fcnLog, u
"Math"_s )
9213 << std::make_shared<
9214 QgsStaticExpressionFunction >( u
"round"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"value"_s ) << QgsExpressionFunction::Parameter( u
"places"_s,
true, 0 ), fcnRound, u
"Math"_s );
9216 auto randFunc = std::make_shared<
9217 QgsStaticExpressionFunction >( u
"rand"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"min"_s ) << QgsExpressionFunction::Parameter( u
"max"_s ) << QgsExpressionFunction::Parameter( u
"seed"_s,
true ), fcnRnd, u
"Math"_s );
9218 randFunc->setIsStatic(
false );
9219 functions << randFunc;
9221 auto randfFunc = std::make_shared< QgsStaticExpressionFunction >(
9224 << QgsExpressionFunction::Parameter( u
"min"_s,
true, 0.0 )
9225 << QgsExpressionFunction::Parameter( u
"max"_s,
true, 1.0 )
9226 << QgsExpressionFunction::Parameter( u
"seed"_s,
true ),
9230 randfFunc->setIsStatic(
false );
9231 functions << randfFunc;
9234 << std::make_shared< QgsStaticExpressionFunction >( u
"max"_s, -1, fcnMax, u
"Math"_s, QString(),
false, QSet<QString>(),
false, QStringList(),
true )
9235 << std::make_shared< QgsStaticExpressionFunction >( u
"min"_s, -1, fcnMin, u
"Math"_s, QString(),
false, QSet<QString>(),
false, QStringList(),
true )
9236 << std::make_shared<
9237 QgsStaticExpressionFunction >( u
"clamp"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"min"_s ) << QgsExpressionFunction::Parameter( u
"value"_s ) << QgsExpressionFunction::Parameter( u
"max"_s ), fcnClamp, u
"Math"_s )
9238 << std::make_shared< QgsStaticExpressionFunction >(
9241 << QgsExpressionFunction::Parameter( u
"value"_s )
9242 << QgsExpressionFunction::Parameter( u
"domain_min"_s )
9243 << QgsExpressionFunction::Parameter( u
"domain_max"_s )
9244 << QgsExpressionFunction::Parameter( u
"range_min"_s )
9245 << QgsExpressionFunction::Parameter( u
"range_max"_s ),
9249 << std::make_shared< QgsStaticExpressionFunction >(
9250 u
"scale_polynomial"_s,
9252 << QgsExpressionFunction::Parameter( u
"value"_s )
9253 << QgsExpressionFunction::Parameter( u
"domain_min"_s )
9254 << QgsExpressionFunction::Parameter( u
"domain_max"_s )
9255 << QgsExpressionFunction::Parameter( u
"range_min"_s )
9256 << QgsExpressionFunction::Parameter( u
"range_max"_s )
9257 << QgsExpressionFunction::Parameter( u
"exponent"_s ),
9264 QStringList() << u
"scale_exp"_s
9266 << std::make_shared< QgsStaticExpressionFunction >(
9267 u
"scale_exponential"_s,
9269 << QgsExpressionFunction::Parameter( u
"value"_s )
9270 << QgsExpressionFunction::Parameter( u
"domain_min"_s )
9271 << QgsExpressionFunction::Parameter( u
"domain_max"_s )
9272 << QgsExpressionFunction::Parameter( u
"range_min"_s )
9273 << QgsExpressionFunction::Parameter( u
"range_max"_s )
9274 << QgsExpressionFunction::Parameter( u
"exponent"_s ),
9275 fcnExponentialScale,
9278 << std::make_shared< QgsStaticExpressionFunction >(
9279 u
"scale_cubic_bezier"_s,
9281 << QgsExpressionFunction::Parameter( u
"value"_s )
9282 << QgsExpressionFunction::Parameter( u
"domain_min"_s )
9283 << QgsExpressionFunction::Parameter( u
"domain_max"_s )
9284 << QgsExpressionFunction::Parameter( u
"range_min"_s )
9285 << QgsExpressionFunction::Parameter( u
"range_max"_s )
9286 << QgsExpressionFunction::Parameter( u
"x1"_s )
9287 << QgsExpressionFunction::Parameter( u
"y1"_s )
9288 << QgsExpressionFunction::Parameter( u
"x2"_s )
9289 << QgsExpressionFunction::Parameter( u
"y2"_s ),
9290 fcnCubicBezierScale,
9293 << std::make_shared< QgsStaticExpressionFunction >( u
"floor"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"value"_s ), fcnFloor, u
"Math"_s )
9295 << std::make_shared< QgsStaticExpressionFunction >( u
"pi"_s, 0, fcnPi, u
"Math"_s, QString(),
false, QSet<QString>(),
false, QStringList() << u
"$pi"_s )
9296 << std::make_shared<
9297 QgsStaticExpressionFunction >( u
"to_bool"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"value"_s ), fcnToBool, u
"Conversions"_s, QString(),
false, QSet<QString>(),
false, QStringList() << u
"tobool"_s, true )
9298 << std::make_shared<
9299 QgsStaticExpressionFunction >( u
"to_int"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"value"_s ), fcnToInt, u
"Conversions"_s, QString(),
false, QSet<QString>(),
false, QStringList() << u
"toint"_s )
9300 << std::make_shared<
9301 QgsStaticExpressionFunction >( u
"to_real"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"value"_s ), fcnToReal, u
"Conversions"_s, QString(),
false, QSet<QString>(),
false, QStringList() << u
"toreal"_s )
9302 << std::make_shared< QgsStaticExpressionFunction >(
9306 QStringList() << u
"Conversions"_s << u
"String"_s,
9311 QStringList() << u
"tostring"_s
9313 << std::make_shared< QgsStaticExpressionFunction >(
9316 << QgsExpressionFunction::Parameter( u
"value"_s )
9317 << QgsExpressionFunction::Parameter( u
"format"_s,
true, QVariant() )
9318 << QgsExpressionFunction::Parameter( u
"language"_s,
true, QVariant() ),
9320 QStringList() << u
"Conversions"_s << u
"Date and Time"_s,
9325 QStringList() << u
"todatetime"_s
9327 << std::make_shared< QgsStaticExpressionFunction >(
9330 << QgsExpressionFunction::Parameter( u
"value"_s )
9331 << QgsExpressionFunction::Parameter( u
"format"_s,
true, QVariant() )
9332 << QgsExpressionFunction::Parameter( u
"language"_s,
true, QVariant() ),
9334 QStringList() << u
"Conversions"_s << u
"Date and Time"_s,
9339 QStringList() << u
"todate"_s
9341 << std::make_shared< QgsStaticExpressionFunction >(
9344 << QgsExpressionFunction::Parameter( u
"value"_s )
9345 << QgsExpressionFunction::Parameter( u
"format"_s,
true, QVariant() )
9346 << QgsExpressionFunction::Parameter( u
"language"_s,
true, QVariant() ),
9348 QStringList() << u
"Conversions"_s << u
"Date and Time"_s,
9353 QStringList() << u
"totime"_s
9355 << std::make_shared< QgsStaticExpressionFunction >(
9359 QStringList() << u
"Conversions"_s << u
"Date and Time"_s,
9364 QStringList() << u
"tointerval"_s
9366 << std::make_shared< QgsStaticExpressionFunction >(
9369 << QgsExpressionFunction::Parameter( u
"value"_s )
9370 << QgsExpressionFunction::Parameter( u
"axis"_s )
9371 << QgsExpressionFunction::Parameter( u
"precision"_s )
9372 << QgsExpressionFunction::Parameter( u
"formatting"_s,
true ),
9379 QStringList() << u
"todm"_s
9381 << std::make_shared< QgsStaticExpressionFunction >(
9384 << QgsExpressionFunction::Parameter( u
"value"_s )
9385 << QgsExpressionFunction::Parameter( u
"axis"_s )
9386 << QgsExpressionFunction::Parameter( u
"precision"_s )
9387 << QgsExpressionFunction::Parameter( u
"formatting"_s,
true ),
9388 fcnToDegreeMinuteSecond,
9394 QStringList() << u
"todms"_s
9396 << std::make_shared<
9397 QgsStaticExpressionFunction >( u
"to_decimal"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"value"_s ), fcnToDecimal, u
"Conversions"_s, QString(),
false, QSet<QString>(),
false, QStringList() << u
"todecimal"_s )
9398 << std::make_shared< QgsStaticExpressionFunction >( u
"extract_degrees"_s,
QgsExpressionFunction::ParameterList { QgsExpressionFunction::Parameter { u
"value"_s } }, fcnExtractDegrees, u
"Conversions"_s )
9399 << std::make_shared< QgsStaticExpressionFunction >( u
"extract_minutes"_s,
QgsExpressionFunction::ParameterList { QgsExpressionFunction::Parameter { u
"value"_s } }, fcnExtractMinutes, u
"Conversions"_s )
9400 << std::make_shared< QgsStaticExpressionFunction >( u
"extract_seconds"_s,
QgsExpressionFunction::ParameterList { QgsExpressionFunction::Parameter { u
"value"_s } }, fcnExtractSeconds, u
"Conversions"_s )
9401 << std::make_shared< QgsStaticExpressionFunction >( u
"coalesce"_s, -1, fcnCoalesce, u
"Conditionals"_s, QString(),
false, QSet<QString>(),
false, QStringList(),
true )
9402 << std::make_shared<
9403 QgsStaticExpressionFunction >( u
"nullif"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"value1"_s ) << QgsExpressionFunction::Parameter( u
"value2"_s ), fcnNullIf, u
"Conditionals"_s )
9404 << std::make_shared< QgsStaticExpressionFunction >(
9407 << QgsExpressionFunction::Parameter( u
"condition"_s )
9408 << QgsExpressionFunction::Parameter( u
"result_when_true"_s )
9409 << QgsExpressionFunction::Parameter( u
"result_when_false"_s ),
9417 << std::make_shared< QgsStaticExpressionFunction >(
9428 << std::make_shared< QgsStaticExpressionFunction >(
9431 << QgsExpressionFunction::Parameter( u
"layer"_s )
9432 << QgsExpressionFunction::Parameter( u
"aggregate"_s )
9433 << QgsExpressionFunction::Parameter( u
"expression"_s,
false, QVariant(),
true )
9434 << QgsExpressionFunction::Parameter( u
"filter"_s,
true, QVariant(),
true )
9435 << QgsExpressionFunction::Parameter( u
"concatenator"_s,
true )
9436 << QgsExpressionFunction::Parameter( u
"order_by"_s,
true, QVariant(),
true ),
9446 if ( !node->
args() )
9449 QSet<QString> referencedVars;
9452 QgsExpressionNode *subExpressionNode = node->
args()->
at( 2 );
9458 QgsExpressionNode *filterNode = node->
args()->
at( 3 );
9461 return referencedVars.contains( u
"parent"_s ) || referencedVars.contains( QString() );
9469 if ( !node->
args() )
9470 return QSet<QString>();
9472 QSet<QString> referencedCols;
9473 QSet<QString> referencedVars;
9477 QgsExpressionNode *subExpressionNode = node->
args()->
at( 2 );
9483 QgsExpressionNode *filterNode = node->
args()->
at( 3 );
9488 if ( referencedVars.contains( u
"parent"_s ) || referencedVars.contains( QString() ) )
9491 return referencedCols;
9496 << std::make_shared< QgsStaticExpressionFunction >(
9497 u
"relation_aggregate"_s,
9499 << QgsExpressionFunction::Parameter( u
"relation"_s )
9500 << QgsExpressionFunction::Parameter( u
"aggregate"_s )
9501 << QgsExpressionFunction::Parameter( u
"expression"_s,
false, QVariant(),
true )
9502 << QgsExpressionFunction::Parameter( u
"concatenator"_s,
true )
9503 << QgsExpressionFunction::Parameter( u
"order_by"_s,
true, QVariant(),
true ),
9504 fcnAggregateRelation,
9512 << std::make_shared< QgsStaticExpressionFunction >( u
"count"_s, aggParams, fcnAggregateCount, u
"Aggregates"_s, QString(),
false, QSet<QString>(),
true )
9513 << std::make_shared< QgsStaticExpressionFunction >( u
"count_distinct"_s, aggParams, fcnAggregateCountDistinct, u
"Aggregates"_s, QString(),
false, QSet<QString>(),
true )
9514 << std::make_shared< QgsStaticExpressionFunction >( u
"count_missing"_s, aggParams, fcnAggregateCountMissing, u
"Aggregates"_s, QString(),
false, QSet<QString>(),
true )
9515 << std::make_shared< QgsStaticExpressionFunction >( u
"minimum"_s, aggParams, fcnAggregateMin, u
"Aggregates"_s, QString(),
false, QSet<QString>(),
true )
9516 << std::make_shared< QgsStaticExpressionFunction >( u
"maximum"_s, aggParams, fcnAggregateMax, u
"Aggregates"_s, QString(),
false, QSet<QString>(),
true )
9517 << std::make_shared< QgsStaticExpressionFunction >( u
"sum"_s, aggParams, fcnAggregateSum, u
"Aggregates"_s, QString(),
false, QSet<QString>(),
true )
9518 << std::make_shared< QgsStaticExpressionFunction >( u
"mean"_s, aggParams, fcnAggregateMean, u
"Aggregates"_s, QString(),
false, QSet<QString>(),
true )
9519 << std::make_shared< QgsStaticExpressionFunction >( u
"median"_s, aggParams, fcnAggregateMedian, u
"Aggregates"_s, QString(),
false, QSet<QString>(),
true )
9520 << std::make_shared< QgsStaticExpressionFunction >( u
"stdev"_s, aggParams, fcnAggregateStdev, u
"Aggregates"_s, QString(),
false, QSet<QString>(),
true )
9521 << std::make_shared< QgsStaticExpressionFunction >( u
"range"_s, aggParams, fcnAggregateRange, u
"Aggregates"_s, QString(),
false, QSet<QString>(),
true )
9522 << std::make_shared< QgsStaticExpressionFunction >( u
"minority"_s, aggParams, fcnAggregateMinority, u
"Aggregates"_s, QString(),
false, QSet<QString>(),
true )
9523 << std::make_shared< QgsStaticExpressionFunction >( u
"majority"_s, aggParams, fcnAggregateMajority, u
"Aggregates"_s, QString(),
false, QSet<QString>(),
true )
9524 << std::make_shared< QgsStaticExpressionFunction >( u
"q1"_s, aggParams, fcnAggregateQ1, u
"Aggregates"_s, QString(),
false, QSet<QString>(),
true )
9525 << std::make_shared< QgsStaticExpressionFunction >( u
"q3"_s, aggParams, fcnAggregateQ3, u
"Aggregates"_s, QString(),
false, QSet<QString>(),
true )
9526 << std::make_shared< QgsStaticExpressionFunction >( u
"iqr"_s, aggParams, fcnAggregateIQR, u
"Aggregates"_s, QString(),
false, QSet<QString>(),
true )
9527 << std::make_shared< QgsStaticExpressionFunction >( u
"min_length"_s, aggParams, fcnAggregateMinLength, u
"Aggregates"_s, QString(),
false, QSet<QString>(),
true )
9528 << std::make_shared< QgsStaticExpressionFunction >( u
"max_length"_s, aggParams, fcnAggregateMaxLength, u
"Aggregates"_s, QString(),
false, QSet<QString>(),
true )
9529 << std::make_shared< QgsStaticExpressionFunction >( u
"collect"_s, aggParams, fcnAggregateCollectGeometry, u
"Aggregates"_s, QString(),
false, QSet<QString>(),
true )
9530 << std::make_shared< QgsStaticExpressionFunction >( u
"concatenate"_s, aggParamsConcat, fcnAggregateStringConcat, u
"Aggregates"_s, QString(),
false, QSet<QString>(),
true )
9531 << std::make_shared< QgsStaticExpressionFunction >( u
"concatenate_unique"_s, aggParamsConcat, fcnAggregateStringConcatUnique, u
"Aggregates"_s, QString(),
false, QSet<QString>(),
true )
9532 << std::make_shared< QgsStaticExpressionFunction >( u
"array_agg"_s, aggParamsArray, fcnAggregateArray, u
"Aggregates"_s, QString(),
false, QSet<QString>(),
true )
9534 << std::make_shared<
9535 QgsStaticExpressionFunction >( u
"regexp_match"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"string"_s ) << QgsExpressionFunction::Parameter( u
"regex"_s ), fcnRegexpMatch, QStringList() << u
"Conditionals"_s << u
"String"_s )
9536 << std::make_shared< QgsStaticExpressionFunction >(
9537 u
"regexp_matches"_s,
9539 << QgsExpressionFunction::Parameter( u
"string"_s )
9540 << QgsExpressionFunction::Parameter( u
"regex"_s )
9541 << QgsExpressionFunction::Parameter( u
"emptyvalue"_s,
true,
"" ),
9546 << std::make_shared< QgsStaticExpressionFunction >( u
"now"_s, 0, fcnNow, u
"Date and Time"_s, QString(),
false, QSet<QString>(),
false, QStringList() << u
"$now"_s )
9547 << std::make_shared<
9548 QgsStaticExpressionFunction >( u
"age"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"datetime1"_s ) << QgsExpressionFunction::Parameter( u
"datetime2"_s ), fcnAge, u
"Date and Time"_s )
9549 << std::make_shared< QgsStaticExpressionFunction >( u
"year"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"date"_s ), fcnYear, u
"Date and Time"_s )
9550 << std::make_shared< QgsStaticExpressionFunction >( u
"month"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"date"_s ), fcnMonth, u
"Date and Time"_s )
9551 << std::make_shared< QgsStaticExpressionFunction >( u
"week"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"date"_s ), fcnWeek, u
"Date and Time"_s )
9552 << std::make_shared< QgsStaticExpressionFunction >( u
"day"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"date"_s ), fcnDay, u
"Date and Time"_s )
9553 << std::make_shared< QgsStaticExpressionFunction >( u
"hour"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"datetime"_s ), fcnHour, u
"Date and Time"_s )
9554 << std::make_shared< QgsStaticExpressionFunction >( u
"minute"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"datetime"_s ), fcnMinute, u
"Date and Time"_s )
9555 << std::make_shared< QgsStaticExpressionFunction >( u
"second"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"datetime"_s ), fcnSeconds, u
"Date and Time"_s )
9556 << std::make_shared< QgsStaticExpressionFunction >( u
"epoch"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"date"_s ), fcnEpoch, u
"Date and Time"_s )
9557 << std::make_shared< QgsStaticExpressionFunction >( u
"datetime_from_epoch"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"long"_s ), fcnDateTimeFromEpoch, u
"Date and Time"_s )
9558 << std::make_shared< QgsStaticExpressionFunction >( u
"day_of_week"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"date"_s ), fcnDayOfWeek, u
"Date and Time"_s )
9559 << std::make_shared< QgsStaticExpressionFunction >(
9561 QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"year"_s ) << QgsExpressionFunction::Parameter( u
"month"_s ) << QgsExpressionFunction::Parameter( u
"day"_s ),
9565 << std::make_shared< QgsStaticExpressionFunction >(
9567 QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"hour"_s ) << QgsExpressionFunction::Parameter( u
"minute"_s ) << QgsExpressionFunction::Parameter( u
"second"_s ),
9571 << std::make_shared< QgsStaticExpressionFunction >(
9574 << QgsExpressionFunction::Parameter( u
"year"_s )
9575 << QgsExpressionFunction::Parameter( u
"month"_s )
9576 << QgsExpressionFunction::Parameter( u
"day"_s )
9577 << QgsExpressionFunction::Parameter( u
"hour"_s )
9578 << QgsExpressionFunction::Parameter( u
"minute"_s )
9579 << QgsExpressionFunction::Parameter( u
"second"_s ),
9583 << std::make_shared< QgsStaticExpressionFunction >(
9586 << QgsExpressionFunction::Parameter( u
"years"_s,
true, 0 )
9587 << QgsExpressionFunction::Parameter( u
"months"_s,
true, 0 )
9588 << QgsExpressionFunction::Parameter( u
"weeks"_s,
true, 0 )
9589 << QgsExpressionFunction::Parameter( u
"days"_s,
true, 0 )
9590 << QgsExpressionFunction::Parameter( u
"hours"_s,
true, 0 )
9591 << QgsExpressionFunction::Parameter( u
"minutes"_s,
true, 0 )
9592 << QgsExpressionFunction::Parameter( u
"seconds"_s,
true, 0 ),
9596 << std::make_shared< QgsStaticExpressionFunction >( u
"timezone_from_id"_s,
QgsExpressionFunction::ParameterList { QgsExpressionFunction::Parameter( u
"id"_s ) }, fcnTimeZoneFromId, u
"Date and Time"_s )
9597 << std::make_shared< QgsStaticExpressionFunction >( u
"timezone_id"_s,
QgsExpressionFunction::ParameterList { QgsExpressionFunction::Parameter( u
"timezone"_s ) }, fcnTimeZoneToId, u
"Date and Time"_s )
9598 << std::make_shared< QgsStaticExpressionFunction >( u
"get_timezone"_s,
QgsExpressionFunction::ParameterList { QgsExpressionFunction::Parameter( u
"datetime"_s ) }, fcnGetTimeZone, u
"Date and Time"_s )
9599 << std::make_shared<
9600 QgsStaticExpressionFunction >( u
"set_timezone"_s,
QgsExpressionFunction::ParameterList { QgsExpressionFunction::Parameter( u
"datetime"_s ), QgsExpressionFunction::Parameter( u
"timezone"_s ) }, fcnSetTimeZone, u
"Date and Time"_s )
9601 << std::make_shared<
9602 QgsStaticExpressionFunction >( u
"convert_timezone"_s,
QgsExpressionFunction::ParameterList { QgsExpressionFunction::Parameter( u
"datetime"_s ), QgsExpressionFunction::Parameter( u
"timezone"_s ) }, fcnConvertTimeZone, u
"Date and Time"_s )
9603 << std::make_shared< QgsStaticExpressionFunction >( u
"lower"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"string"_s ), fcnLower, u
"String"_s )
9604 << std::make_shared< QgsStaticExpressionFunction >(
9607 << QgsExpressionFunction::Parameter( u
"string"_s )
9608 << QgsExpressionFunction::Parameter( u
"substring"_s )
9609 << QgsExpressionFunction::Parameter( u
"overlapping"_s,
true,
false ),
9613 << std::make_shared< QgsStaticExpressionFunction >( u
"upper"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"string"_s ), fcnUpper, u
"String"_s )
9614 << std::make_shared< QgsStaticExpressionFunction >( u
"title"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"string"_s ), fcnTitle, u
"String"_s )
9615 << std::make_shared< QgsStaticExpressionFunction >( u
"trim"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"string"_s ), fcnTrim, u
"String"_s )
9616 << std::make_shared< QgsStaticExpressionFunction >( u
"unaccent"_s,
QgsExpressionFunction::ParameterList { QgsExpressionFunction::Parameter( u
"string"_s ) }, fcnUnaccent, u
"String"_s )
9617 << std::make_shared<
9618 QgsStaticExpressionFunction >( u
"ltrim"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"string"_s ) << QgsExpressionFunction::Parameter( u
"characters"_s,
true, u
" "_s ), fcnLTrim, u
"String"_s )
9619 << std::make_shared<
9620 QgsStaticExpressionFunction >( u
"rtrim"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"string"_s ) << QgsExpressionFunction::Parameter( u
"characters"_s,
true, u
" "_s ), fcnRTrim, u
"String"_s )
9621 << std::make_shared<
9622 QgsStaticExpressionFunction >( u
"levenshtein"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"string1"_s ) << QgsExpressionFunction::Parameter( u
"string2"_s ), fcnLevenshtein, u
"Fuzzy Matching"_s )
9623 << std::make_shared<
9624 QgsStaticExpressionFunction >( u
"longest_common_substring"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"string1"_s ) << QgsExpressionFunction::Parameter( u
"string2"_s ), fcnLCS, u
"Fuzzy Matching"_s )
9625 << std::make_shared<
9626 QgsStaticExpressionFunction >( u
"hamming_distance"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"string1"_s ) << QgsExpressionFunction::Parameter( u
"string2"_s ), fcnHamming, u
"Fuzzy Matching"_s )
9627 << std::make_shared< QgsStaticExpressionFunction >( u
"soundex"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"string"_s ), fcnSoundex, u
"Fuzzy Matching"_s )
9629 << std::make_shared< QgsStaticExpressionFunction >( u
"ascii"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"string"_s ), fcnAscii, u
"String"_s )
9630 << std::make_shared< QgsStaticExpressionFunction >(
9633 << QgsExpressionFunction::Parameter( u
"text"_s )
9634 << QgsExpressionFunction::Parameter( u
"length"_s )
9635 << QgsExpressionFunction::Parameter( u
"delimiter"_s,
true,
"" ),
9639 << std::make_shared<
9640 QgsStaticExpressionFunction >( u
"length"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"text"_s,
true,
"" ), fcnLength, QStringList() << u
"String"_s << u
"GeometryGroup"_s )
9641 << std::make_shared< QgsStaticExpressionFunction >( u
"length3D"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ), fcnLength3D, u
"GeometryGroup"_s )
9642 << std::make_shared<
9643 QgsStaticExpressionFunction >( u
"repeat"_s,
QgsExpressionFunction::ParameterList { QgsExpressionFunction::Parameter( u
"text"_s ), QgsExpressionFunction::Parameter( u
"number"_s ) }, fcnRepeat, u
"String"_s )
9644 << std::make_shared< QgsStaticExpressionFunction >( u
"replace"_s, -1, fcnReplace, u
"String"_s )
9645 << std::make_shared< QgsStaticExpressionFunction >(
9646 u
"regexp_replace"_s,
9647 QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"input_string"_s ) << QgsExpressionFunction::Parameter( u
"regex"_s ) << QgsExpressionFunction::Parameter( u
"replacement"_s ),
9651 << std::make_shared<
9652 QgsStaticExpressionFunction >( u
"regexp_substr"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"input_string"_s ) << QgsExpressionFunction::Parameter( u
"regex"_s ), fcnRegexpSubstr, u
"String"_s )
9653 << std::make_shared< QgsStaticExpressionFunction >(
9655 QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"string"_s ) << QgsExpressionFunction::Parameter( u
"start"_s ) << QgsExpressionFunction::Parameter( u
"length"_s,
true ),
9665 << std::make_shared< QgsStaticExpressionFunction >( u
"concat"_s, -1, fcnConcat, u
"String"_s, QString(),
false, QSet<QString>(),
false, QStringList(),
true )
9666 << std::make_shared< QgsStaticExpressionFunction >( u
"concat_ws"_s, -1, fcnConcatWs, u
"String"_s, QString(),
false, QSet<QString>(),
false, QStringList(),
true )
9667 << std::make_shared<
9668 QgsStaticExpressionFunction >( u
"strpos"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"haystack"_s ) << QgsExpressionFunction::Parameter( u
"needle"_s ), fcnStrpos, u
"String"_s )
9669 << std::make_shared<
9670 QgsStaticExpressionFunction >( u
"left"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"string"_s ) << QgsExpressionFunction::Parameter( u
"length"_s ), fcnLeft, u
"String"_s )
9671 << std::make_shared<
9672 QgsStaticExpressionFunction >( u
"right"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"string"_s ) << QgsExpressionFunction::Parameter( u
"length"_s ), fcnRight, u
"String"_s )
9673 << std::make_shared< QgsStaticExpressionFunction >(
9675 QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"string"_s ) << QgsExpressionFunction::Parameter( u
"width"_s ) << QgsExpressionFunction::Parameter( u
"fill"_s,
true, u
" "_s ),
9679 << std::make_shared< QgsStaticExpressionFunction >(
9681 QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"string"_s ) << QgsExpressionFunction::Parameter( u
"width"_s ) << QgsExpressionFunction::Parameter( u
"fill"_s,
true, u
" "_s ),
9685 << std::make_shared< QgsStaticExpressionFunction >( u
"format"_s, -1, fcnFormatString, u
"String"_s )
9686 << std::make_shared< QgsStaticExpressionFunction >(
9689 << QgsExpressionFunction::Parameter( u
"number"_s )
9690 << QgsExpressionFunction::Parameter( u
"places"_s,
true, 0 )
9691 << QgsExpressionFunction::Parameter( u
"language"_s,
true, QVariant() )
9692 << QgsExpressionFunction::Parameter( u
"omit_group_separators"_s,
true,
false )
9693 << QgsExpressionFunction::Parameter( u
"trim_trailing_zeroes"_s,
true,
false ),
9697 << std::make_shared< QgsStaticExpressionFunction >(
9700 << QgsExpressionFunction::Parameter( u
"datetime"_s )
9701 << QgsExpressionFunction::Parameter( u
"format"_s )
9702 << QgsExpressionFunction::Parameter( u
"language"_s,
true, QVariant() ),
9704 QStringList() << u
"String"_s << u
"Date and Time"_s
9706 << std::make_shared< QgsStaticExpressionFunction >( u
"color_grayscale_average"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"color"_s ), fcnColorGrayscaleAverage, u
"Color"_s )
9707 << std::make_shared< QgsStaticExpressionFunction >(
9709 QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"color1"_s ) << QgsExpressionFunction::Parameter( u
"color2"_s ) << QgsExpressionFunction::Parameter( u
"ratio"_s ),
9713 << std::make_shared< QgsStaticExpressionFunction >(
9715 QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"color1"_s ) << QgsExpressionFunction::Parameter( u
"color2"_s ) << QgsExpressionFunction::Parameter( u
"ratio"_s ),
9719 << std::make_shared<
9720 QgsStaticExpressionFunction >( u
"color_rgb"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"red"_s ) << QgsExpressionFunction::Parameter( u
"green"_s ) << QgsExpressionFunction::Parameter( u
"blue"_s ), fcnColorRgb, u
"Color"_s )
9721 << std::make_shared< QgsStaticExpressionFunction >(
9724 << QgsExpressionFunction::Parameter( u
"red"_s )
9725 << QgsExpressionFunction::Parameter( u
"green"_s )
9726 << QgsExpressionFunction::Parameter( u
"blue"_s )
9727 << QgsExpressionFunction::Parameter( u
"alpha"_s,
true, 1. ),
9731 << std::make_shared< QgsStaticExpressionFunction >(
9734 << QgsExpressionFunction::Parameter( u
"red"_s )
9735 << QgsExpressionFunction::Parameter( u
"green"_s )
9736 << QgsExpressionFunction::Parameter( u
"blue"_s )
9737 << QgsExpressionFunction::Parameter( u
"alpha"_s ),
9741 << std::make_shared<
9743 << std::make_shared<
9745 << std::make_shared<
9746 QgsStaticExpressionFunction >( u
"create_ramp"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"map"_s ) << QgsExpressionFunction::Parameter( u
"discrete"_s,
true,
false ), fcnCreateRamp, u
"Color"_s )
9747 << std::make_shared< QgsStaticExpressionFunction >(
9749 QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"hue"_s ) << QgsExpressionFunction::Parameter( u
"saturation"_s ) << QgsExpressionFunction::Parameter( u
"lightness"_s ),
9753 << std::make_shared< QgsStaticExpressionFunction >(
9756 << QgsExpressionFunction::Parameter( u
"hue"_s )
9757 << QgsExpressionFunction::Parameter( u
"saturation"_s )
9758 << QgsExpressionFunction::Parameter( u
"lightness"_s )
9759 << QgsExpressionFunction::Parameter( u
"alpha"_s ),
9763 << std::make_shared< QgsStaticExpressionFunction >(
9766 << QgsExpressionFunction::Parameter( u
"hue"_s )
9767 << QgsExpressionFunction::Parameter( u
"saturation"_s )
9768 << QgsExpressionFunction::Parameter( u
"lightness"_s )
9769 << QgsExpressionFunction::Parameter( u
"alpha"_s,
true, 1. ),
9773 << std::make_shared< QgsStaticExpressionFunction >(
9775 QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"hue"_s ) << QgsExpressionFunction::Parameter( u
"saturation"_s ) << QgsExpressionFunction::Parameter( u
"value"_s ),
9779 << std::make_shared< QgsStaticExpressionFunction >(
9782 << QgsExpressionFunction::Parameter( u
"hue"_s )
9783 << QgsExpressionFunction::Parameter( u
"saturation"_s )
9784 << QgsExpressionFunction::Parameter( u
"value"_s )
9785 << QgsExpressionFunction::Parameter( u
"alpha"_s ),
9789 << std::make_shared< QgsStaticExpressionFunction >(
9792 << QgsExpressionFunction::Parameter( u
"hue"_s )
9793 << QgsExpressionFunction::Parameter( u
"saturation"_s )
9794 << QgsExpressionFunction::Parameter( u
"value"_s )
9795 << QgsExpressionFunction::Parameter( u
"alpha"_s,
true, 1. ),
9799 << std::make_shared< QgsStaticExpressionFunction >(
9802 << QgsExpressionFunction::Parameter( u
"cyan"_s )
9803 << QgsExpressionFunction::Parameter( u
"magenta"_s )
9804 << QgsExpressionFunction::Parameter( u
"yellow"_s )
9805 << QgsExpressionFunction::Parameter( u
"black"_s ),
9809 << std::make_shared< QgsStaticExpressionFunction >(
9812 << QgsExpressionFunction::Parameter( u
"cyan"_s )
9813 << QgsExpressionFunction::Parameter( u
"magenta"_s )
9814 << QgsExpressionFunction::Parameter( u
"yellow"_s )
9815 << QgsExpressionFunction::Parameter( u
"black"_s )
9816 << QgsExpressionFunction::Parameter( u
"alpha"_s ),
9820 << std::make_shared< QgsStaticExpressionFunction >(
9823 << QgsExpressionFunction::Parameter( u
"cyan"_s )
9824 << QgsExpressionFunction::Parameter( u
"magenta"_s )
9825 << QgsExpressionFunction::Parameter( u
"yellow"_s )
9826 << QgsExpressionFunction::Parameter( u
"black"_s )
9827 << QgsExpressionFunction::Parameter( u
"alpha"_s,
true, 1. ),
9831 << std::make_shared<
9832 QgsStaticExpressionFunction >( u
"color_part"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"color"_s ) << QgsExpressionFunction::Parameter( u
"component"_s ), fncColorPart, u
"Color"_s )
9833 << std::make_shared<
9834 QgsStaticExpressionFunction >( u
"darker"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"color"_s ) << QgsExpressionFunction::Parameter( u
"factor"_s ), fncDarker, u
"Color"_s )
9835 << std::make_shared<
9836 QgsStaticExpressionFunction >( u
"lighter"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"color"_s ) << QgsExpressionFunction::Parameter( u
"factor"_s ), fncLighter, u
"Color"_s )
9837 << std::make_shared< QgsStaticExpressionFunction >(
9838 u
"set_color_part"_s,
9839 QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"color"_s ) << QgsExpressionFunction::Parameter( u
"component"_s ) << QgsExpressionFunction::Parameter( u
"value"_s ),
9845 << std::make_shared< QgsStaticExpressionFunction >( u
"base_file_name"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"path"_s ), fcnBaseFileName, u
"Files and Paths"_s )
9846 << std::make_shared< QgsStaticExpressionFunction >( u
"file_suffix"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"path"_s ), fcnFileSuffix, u
"Files and Paths"_s )
9847 << std::make_shared< QgsStaticExpressionFunction >( u
"file_exists"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"path"_s ), fcnFileExists, u
"Files and Paths"_s )
9848 << std::make_shared< QgsStaticExpressionFunction >( u
"file_name"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"path"_s ), fcnFileName, u
"Files and Paths"_s )
9849 << std::make_shared< QgsStaticExpressionFunction >( u
"is_file"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"path"_s ), fcnPathIsFile, u
"Files and Paths"_s )
9850 << std::make_shared< QgsStaticExpressionFunction >( u
"is_directory"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"path"_s ), fcnPathIsDir, u
"Files and Paths"_s )
9851 << std::make_shared< QgsStaticExpressionFunction >( u
"file_path"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"path"_s ), fcnFilePath, u
"Files and Paths"_s )
9852 << std::make_shared< QgsStaticExpressionFunction >( u
"file_size"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"path"_s ), fcnFileSize, u
"Files and Paths"_s )
9854 << std::make_shared<
9855 QgsStaticExpressionFunction >( u
"exif"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"path"_s ) << QgsExpressionFunction::Parameter( u
"tag"_s,
true ), fcnExif, u
"Files and Paths"_s )
9856 << std::make_shared< QgsStaticExpressionFunction >( u
"exif_geotag"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"path"_s ), fcnExifGeoTag, u
"GeometryGroup"_s )
9859 << std::make_shared<
9860 QgsStaticExpressionFunction >( u
"hash"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"string"_s ) << QgsExpressionFunction::Parameter( u
"method"_s ), fcnGenericHash, u
"Conversions"_s )
9861 << std::make_shared< QgsStaticExpressionFunction >( u
"md5"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"string"_s ), fcnHashMd5, u
"Conversions"_s )
9862 << std::make_shared< QgsStaticExpressionFunction >( u
"sha256"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"string"_s ), fcnHashSha256, u
"Conversions"_s )
9865 << std::make_shared< QgsStaticExpressionFunction >( u
"to_base64"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"value"_s ), fcnToBase64, u
"Conversions"_s )
9866 << std::make_shared< QgsStaticExpressionFunction >( u
"from_base64"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"string"_s ), fcnFromBase64, u
"Conversions"_s )
9869 << std::make_shared< QgsStaticExpressionFunction >(
9870 u
"magnetic_declination"_s,
9872 << QgsExpressionFunction::Parameter( u
"model_name"_s )
9873 << QgsExpressionFunction::Parameter( u
"date"_s )
9874 << QgsExpressionFunction::Parameter( u
"latitude"_s )
9875 << QgsExpressionFunction::Parameter( u
"longitude"_s )
9876 << QgsExpressionFunction::Parameter( u
"height"_s )
9877 << QgsExpressionFunction::Parameter( u
"model_path"_s,
true ),
9878 fcnMagneticDeclination,
9881 << std::make_shared< QgsStaticExpressionFunction >(
9882 u
"magnetic_inclination"_s,
9884 << QgsExpressionFunction::Parameter( u
"model_name"_s )
9885 << QgsExpressionFunction::Parameter( u
"date"_s )
9886 << QgsExpressionFunction::Parameter( u
"latitude"_s )
9887 << QgsExpressionFunction::Parameter( u
"longitude"_s )
9888 << QgsExpressionFunction::Parameter( u
"height"_s )
9889 << QgsExpressionFunction::Parameter( u
"model_path"_s,
true ),
9890 fcnMagneticInclination,
9893 << std::make_shared< QgsStaticExpressionFunction >(
9894 u
"magnetic_declination_rate_of_change"_s,
9896 << QgsExpressionFunction::Parameter( u
"model_name"_s )
9897 << QgsExpressionFunction::Parameter( u
"date"_s )
9898 << QgsExpressionFunction::Parameter( u
"latitude"_s )
9899 << QgsExpressionFunction::Parameter( u
"longitude"_s )
9900 << QgsExpressionFunction::Parameter( u
"height"_s )
9901 << QgsExpressionFunction::Parameter( u
"model_path"_s,
true ),
9902 fcnMagneticDeclinationRateOfChange,
9905 << std::make_shared< QgsStaticExpressionFunction >(
9906 u
"magnetic_inclination_rate_of_change"_s,
9908 << QgsExpressionFunction::Parameter( u
"model_name"_s )
9909 << QgsExpressionFunction::Parameter( u
"date"_s )
9910 << QgsExpressionFunction::Parameter( u
"latitude"_s )
9911 << QgsExpressionFunction::Parameter( u
"longitude"_s )
9912 << QgsExpressionFunction::Parameter( u
"height"_s )
9913 << QgsExpressionFunction::Parameter( u
"model_path"_s,
true ),
9914 fcnMagneticInclinationRateOfChange,
9921 auto geomFunc = std::make_shared< QgsStaticExpressionFunction >( u
"$geometry"_s, 0, fcnGeometry, u
"GeometryGroup"_s, QString(),
true );
9922 geomFunc->setIsStatic(
false );
9923 functions << geomFunc;
9925 auto areaFunc = std::make_shared< QgsStaticExpressionFunction >( u
"$area"_s, 0, fcnGeomArea, u
"GeometryGroup"_s, QString(),
true );
9926 areaFunc->setIsStatic(
false );
9927 functions << areaFunc;
9929 functions << std::make_shared< QgsStaticExpressionFunction >( u
"area"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ), fcnArea, u
"GeometryGroup"_s );
9931 auto lengthFunc = std::make_shared< QgsStaticExpressionFunction >( u
"$length"_s, 0, fcnGeomLength, u
"GeometryGroup"_s, QString(),
true );
9932 lengthFunc->setIsStatic(
false );
9933 functions << lengthFunc;
9935 auto perimeterFunc = std::make_shared< QgsStaticExpressionFunction >( u
"$perimeter"_s, 0, fcnGeomPerimeter, u
"GeometryGroup"_s, QString(),
true );
9936 perimeterFunc->setIsStatic(
false );
9937 functions << perimeterFunc;
9939 functions << std::make_shared< QgsStaticExpressionFunction >( u
"perimeter"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ), fcnPerimeter, u
"GeometryGroup"_s );
9941 functions << std::make_shared< QgsStaticExpressionFunction >( u
"roundness"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ), fcnRoundness, u
"GeometryGroup"_s );
9943 auto xFunc = std::make_shared< QgsStaticExpressionFunction >( u
"$x"_s, 0, fcnX, u
"GeometryGroup"_s, QString(),
true );
9944 xFunc->setIsStatic(
false );
9947 auto yFunc = std::make_shared< QgsStaticExpressionFunction >( u
"$y"_s, 0, fcnY, u
"GeometryGroup"_s, QString(),
true );
9948 yFunc->setIsStatic(
false );
9951 auto zFunc = std::make_shared< QgsStaticExpressionFunction >( u
"$z"_s, 0, fcnZ, u
"GeometryGroup"_s, QString(),
true );
9952 zFunc->setIsStatic(
false );
9955 QMap< QString, QgsExpressionFunction::FcnEval > geometry_overlay_definitions {
9956 { u
"overlay_intersects"_s, fcnGeomOverlayIntersects },
9957 { u
"overlay_contains"_s, fcnGeomOverlayContains },
9958 { u
"overlay_crosses"_s, fcnGeomOverlayCrosses },
9959 { u
"overlay_equals"_s, fcnGeomOverlayEquals },
9960 { u
"overlay_equals_exact"_s, fcnGeomOverlayEqualsExact },
9961 { u
"overlay_equals_topological"_s, fcnGeomOverlayEqualsTopological },
9962 { u
"overlay_equals_fuzzy"_s, fcnGeomOverlayEqualsFuzzy },
9963 { u
"overlay_touches"_s, fcnGeomOverlayTouches },
9964 { u
"overlay_disjoint"_s, fcnGeomOverlayDisjoint },
9965 { u
"overlay_within"_s, fcnGeomOverlayWithin },
9967 QMapIterator< QString, QgsExpressionFunction::FcnEval > i( geometry_overlay_definitions );
9968 while ( i.hasNext() )
9971 QString defaultBackend = i.key() ==
"overlay_equals"_L1 ? QString(
"QGIS" ) : QString(
"GEOS" );
9972 auto fcnGeomOverlayFunc = std::make_shared< QgsStaticExpressionFunction >(
9975 << QgsExpressionFunction::Parameter( u
"layer"_s )
9976 << QgsExpressionFunction::Parameter( u
"expression"_s,
true, QVariant(),
true )
9977 << QgsExpressionFunction::Parameter( u
"filter"_s,
true, QVariant(),
true )
9978 << QgsExpressionFunction::Parameter( u
"limit"_s,
true, QVariant( -1 ),
true )
9979 << QgsExpressionFunction::Parameter( u
"cache"_s,
true, QVariant(
false ),
false )
9980 << QgsExpressionFunction::Parameter( u
"min_overlap"_s,
true, QVariant( -1 ),
false )
9981 << QgsExpressionFunction::Parameter( u
"min_inscribed_circle_radius"_s,
true, QVariant( -1 ),
false )
9982 << QgsExpressionFunction::Parameter( u
"return_details"_s,
true,
false,
false )
9983 << QgsExpressionFunction::Parameter( u
"sort_by_intersection_size"_s,
true, QString(),
false )
9984 << QgsExpressionFunction::Parameter( u
"backend"_s,
true, defaultBackend,
false )
9985 << QgsExpressionFunction::Parameter( u
"epsilon"_s,
true, 1e-4,
false ),
9995 fcnGeomOverlayFunc->setIsStatic(
false );
9996 functions << fcnGeomOverlayFunc;
9999 auto fcnGeomOverlayNearestFunc = std::make_shared< QgsStaticExpressionFunction >(
10000 u
"overlay_nearest"_s,
10002 << QgsExpressionFunction::Parameter( u
"layer"_s )
10003 << QgsExpressionFunction::Parameter( u
"expression"_s,
true, QVariant(),
true )
10004 << QgsExpressionFunction::Parameter( u
"filter"_s,
true, QVariant(),
true )
10005 << QgsExpressionFunction::Parameter( u
"limit"_s,
true, QVariant( 1 ),
true )
10006 << QgsExpressionFunction::Parameter( u
"max_distance"_s,
true, 0 )
10007 << QgsExpressionFunction::Parameter( u
"cache"_s,
true, QVariant(
false ),
false ),
10008 fcnGeomOverlayNearest,
10009 u
"GeometryGroup"_s,
10016 fcnGeomOverlayNearestFunc->setIsStatic(
false );
10017 functions << fcnGeomOverlayNearestFunc;
10020 << std::make_shared< QgsStaticExpressionFunction >( u
"is_valid"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ), fcnGeomIsValid, u
"GeometryGroup"_s )
10021 << std::make_shared< QgsStaticExpressionFunction >( u
"x"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ), fcnGeomX, u
"GeometryGroup"_s )
10022 << std::make_shared< QgsStaticExpressionFunction >( u
"y"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ), fcnGeomY, u
"GeometryGroup"_s )
10023 << std::make_shared< QgsStaticExpressionFunction >( u
"z"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ), fcnGeomZ, u
"GeometryGroup"_s )
10024 << std::make_shared< QgsStaticExpressionFunction >( u
"m"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ), fcnGeomM, u
"GeometryGroup"_s )
10025 << std::make_shared<
10026 QgsStaticExpressionFunction >( u
"point_n"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ) << QgsExpressionFunction::Parameter( u
"index"_s ), fcnPointN, u
"GeometryGroup"_s )
10027 << std::make_shared< QgsStaticExpressionFunction >( u
"start_point"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ), fcnStartPoint, u
"GeometryGroup"_s )
10028 << std::make_shared< QgsStaticExpressionFunction >( u
"end_point"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ), fcnEndPoint, u
"GeometryGroup"_s )
10029 << std::make_shared<
10030 QgsStaticExpressionFunction >( u
"nodes_to_points"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ) << QgsExpressionFunction::Parameter( u
"ignore_closing_nodes"_s,
true,
false ), fcnNodesToPoints, u
"GeometryGroup"_s )
10031 << std::make_shared< QgsStaticExpressionFunction >( u
"segments_to_lines"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ), fcnSegmentsToLines, u
"GeometryGroup"_s )
10032 << std::make_shared< QgsStaticExpressionFunction >( u
"collect_geometries"_s, -1, fcnCollectGeometries, u
"GeometryGroup"_s )
10033 << std::make_shared< QgsStaticExpressionFunction >( u
"make_point"_s, -1, fcnMakePoint, u
"GeometryGroup"_s )
10034 << std::make_shared<
10035 QgsStaticExpressionFunction >( u
"make_point_m"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"x"_s ) << QgsExpressionFunction::Parameter( u
"y"_s ) << QgsExpressionFunction::Parameter( u
"m"_s ), fcnMakePointM, u
"GeometryGroup"_s )
10036 << std::make_shared< QgsStaticExpressionFunction >( u
"make_line"_s, -1, fcnMakeLine, u
"GeometryGroup"_s )
10037 << std::make_shared< QgsStaticExpressionFunction >( u
"make_polygon"_s, -1, fcnMakePolygon, u
"GeometryGroup"_s )
10038 << std::make_shared< QgsStaticExpressionFunction >(
10039 u
"make_triangle"_s,
10040 QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"point1"_s ) << QgsExpressionFunction::Parameter( u
"point2"_s ) << QgsExpressionFunction::Parameter( u
"point3"_s ),
10044 << std::make_shared< QgsStaticExpressionFunction >(
10047 << QgsExpressionFunction::Parameter( u
"center"_s )
10048 << QgsExpressionFunction::Parameter( u
"radius"_s )
10049 << QgsExpressionFunction::Parameter( u
"segments"_s,
true, 36 ),
10053 << std::make_shared< QgsStaticExpressionFunction >(
10056 << QgsExpressionFunction::Parameter( u
"center"_s )
10057 << QgsExpressionFunction::Parameter( u
"semi_major_axis"_s )
10058 << QgsExpressionFunction::Parameter( u
"semi_minor_axis"_s )
10059 << QgsExpressionFunction::Parameter( u
"azimuth"_s )
10060 << QgsExpressionFunction::Parameter( u
"segments"_s,
true, 36 ),
10064 << std::make_shared< QgsStaticExpressionFunction >(
10065 u
"make_regular_polygon"_s,
10067 << QgsExpressionFunction::Parameter( u
"center"_s )
10068 << QgsExpressionFunction::Parameter( u
"radius"_s )
10069 << QgsExpressionFunction::Parameter( u
"number_sides"_s )
10070 << QgsExpressionFunction::Parameter( u
"circle"_s,
true, 0 ),
10071 fcnMakeRegularPolygon,
10074 << std::make_shared<
10075 QgsStaticExpressionFunction >( u
"make_square"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"point1"_s ) << QgsExpressionFunction::Parameter( u
"point2"_s ), fcnMakeSquare, u
"GeometryGroup"_s )
10076 << std::make_shared< QgsStaticExpressionFunction >(
10077 u
"make_rectangle_3points"_s,
10079 << QgsExpressionFunction::Parameter( u
"point1"_s )
10080 << QgsExpressionFunction::Parameter( u
"point2"_s )
10081 << QgsExpressionFunction::Parameter( u
"point3"_s )
10082 << QgsExpressionFunction::Parameter( u
"option"_s,
true, 0 ),
10083 fcnMakeRectangleFrom3Points,
10086 << std::make_shared< QgsStaticExpressionFunction >(
10089 QgsExpressionFunction::Parameter( u
"geometry"_s ),
10090#if GEOS_VERSION_NUM < GEOS_COMPUTE_VERSION( 3, 10, 0 )
10091 QgsExpressionFunction::Parameter( u
"method"_s,
true, u
"linework"_s ),
10093 QgsExpressionFunction::Parameter( u
"method"_s,
true, u
"structure"_s ),
10095 QgsExpressionFunction::Parameter( u
"keep_collapsed"_s,
true,
false )
10101 functions << std::make_shared<
10102 QgsStaticExpressionFunction >( u
"x_at"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s,
true ) << QgsExpressionFunction::Parameter( u
"vertex"_s,
true ), fcnXat, u
"GeometryGroup"_s );
10103 functions << std::make_shared<
10104 QgsStaticExpressionFunction >( u
"y_at"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s,
true ) << QgsExpressionFunction::Parameter( u
"vertex"_s,
true ), fcnYat, u
"GeometryGroup"_s );
10105 functions << std::make_shared<
10106 QgsStaticExpressionFunction >( u
"z_at"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ) << QgsExpressionFunction::Parameter( u
"vertex"_s,
true ), fcnZat, u
"GeometryGroup"_s );
10107 functions << std::make_shared<
10108 QgsStaticExpressionFunction >( u
"m_at"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ) << QgsExpressionFunction::Parameter( u
"vertex"_s,
true ), fcnMat, u
"GeometryGroup"_s );
10110 auto xAtFunc = std::make_shared<
10111 QgsStaticExpressionFunction >( u
"$x_at"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"vertex"_s ), fcnOldXat, u
"GeometryGroup"_s, QString(),
true, QSet<QString>(),
false, QStringList() << u
"xat"_s );
10112 xAtFunc->setIsStatic(
false );
10113 functions << xAtFunc;
10116 auto yAtFunc = std::make_shared<
10117 QgsStaticExpressionFunction >( u
"$y_at"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"vertex"_s ), fcnOldYat, u
"GeometryGroup"_s, QString(),
true, QSet<QString>(),
false, QStringList() << u
"yat"_s );
10118 yAtFunc->setIsStatic(
false );
10119 functions << yAtFunc;
10122 << std::make_shared< QgsStaticExpressionFunction >( u
"geometry_type"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ), fcnGeometryType, u
"GeometryGroup"_s )
10123 << std::make_shared<
10124 QgsStaticExpressionFunction >( u
"x_min"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ), fcnXMin, u
"GeometryGroup"_s, QString(),
false, QSet<QString>(),
false, QStringList() << u
"xmin"_s )
10125 << std::make_shared<
10126 QgsStaticExpressionFunction >( u
"x_max"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ), fcnXMax, u
"GeometryGroup"_s, QString(),
false, QSet<QString>(),
false, QStringList() << u
"xmax"_s )
10127 << std::make_shared<
10128 QgsStaticExpressionFunction >( u
"y_min"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ), fcnYMin, u
"GeometryGroup"_s, QString(),
false, QSet<QString>(),
false, QStringList() << u
"ymin"_s )
10129 << std::make_shared<
10130 QgsStaticExpressionFunction >( u
"y_max"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ), fcnYMax, u
"GeometryGroup"_s, QString(),
false, QSet<QString>(),
false, QStringList() << u
"ymax"_s )
10131 << std::make_shared<
10132 QgsStaticExpressionFunction >( u
"geom_from_wkt"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"text"_s ), fcnGeomFromWKT, u
"GeometryGroup"_s, QString(),
false, QSet<QString>(),
false, QStringList() << u
"geomFromWKT"_s )
10133 << std::make_shared<
10134 QgsStaticExpressionFunction >( u
"geom_from_wkb"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"binary"_s ), fcnGeomFromWKB, u
"GeometryGroup"_s, QString(),
false, QSet<QString>(),
false )
10135 << std::make_shared<
10136 QgsStaticExpressionFunction >( u
"geom_from_gml"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"gml"_s ), fcnGeomFromGML, u
"GeometryGroup"_s, QString(),
false, QSet<QString>(),
false, QStringList() << u
"geomFromGML"_s )
10137 << std::make_shared< QgsStaticExpressionFunction >( u
"flip_coordinates"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ), fcnFlipCoordinates, u
"GeometryGroup"_s )
10138 << std::make_shared< QgsStaticExpressionFunction >( u
"relate"_s, -1, fcnRelate, u
"GeometryGroup"_s )
10139 << std::make_shared< QgsStaticExpressionFunction >(
10140 u
"intersects_bbox"_s,
10143 u
"GeometryGroup"_s,
10148 QStringList() << u
"bbox"_s
10150 << std::make_shared<
10151 QgsStaticExpressionFunction >( u
"disjoint"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry1"_s ) << QgsExpressionFunction::Parameter( u
"geometry2"_s ), fcnDisjoint, u
"GeometryGroup"_s )
10152 << std::make_shared<
10153 QgsStaticExpressionFunction >( u
"intersects"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry1"_s ) << QgsExpressionFunction::Parameter( u
"geometry2"_s ), fcnIntersects, u
"GeometryGroup"_s )
10154 << std::make_shared<
10155 QgsStaticExpressionFunction >( u
"touches"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry1"_s ) << QgsExpressionFunction::Parameter( u
"geometry2"_s ), fcnTouches, u
"GeometryGroup"_s )
10156 << std::make_shared<
10157 QgsStaticExpressionFunction >( u
"crosses"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry1"_s ) << QgsExpressionFunction::Parameter( u
"geometry2"_s ), fcnCrosses, u
"GeometryGroup"_s )
10158 << std::make_shared<
10159 QgsStaticExpressionFunction >( u
"contains"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry1"_s ) << QgsExpressionFunction::Parameter( u
"geometry2"_s ), fcnContains, u
"GeometryGroup"_s )
10160 << std::make_shared<
10161 QgsStaticExpressionFunction >( u
"overlaps"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry1"_s ) << QgsExpressionFunction::Parameter( u
"geometry2"_s ), fcnOverlaps, u
"GeometryGroup"_s )
10162 << std::make_shared<
10163 QgsStaticExpressionFunction >( u
"within"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry1"_s ) << QgsExpressionFunction::Parameter( u
"geometry2"_s ), fcnWithin, u
"GeometryGroup"_s )
10164 << std::make_shared<
10165 QgsStaticExpressionFunction >( u
"equals"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry1"_s ) << QgsExpressionFunction::Parameter( u
"geometry2"_s ), fcnEquals, u
"GeometryGroup"_s )
10166 << std::make_shared< QgsStaticExpressionFunction >(
10169 << QgsExpressionFunction::Parameter( u
"geometry1"_s )
10170 << QgsExpressionFunction::Parameter( u
"geometry2"_s )
10171 << QgsExpressionFunction::Parameter( u
"backend"_s,
true, u
"QGIS"_s ),
10175 << std::make_shared< QgsStaticExpressionFunction >(
10176 u
"equals_topological"_s,
10178 << QgsExpressionFunction::Parameter( u
"geometry1"_s )
10179 << QgsExpressionFunction::Parameter( u
"geometry2"_s )
10180 << QgsExpressionFunction::Parameter( u
"backend"_s,
true, u
"GEOS"_s ),
10181 fcnIsEqualsTopological,
10184 << std::make_shared< QgsStaticExpressionFunction >(
10187 << QgsExpressionFunction::Parameter( u
"geometry1"_s )
10188 << QgsExpressionFunction::Parameter( u
"geometry2"_s )
10189 << QgsExpressionFunction::Parameter( u
"backend"_s,
true, u
"QGIS"_s )
10190 << QgsExpressionFunction::Parameter( u
"epsilon"_s,
true, 1e-4 ),
10194 << std::make_shared< QgsStaticExpressionFunction >(
10196 QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ) << QgsExpressionFunction::Parameter( u
"dx"_s ) << QgsExpressionFunction::Parameter( u
"dy"_s ),
10200 << std::make_shared< QgsStaticExpressionFunction >(
10203 << QgsExpressionFunction::Parameter( u
"geometry"_s )
10204 << QgsExpressionFunction::Parameter( u
"rotation"_s )
10205 << QgsExpressionFunction::Parameter( u
"center"_s,
true )
10206 << QgsExpressionFunction::Parameter( u
"per_part"_s,
true,
false ),
10210 << std::make_shared< QgsStaticExpressionFunction >(
10213 << QgsExpressionFunction::Parameter( u
"geometry"_s )
10214 << QgsExpressionFunction::Parameter( u
"x_scale"_s )
10215 << QgsExpressionFunction::Parameter( u
"y_scale"_s )
10216 << QgsExpressionFunction::Parameter( u
"center"_s,
true ),
10220 << std::make_shared< QgsStaticExpressionFunction >(
10221 u
"affine_transform"_s,
10223 << QgsExpressionFunction::Parameter( u
"geometry"_s )
10224 << QgsExpressionFunction::Parameter( u
"delta_x"_s )
10225 << QgsExpressionFunction::Parameter( u
"delta_y"_s )
10226 << QgsExpressionFunction::Parameter( u
"rotation_z"_s )
10227 << QgsExpressionFunction::Parameter( u
"scale_x"_s )
10228 << QgsExpressionFunction::Parameter( u
"scale_y"_s )
10229 << QgsExpressionFunction::Parameter( u
"delta_z"_s,
true, 0 )
10230 << QgsExpressionFunction::Parameter( u
"delta_m"_s,
true, 0 )
10231 << QgsExpressionFunction::Parameter( u
"scale_z"_s,
true, 1 )
10232 << QgsExpressionFunction::Parameter( u
"scale_m"_s,
true, 1 ),
10233 fcnAffineTransform,
10236 << std::make_shared< QgsStaticExpressionFunction >(
10239 << QgsExpressionFunction::Parameter( u
"geometry"_s )
10240 << QgsExpressionFunction::Parameter( u
"distance"_s )
10241 << QgsExpressionFunction::Parameter( u
"segments"_s,
true, 8 )
10242 << QgsExpressionFunction::Parameter( u
"cap"_s,
true, u
"round"_s )
10243 << QgsExpressionFunction::Parameter( u
"join"_s,
true, u
"round"_s )
10244 << QgsExpressionFunction::Parameter( u
"miter_limit"_s,
true, 2 ),
10248 << std::make_shared< QgsStaticExpressionFunction >( u
"force_rhr"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ), fcnForceRHR, u
"GeometryGroup"_s )
10249 << std::make_shared< QgsStaticExpressionFunction >( u
"force_polygon_cw"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ), fcnForcePolygonCW, u
"GeometryGroup"_s )
10250 << std::make_shared< QgsStaticExpressionFunction >( u
"force_polygon_ccw"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ), fcnForcePolygonCCW, u
"GeometryGroup"_s )
10251 << std::make_shared< QgsStaticExpressionFunction >(
10254 << QgsExpressionFunction::Parameter( u
"center"_s )
10255 << QgsExpressionFunction::Parameter( u
"azimuth"_s )
10256 << QgsExpressionFunction::Parameter( u
"width"_s )
10257 << QgsExpressionFunction::Parameter( u
"outer_radius"_s )
10258 << QgsExpressionFunction::Parameter( u
"inner_radius"_s,
true, 0.0 ),
10262 << std::make_shared< QgsStaticExpressionFunction >(
10263 u
"tapered_buffer"_s,
10265 << QgsExpressionFunction::Parameter( u
"geometry"_s )
10266 << QgsExpressionFunction::Parameter( u
"start_width"_s )
10267 << QgsExpressionFunction::Parameter( u
"end_width"_s )
10268 << QgsExpressionFunction::Parameter( u
"segments"_s,
true, 8.0 ),
10272 << std::make_shared<
10273 QgsStaticExpressionFunction >( u
"buffer_by_m"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ) << QgsExpressionFunction::Parameter( u
"segments"_s,
true, 8.0 ), fcnBufferByM, u
"GeometryGroup"_s )
10274 << std::make_shared< QgsStaticExpressionFunction >(
10277 << QgsExpressionFunction::Parameter( u
"geometry"_s )
10278 << QgsExpressionFunction::Parameter( u
"distance"_s )
10279 << QgsExpressionFunction::Parameter( u
"segments"_s,
true, 8.0 )
10281 << QgsExpressionFunction::Parameter( u
"miter_limit"_s,
true, 2.0 ),
10285 << std::make_shared< QgsStaticExpressionFunction >(
10286 u
"single_sided_buffer"_s,
10288 << QgsExpressionFunction::Parameter( u
"geometry"_s )
10289 << QgsExpressionFunction::Parameter( u
"distance"_s )
10290 << QgsExpressionFunction::Parameter( u
"segments"_s,
true, 8.0 )
10292 << QgsExpressionFunction::Parameter( u
"miter_limit"_s,
true, 2.0 ),
10293 fcnSingleSidedBuffer,
10296 << std::make_shared< QgsStaticExpressionFunction >(
10299 << QgsExpressionFunction::Parameter( u
"geometry"_s )
10300 << QgsExpressionFunction::Parameter( u
"start_distance"_s )
10301 << QgsExpressionFunction::Parameter( u
"end_distance"_s )
10302 << QgsExpressionFunction::Parameter( u
"start_deflection"_s,
true, 0 )
10303 << QgsExpressionFunction::Parameter( u
"end_deflection"_s,
true, 0 ),
10307 << std::make_shared< QgsStaticExpressionFunction >( u
"centroid"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ), fcnCentroid, u
"GeometryGroup"_s )
10308 << std::make_shared< QgsStaticExpressionFunction >( u
"point_on_surface"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ), fcnPointOnSurface, u
"GeometryGroup"_s )
10309 << std::make_shared<
10310 QgsStaticExpressionFunction >( u
"pole_of_inaccessibility"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ) << QgsExpressionFunction::Parameter( u
"tolerance"_s ), fcnPoleOfInaccessibility, u
"GeometryGroup"_s )
10311 << std::make_shared<
10312 QgsStaticExpressionFunction >( u
"reverse"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ), fcnReverse, QStringList { u
"String"_s, u
"GeometryGroup"_s } )
10313 << std::make_shared< QgsStaticExpressionFunction >( u
"exterior_ring"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ), fcnExteriorRing, u
"GeometryGroup"_s )
10314 << std::make_shared<
10315 QgsStaticExpressionFunction >( u
"interior_ring_n"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ) << QgsExpressionFunction::Parameter( u
"index"_s ), fcnInteriorRingN, u
"GeometryGroup"_s )
10316 << std::make_shared<
10317 QgsStaticExpressionFunction >( u
"geometry_n"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ) << QgsExpressionFunction::Parameter( u
"index"_s ), fcnGeometryN, u
"GeometryGroup"_s )
10318 << std::make_shared< QgsStaticExpressionFunction >( u
"boundary"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ), fcnBoundary, u
"GeometryGroup"_s )
10319 << std::make_shared< QgsStaticExpressionFunction >( u
"line_merge"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ), fcnLineMerge, u
"GeometryGroup"_s )
10320 << std::make_shared<
10321 QgsStaticExpressionFunction >( u
"shared_paths"_s,
QgsExpressionFunction::ParameterList { QgsExpressionFunction::Parameter( u
"geometry1"_s ), QgsExpressionFunction::Parameter( u
"geometry2"_s ) }, fcnSharedPaths, u
"GeometryGroup"_s )
10322 << std::make_shared< QgsStaticExpressionFunction >( u
"bounds"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ), fcnBounds, u
"GeometryGroup"_s )
10323 << std::make_shared<
10324 QgsStaticExpressionFunction >( u
"simplify"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ) << QgsExpressionFunction::Parameter( u
"tolerance"_s ), fcnSimplify, u
"GeometryGroup"_s )
10325 << std::make_shared<
10326 QgsStaticExpressionFunction >( u
"simplify_vw"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ) << QgsExpressionFunction::Parameter( u
"tolerance"_s ), fcnSimplifyVW, u
"GeometryGroup"_s )
10327 << std::make_shared< QgsStaticExpressionFunction >(
10330 << QgsExpressionFunction::Parameter( u
"geometry"_s )
10331 << QgsExpressionFunction::Parameter( u
"iterations"_s,
true, 1 )
10332 << QgsExpressionFunction::Parameter( u
"offset"_s,
true, 0.25 )
10333 << QgsExpressionFunction::Parameter( u
"min_length"_s,
true, -1 )
10334 << QgsExpressionFunction::Parameter( u
"max_angle"_s,
true, 180 ),
10338 << std::make_shared< QgsStaticExpressionFunction >(
10339 u
"triangular_wave"_s,
10340 QgsExpressionFunction::
10341 ParameterList { QgsExpressionFunction::Parameter( u
"geometry"_s ), QgsExpressionFunction::Parameter( u
"wavelength"_s ), QgsExpressionFunction::Parameter( u
"amplitude"_s ), QgsExpressionFunction::Parameter( u
"strict"_s,
true,
false ) },
10345 << std::make_shared< QgsStaticExpressionFunction >(
10346 u
"triangular_wave_randomized"_s,
10348 QgsExpressionFunction::Parameter( u
"geometry"_s ),
10349 QgsExpressionFunction::Parameter( u
"min_wavelength"_s ),
10350 QgsExpressionFunction::Parameter( u
"max_wavelength"_s ),
10351 QgsExpressionFunction::Parameter( u
"min_amplitude"_s ),
10352 QgsExpressionFunction::Parameter( u
"max_amplitude"_s ),
10353 QgsExpressionFunction::Parameter( u
"seed"_s,
true, 0 )
10355 fcnTriangularWaveRandomized,
10358 << std::make_shared< QgsStaticExpressionFunction >(
10360 QgsExpressionFunction::
10361 ParameterList { QgsExpressionFunction::Parameter( u
"geometry"_s ), QgsExpressionFunction::Parameter( u
"wavelength"_s ), QgsExpressionFunction::Parameter( u
"amplitude"_s ), QgsExpressionFunction::Parameter( u
"strict"_s,
true,
false ) },
10365 << std::make_shared< QgsStaticExpressionFunction >(
10366 u
"square_wave_randomized"_s,
10368 QgsExpressionFunction::Parameter( u
"geometry"_s ),
10369 QgsExpressionFunction::Parameter( u
"min_wavelength"_s ),
10370 QgsExpressionFunction::Parameter( u
"max_wavelength"_s ),
10371 QgsExpressionFunction::Parameter( u
"min_amplitude"_s ),
10372 QgsExpressionFunction::Parameter( u
"max_amplitude"_s ),
10373 QgsExpressionFunction::Parameter( u
"seed"_s,
true, 0 )
10375 fcnSquareWaveRandomized,
10378 << std::make_shared< QgsStaticExpressionFunction >(
10380 QgsExpressionFunction::
10381 ParameterList { QgsExpressionFunction::Parameter( u
"geometry"_s ), QgsExpressionFunction::Parameter( u
"wavelength"_s ), QgsExpressionFunction::Parameter( u
"amplitude"_s ), QgsExpressionFunction::Parameter( u
"strict"_s,
true,
false ) },
10385 << std::make_shared< QgsStaticExpressionFunction >(
10386 u
"wave_randomized"_s,
10388 QgsExpressionFunction::Parameter( u
"geometry"_s ),
10389 QgsExpressionFunction::Parameter( u
"min_wavelength"_s ),
10390 QgsExpressionFunction::Parameter( u
"max_wavelength"_s ),
10391 QgsExpressionFunction::Parameter( u
"min_amplitude"_s ),
10392 QgsExpressionFunction::Parameter( u
"max_amplitude"_s ),
10393 QgsExpressionFunction::Parameter( u
"seed"_s,
true, 0 )
10395 fcnRoundWaveRandomized,
10398 << std::make_shared< QgsStaticExpressionFunction >(
10399 u
"apply_dash_pattern"_s,
10401 QgsExpressionFunction::Parameter( u
"geometry"_s ),
10402 QgsExpressionFunction::Parameter( u
"pattern"_s ),
10403 QgsExpressionFunction::Parameter( u
"start_rule"_s,
true, u
"no_rule"_s ),
10404 QgsExpressionFunction::Parameter( u
"end_rule"_s,
true, u
"no_rule"_s ),
10405 QgsExpressionFunction::Parameter( u
"adjustment"_s,
true, u
"both"_s ),
10406 QgsExpressionFunction::Parameter( u
"pattern_offset"_s,
true, 0 ),
10408 fcnApplyDashPattern,
10411 << std::make_shared<
10412 QgsStaticExpressionFunction >( u
"densify_by_count"_s,
QgsExpressionFunction::ParameterList { QgsExpressionFunction::Parameter( u
"geometry"_s ), QgsExpressionFunction::Parameter( u
"vertices"_s ) }, fcnDensifyByCount, u
"GeometryGroup"_s )
10413 << std::make_shared<
10414 QgsStaticExpressionFunction >( u
"densify_by_distance"_s,
QgsExpressionFunction::ParameterList { QgsExpressionFunction::Parameter( u
"geometry"_s ), QgsExpressionFunction::Parameter( u
"distance"_s ) }, fcnDensifyByDistance, u
"GeometryGroup"_s )
10415 << std::make_shared< QgsStaticExpressionFunction >( u
"num_points"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ), fcnGeomNumPoints, u
"GeometryGroup"_s )
10416 << std::make_shared< QgsStaticExpressionFunction >( u
"num_interior_rings"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ), fcnGeomNumInteriorRings, u
"GeometryGroup"_s )
10417 << std::make_shared< QgsStaticExpressionFunction >( u
"num_rings"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ), fcnGeomNumRings, u
"GeometryGroup"_s )
10418 << std::make_shared< QgsStaticExpressionFunction >( u
"num_geometries"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ), fcnGeomNumGeometries, u
"GeometryGroup"_s )
10419 << std::make_shared< QgsStaticExpressionFunction >( u
"bounds_width"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ), fcnBoundsWidth, u
"GeometryGroup"_s )
10420 << std::make_shared< QgsStaticExpressionFunction >( u
"bounds_height"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ), fcnBoundsHeight, u
"GeometryGroup"_s )
10421 << std::make_shared< QgsStaticExpressionFunction >( u
"is_closed"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ), fcnIsClosed, u
"GeometryGroup"_s )
10422 << std::make_shared< QgsStaticExpressionFunction >( u
"close_line"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ), fcnCloseLine, u
"GeometryGroup"_s )
10423 << std::make_shared< QgsStaticExpressionFunction >( u
"is_empty"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ), fcnIsEmpty, u
"GeometryGroup"_s )
10424 << std::make_shared< QgsStaticExpressionFunction >(
10425 u
"is_empty_or_null"_s,
10428 u
"GeometryGroup"_s,
10436 << std::make_shared<
10437 QgsStaticExpressionFunction >( u
"convex_hull"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ), fcnConvexHull, u
"GeometryGroup"_s, QString(),
false, QSet<QString>(),
false, QStringList() << u
"convexHull"_s )
10439 << std::make_shared< QgsStaticExpressionFunction >(
10442 << QgsExpressionFunction::Parameter( u
"geometry"_s )
10443 << QgsExpressionFunction::Parameter( u
"target_percent"_s )
10444 << QgsExpressionFunction::Parameter( u
"allow_holes"_s,
true,
false ),
10449 << std::make_shared< QgsStaticExpressionFunction >( u
"oriented_bbox"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ), fcnOrientedBBox, u
"GeometryGroup"_s )
10450 << std::make_shared< QgsStaticExpressionFunction >( u
"main_angle"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ), fcnMainAngle, u
"GeometryGroup"_s )
10451 << std::make_shared<
10452 QgsStaticExpressionFunction >( u
"minimal_circle"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ) << QgsExpressionFunction::Parameter( u
"segments"_s,
true, 36 ), fcnMinimalCircle, u
"GeometryGroup"_s )
10453 << std::make_shared<
10454 QgsStaticExpressionFunction >( u
"difference"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry1"_s ) << QgsExpressionFunction::Parameter( u
"geometry2"_s ), fcnDifference, u
"GeometryGroup"_s )
10455 << std::make_shared<
10456 QgsStaticExpressionFunction >( u
"distance"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry1"_s ) << QgsExpressionFunction::Parameter( u
"geometry2"_s ), fcnDistance, u
"GeometryGroup"_s )
10457 << std::make_shared< QgsStaticExpressionFunction >(
10458 u
"hausdorff_distance"_s,
10460 << QgsExpressionFunction::Parameter( u
"geometry1"_s )
10461 << QgsExpressionFunction::Parameter( u
"geometry2"_s )
10462 << QgsExpressionFunction::Parameter( u
"densify_fraction"_s,
true ),
10463 fcnHausdorffDistance,
10466 << std::make_shared<
10467 QgsStaticExpressionFunction >( u
"intersection"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry1"_s ) << QgsExpressionFunction::Parameter( u
"geometry2"_s ), fcnIntersection, u
"GeometryGroup"_s )
10468 << std::make_shared< QgsStaticExpressionFunction >(
10469 u
"sym_difference"_s,
10472 u
"GeometryGroup"_s,
10477 QStringList() << u
"symDifference"_s
10479 << std::make_shared<
10480 QgsStaticExpressionFunction >( u
"combine"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry1"_s ) << QgsExpressionFunction::Parameter( u
"geometry2"_s ), fcnCombine, u
"GeometryGroup"_s )
10481 << std::make_shared<
10482 QgsStaticExpressionFunction >( u
"union"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry1"_s ) << QgsExpressionFunction::Parameter( u
"geometry2"_s ), fcnCombine, u
"GeometryGroup"_s )
10483 << std::make_shared< QgsStaticExpressionFunction >(
10487 u
"GeometryGroup"_s,
10492 QStringList() << u
"geomToWKT"_s
10494 << std::make_shared<
10495 QgsStaticExpressionFunction >( u
"geom_to_wkb"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ), fcnGeomToWKB, u
"GeometryGroup"_s, QString(),
false, QSet<QString>(), false )
10496 << std::make_shared<
10497 QgsStaticExpressionFunction >( u
"geometry"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"feature"_s ), fcnGetGeometry, u
"GeometryGroup"_s, QString(),
true )
10498 << std::make_shared< QgsStaticExpressionFunction >(
10500 QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ) << QgsExpressionFunction::Parameter( u
"source_auth_id"_s ) << QgsExpressionFunction::Parameter( u
"dest_auth_id"_s ),
10501 fcnTransformGeometry,
10504 << std::make_shared< QgsStaticExpressionFunction >(
10506 QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ) << QgsExpressionFunction::Parameter( u
"x"_s ) << QgsExpressionFunction::Parameter( u
"y"_s ),
10508 u
"GeometryGroup"_s,
10511 << std::make_shared< QgsStaticExpressionFunction >( u
"is_multipart"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ), fcnGeomIsMultipart, u
"GeometryGroup"_s )
10512 << std::make_shared< QgsStaticExpressionFunction >( u
"z_max"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ), fcnZMax, u
"GeometryGroup"_s )
10513 << std::make_shared< QgsStaticExpressionFunction >( u
"z_min"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ), fcnZMin, u
"GeometryGroup"_s )
10514 << std::make_shared< QgsStaticExpressionFunction >( u
"m_max"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ), fcnMMax, u
"GeometryGroup"_s )
10515 << std::make_shared< QgsStaticExpressionFunction >( u
"m_min"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ), fcnMMin, u
"GeometryGroup"_s )
10516 << std::make_shared< QgsStaticExpressionFunction >( u
"sinuosity"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ), fcnSinuosity, u
"GeometryGroup"_s )
10517 << std::make_shared<
10518 QgsStaticExpressionFunction >( u
"straight_distance_2d"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ), fcnStraightDistance2d, u
"GeometryGroup"_s );
10521 auto orderPartsFunc = std::make_shared< QgsStaticExpressionFunction >(
10524 << QgsExpressionFunction::Parameter( u
"geometry"_s )
10525 << QgsExpressionFunction::Parameter( u
"orderby"_s )
10526 << QgsExpressionFunction::Parameter( u
"ascending"_s,
true,
true ),
10528 u
"GeometryGroup"_s,
10533 const QList< QgsExpressionNode *> argList = node->
args()->
list();
10534 for ( QgsExpressionNode *argNode : argList )
10536 if ( !argNode->isStatic( parent, context ) )
10542 QgsExpressionNode *argNode = node->
args()->
at( 1 );
10544 QString expString = argNode->
eval( parent, context ).toString();
10548 if ( e.rootNode() && e.rootNode()->isStatic( parent, context ) )
10558 QgsExpressionNode *argNode = node->
args()->
at( 1 );
10559 QString
expression = argNode->
eval( parent, context ).toString();
10561 e.prepare( context );
10566 functions << orderPartsFunc;
10569 << std::make_shared<
10570 QgsStaticExpressionFunction >( u
"closest_point"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry1"_s ) << QgsExpressionFunction::Parameter( u
"geometry2"_s ), fcnClosestPoint, u
"GeometryGroup"_s )
10571 << std::make_shared<
10572 QgsStaticExpressionFunction >( u
"shortest_line"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry1"_s ) << QgsExpressionFunction::Parameter( u
"geometry2"_s ), fcnShortestLine, u
"GeometryGroup"_s )
10573 << std::make_shared<
10574 QgsStaticExpressionFunction >( u
"line_interpolate_point"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ) << QgsExpressionFunction::Parameter( u
"distance"_s ), fcnLineInterpolatePoint, u
"GeometryGroup"_s )
10575 << std::make_shared< QgsStaticExpressionFunction >(
10576 u
"line_interpolate_point_by_m"_s,
10578 << QgsExpressionFunction::Parameter( u
"geometry"_s )
10579 << QgsExpressionFunction::Parameter( u
"m"_s )
10580 << QgsExpressionFunction::Parameter( u
"use_3d_distance"_s,
true,
false ),
10581 fcnLineInterpolatePointByM,
10584 << std::make_shared<
10585 QgsStaticExpressionFunction >( u
"line_interpolate_angle"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ) << QgsExpressionFunction::Parameter( u
"distance"_s ), fcnLineInterpolateAngle, u
"GeometryGroup"_s )
10586 << std::make_shared<
10587 QgsStaticExpressionFunction >( u
"line_locate_point"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ) << QgsExpressionFunction::Parameter( u
"point"_s ), fcnLineLocatePoint, u
"GeometryGroup"_s )
10588 << std::make_shared< QgsStaticExpressionFunction >(
10589 u
"line_locate_m"_s,
10591 << QgsExpressionFunction::Parameter( u
"geometry"_s )
10592 << QgsExpressionFunction::Parameter( u
"m"_s )
10593 << QgsExpressionFunction::Parameter( u
"use_3d_distance"_s,
true,
false ),
10597 << std::make_shared<
10598 QgsStaticExpressionFunction >( u
"angle_at_vertex"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ) << QgsExpressionFunction::Parameter( u
"vertex"_s ), fcnAngleAtVertex, u
"GeometryGroup"_s )
10599 << std::make_shared<
10600 QgsStaticExpressionFunction >( u
"distance_to_vertex"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ) << QgsExpressionFunction::Parameter( u
"vertex"_s ), fcnDistanceToVertex, u
"GeometryGroup"_s )
10601 << std::make_shared< QgsStaticExpressionFunction >(
10602 u
"line_substring"_s,
10603 QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometry"_s ) << QgsExpressionFunction::Parameter( u
"start_distance"_s ) << QgsExpressionFunction::Parameter( u
"end_distance"_s ),
10611 auto idFunc = std::make_shared< QgsStaticExpressionFunction >( u
"$id"_s, 0, fcnFeatureId, u
"Record and Attributes"_s );
10612 idFunc->setIsStatic(
false );
10613 functions << idFunc;
10615 auto currentFeatureFunc = std::make_shared< QgsStaticExpressionFunction >( u
"$currentfeature"_s, 0, fcnFeature, u
"Record and Attributes"_s );
10616 currentFeatureFunc->setIsStatic(
false );
10617 functions << currentFeatureFunc;
10619 auto uuidFunc = std::make_shared< QgsStaticExpressionFunction >(
10623 u
"Record and Attributes"_s,
10628 QStringList() << u
"$uuid"_s
10630 uuidFunc->setIsStatic(
false );
10631 functions << uuidFunc;
10634 << std::make_shared<
10635 QgsStaticExpressionFunction >( u
"feature_id"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"feature"_s ), fcnGetFeatureId, u
"Record and Attributes"_s, QString(), true )
10636 << std::make_shared< QgsStaticExpressionFunction >(
10638 QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"layer"_s ) << QgsExpressionFunction::Parameter( u
"attribute"_s ) << QgsExpressionFunction::Parameter( u
"value"_s,
true ),
10640 u
"Record and Attributes"_s,
10645 QStringList() << u
"QgsExpressionUtils::getFeature"_s
10647 << std::make_shared< QgsStaticExpressionFunction >(
10648 u
"get_feature_by_id"_s,
10651 u
"Record and Attributes"_s,
10658 auto attributesFunc = std::make_shared< QgsStaticExpressionFunction >(
10662 u
"Record and Attributes"_s,
10667 attributesFunc->setIsStatic(
false );
10668 functions << attributesFunc;
10669 auto representAttributesFunc = std::make_shared<
10670 QgsStaticExpressionFunction >( u
"represent_attributes"_s, -1, fcnRepresentAttributes, u
"Record and Attributes"_s, QString(),
false, QSet<QString>() <<
QgsFeatureRequest::ALL_ATTRIBUTES );
10671 representAttributesFunc->setIsStatic(
false );
10672 functions << representAttributesFunc;
10674 auto validateFeature = std::make_shared< QgsStaticExpressionFunction >(
10675 u
"is_feature_valid"_s,
10677 << QgsExpressionFunction::Parameter( u
"layer"_s,
true )
10678 << QgsExpressionFunction::Parameter( u
"feature"_s,
true )
10679 << QgsExpressionFunction::Parameter( u
"strength"_s,
true ),
10680 fcnValidateFeature,
10681 u
"Record and Attributes"_s,
10686 validateFeature->setIsStatic(
false );
10687 functions << validateFeature;
10689 auto validateAttribute = std::make_shared< QgsStaticExpressionFunction >(
10690 u
"is_attribute_valid"_s,
10692 << QgsExpressionFunction::Parameter( u
"attribute"_s,
false )
10694 << QgsExpressionFunction::Parameter( u
"layer"_s,
true )
10695 << QgsExpressionFunction::Parameter( u
"feature"_s,
true )
10696 << QgsExpressionFunction::Parameter( u
"strength"_s,
true ),
10697 fcnValidateAttribute,
10698 u
"Record and Attributes"_s,
10703 validateAttribute->setIsStatic(
false );
10704 functions << validateAttribute;
10706 auto maptipFunc = std::make_shared< QgsStaticExpressionFunction >( u
"maptip"_s, -1, fcnFeatureMaptip, u
"Record and Attributes"_s, QString(),
false, QSet<QString>() );
10707 maptipFunc->setIsStatic(
false );
10708 functions << maptipFunc;
10710 auto displayFunc = std::make_shared< QgsStaticExpressionFunction >( u
"display_expression"_s, -1, fcnFeatureDisplayExpression, u
"Record and Attributes"_s, QString(),
false, QSet<QString>() );
10711 displayFunc->setIsStatic(
false );
10712 functions << displayFunc;
10714 auto isSelectedFunc = std::make_shared< QgsStaticExpressionFunction >( u
"is_selected"_s, -1, fcnIsSelected, u
"Record and Attributes"_s, QString(),
false, QSet<QString>() );
10715 isSelectedFunc->setIsStatic(
false );
10716 functions << isSelectedFunc;
10718 functions << std::make_shared< QgsStaticExpressionFunction >( u
"num_selected"_s, -1, fcnNumSelected, u
"Record and Attributes"_s, QString(),
false, QSet<QString>() );
10720 functions << std::make_shared< QgsStaticExpressionFunction >(
10721 u
"sqlite_fetch_and_increment"_s,
10723 << QgsExpressionFunction::Parameter( u
"database"_s )
10724 << QgsExpressionFunction::Parameter( u
"table"_s )
10725 << QgsExpressionFunction::Parameter( u
"id_field"_s )
10726 << QgsExpressionFunction::Parameter( u
"filter_attribute"_s )
10727 << QgsExpressionFunction::Parameter( u
"filter_value"_s )
10728 << QgsExpressionFunction::Parameter( u
"default_values"_s,
true ),
10729 fcnSqliteFetchAndIncrement,
10730 u
"Record and Attributes"_s
10735 << std::make_shared< QgsStaticExpressionFunction >( u
"crs_to_authid"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"crs"_s ), fcnCrsToAuthid, u
"CRS"_s, QString(),
true )
10736 << std::make_shared< QgsStaticExpressionFunction >( u
"crs_from_text"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"definition"_s ), fcnCrsFromText, u
"CRS"_s );
10740 auto representValueFunc = std::make_shared<
10741 QgsStaticExpressionFunction >( u
"represent_value"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"attribute"_s ) << QgsExpressionFunction::Parameter( u
"field_name"_s,
true ), fcnRepresentValue, u
"Record and Attributes"_s );
10744 Q_UNUSED( context )
10747 QgsExpressionNodeColumnRef *colRef =
dynamic_cast<QgsExpressionNodeColumnRef *
>( node->
args()->at( 0 ) );
10754 parent->
setEvalErrorString( tr(
"If represent_value is called with 1 parameter, it must be an attribute." ) );
10764 parent->
setEvalErrorString( tr(
"represent_value must be called with exactly 1 or 2 parameters." ) );
10769 functions << representValueFunc;
10773 << std::make_shared< QgsStaticExpressionFunction >(
10774 u
"layer_property"_s,
10776 << QgsExpressionFunction::Parameter( u
"layer"_s )
10777 << QgsExpressionFunction::Parameter( u
"property"_s )
10778 << QgsExpressionFunction::Parameter( u
"translate"_s,
true,
true ),
10779 fcnGetLayerProperty,
10782 << std::make_shared<
10783 QgsStaticExpressionFunction >( u
"decode_uri"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"layer"_s ) << QgsExpressionFunction::Parameter( u
"part"_s,
true ), fcnDecodeUri, u
"Map Layers"_s )
10784 << std::make_shared< QgsStaticExpressionFunction >( u
"mime_type"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"binary_data"_s ), fcnMimeType, u
"General"_s )
10785 << std::make_shared< QgsStaticExpressionFunction >(
10786 u
"raster_statistic"_s,
10787 QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"layer"_s ) << QgsExpressionFunction::Parameter( u
"band"_s ) << QgsExpressionFunction::Parameter( u
"statistic"_s ),
10788 fcnGetRasterBandStat,
10793 auto varFunction = std::make_shared< QgsStaticExpressionFunction >( u
"var"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"name"_s ), fcnGetVariable, u
"General"_s );
10802 QgsExpressionNode *argNode = node->
args()->
at( 0 );
10804 if ( !argNode->
isStatic( parent, context ) )
10807 const QString varName = argNode->
eval( parent, context ).toString();
10808 if ( varName ==
"feature"_L1 || varName ==
"id"_L1 || varName ==
"geometry"_L1 )
10812 return scope ? scope->
isStatic( varName ) :
false;
10817 if ( node && node->
args()->
count() > 0 )
10819 QgsExpressionNode *argNode = node->
args()->
at( 0 );
10820 if ( QgsExpressionNodeLiteral *literal =
dynamic_cast<QgsExpressionNodeLiteral *
>( argNode ) )
10822 if ( literal->value() ==
"geometry"_L1 || literal->value() ==
"feature"_L1 )
10829 functions << varFunction;
10831 auto evalTemplateFunction = std::make_shared<
10836 QgsExpressionNode *argNode = node->
args()->
at( 0 );
10838 if ( argNode->
isStatic( parent, context ) )
10840 QString expString = argNode->
eval( parent, context ).toString();
10844 if ( e.rootNode() && e.rootNode()->isStatic( parent, context ) )
10851 functions << evalTemplateFunction;
10853 auto evalFunc = std::make_shared<
10858 QgsExpressionNode *argNode = node->
args()->
at( 0 );
10860 if ( argNode->
isStatic( parent, context ) )
10862 QString expString = argNode->
eval( parent, context ).toString();
10866 if ( e.rootNode() && e.rootNode()->isStatic( parent, context ) )
10874 functions << evalFunc;
10877 = std::make_shared< QgsStaticExpressionFunction >( u
"attribute"_s, -1, fcnAttribute, u
"Record and Attributes"_s, QString(),
false, QSet<QString>() <<
QgsFeatureRequest::ALL_ATTRIBUTES );
10879 const QList< QgsExpressionNode *> argList = node->
args()->
list();
10880 for ( QgsExpressionNode *argNode : argList )
10882 if ( !argNode->
isStatic( parent, context ) )
10894 functions << attributeFunc;
10897 << std::make_shared< QgsStaticExpressionFunction >( u
"env"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"name"_s ), fcnEnvVar, u
"General"_s, QString() )
10898 << std::make_shared< QgsWithVariableExpressionFunction >()
10899 << std::make_shared< QgsStaticExpressionFunction >(
10901 QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"layer"_s ) << QgsExpressionFunction::Parameter( u
"band"_s ) << QgsExpressionFunction::Parameter( u
"point"_s ),
10905 << std::make_shared< QgsStaticExpressionFunction >(
10906 u
"raster_attributes"_s,
10907 QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"layer"_s ) << QgsExpressionFunction::Parameter( u
"band"_s ) << QgsExpressionFunction::Parameter( u
"point"_s ),
10908 fcnRasterAttributes,
10913 << std::make_shared< QgsArrayForeachExpressionFunction >()
10914 << std::make_shared< QgsArrayFilterExpressionFunction >()
10915 << std::make_shared< QgsStaticExpressionFunction >( u
"array"_s, -1, fcnArray, u
"Arrays"_s, QString(),
false, QSet<QString>(),
false, QStringList(),
true )
10916 << std::make_shared<
10917 QgsStaticExpressionFunction >( u
"array_sort"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"array"_s ) << QgsExpressionFunction::Parameter( u
"ascending"_s,
true,
true ), fcnArraySort, u
"Arrays"_s )
10918 << std::make_shared< QgsStaticExpressionFunction >( u
"array_length"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"array"_s ), fcnArrayLength, u
"Arrays"_s )
10919 << std::make_shared<
10920 QgsStaticExpressionFunction >( u
"array_contains"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"array"_s ) << QgsExpressionFunction::Parameter( u
"value"_s ), fcnArrayContains, u
"Arrays"_s )
10921 << std::make_shared<
10922 QgsStaticExpressionFunction >( u
"array_count"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"array"_s ) << QgsExpressionFunction::Parameter( u
"value"_s ), fcnArrayCount, u
"Arrays"_s )
10923 << std::make_shared<
10924 QgsStaticExpressionFunction >( u
"array_all"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"array1"_s ) << QgsExpressionFunction::Parameter( u
"array2"_s ), fcnArrayAll, u
"Arrays"_s )
10925 << std::make_shared<
10926 QgsStaticExpressionFunction >( u
"array_find"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"array"_s ) << QgsExpressionFunction::Parameter( u
"value"_s ), fcnArrayFind, u
"Arrays"_s )
10927 << std::make_shared<
10928 QgsStaticExpressionFunction >( u
"array_get"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"array"_s ) << QgsExpressionFunction::Parameter( u
"pos"_s ), fcnArrayGet, u
"Arrays"_s )
10929 << std::make_shared< QgsStaticExpressionFunction >( u
"array_first"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"array"_s ), fcnArrayFirst, u
"Arrays"_s )
10930 << std::make_shared< QgsStaticExpressionFunction >( u
"array_last"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"array"_s ), fcnArrayLast, u
"Arrays"_s )
10931 << std::make_shared< QgsStaticExpressionFunction >( u
"array_min"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"array"_s ), fcnArrayMinimum, u
"Arrays"_s )
10932 << std::make_shared< QgsStaticExpressionFunction >( u
"array_max"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"array"_s ), fcnArrayMaximum, u
"Arrays"_s )
10933 << std::make_shared< QgsStaticExpressionFunction >( u
"array_mean"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"array"_s ), fcnArrayMean, u
"Arrays"_s )
10934 << std::make_shared< QgsStaticExpressionFunction >( u
"array_median"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"array"_s ), fcnArrayMedian, u
"Arrays"_s )
10935 << std::make_shared<
10936 QgsStaticExpressionFunction >( u
"array_majority"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"array"_s ) << QgsExpressionFunction::Parameter( u
"option"_s,
true, QVariant(
"all" ) ), fcnArrayMajority, u
"Arrays"_s )
10937 << std::make_shared<
10938 QgsStaticExpressionFunction >( u
"array_minority"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"array"_s ) << QgsExpressionFunction::Parameter( u
"option"_s,
true, QVariant(
"all" ) ), fcnArrayMinority, u
"Arrays"_s )
10939 << std::make_shared< QgsStaticExpressionFunction >( u
"array_sum"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"array"_s ), fcnArraySum, u
"Arrays"_s )
10940 << std::make_shared<
10941 QgsStaticExpressionFunction >( u
"array_append"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"array"_s ) << QgsExpressionFunction::Parameter( u
"value"_s ), fcnArrayAppend, u
"Arrays"_s )
10942 << std::make_shared<
10943 QgsStaticExpressionFunction >( u
"array_prepend"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"array"_s ) << QgsExpressionFunction::Parameter( u
"value"_s ), fcnArrayPrepend, u
"Arrays"_s )
10944 << std::make_shared< QgsStaticExpressionFunction >(
10946 QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"array"_s ) << QgsExpressionFunction::Parameter( u
"pos"_s ) << QgsExpressionFunction::Parameter( u
"value"_s ),
10950 << std::make_shared<
10951 QgsStaticExpressionFunction >( u
"array_remove_at"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"array"_s ) << QgsExpressionFunction::Parameter( u
"pos"_s ), fcnArrayRemoveAt, u
"Arrays"_s )
10952 << std::make_shared< QgsStaticExpressionFunction >(
10953 u
"array_remove_all"_s,
10964 << std::make_shared< QgsStaticExpressionFunction >( u
"array_replace"_s, -1, fcnArrayReplace, u
"Arrays"_s )
10965 << std::make_shared<
10966 QgsStaticExpressionFunction >( u
"array_prioritize"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"array"_s ) << QgsExpressionFunction::Parameter( u
"priority"_s ), fcnArrayPrioritize, u
"Arrays"_s )
10967 << std::make_shared< QgsStaticExpressionFunction >( u
"array_cat"_s, -1, fcnArrayCat, u
"Arrays"_s )
10968 << std::make_shared< QgsStaticExpressionFunction >(
10970 QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"array"_s ) << QgsExpressionFunction::Parameter( u
"start_pos"_s ) << QgsExpressionFunction::Parameter( u
"end_pos"_s ),
10974 << std::make_shared< QgsStaticExpressionFunction >( u
"array_reverse"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"array"_s ), fcnArrayReverse, u
"Arrays"_s )
10975 << std::make_shared<
10976 QgsStaticExpressionFunction >( u
"array_intersect"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"array1"_s ) << QgsExpressionFunction::Parameter( u
"array2"_s ), fcnArrayIntersect, u
"Arrays"_s )
10977 << std::make_shared< QgsStaticExpressionFunction >( u
"array_distinct"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"array"_s ), fcnArrayDistinct, u
"Arrays"_s )
10978 << std::make_shared< QgsStaticExpressionFunction >(
10979 u
"array_to_string"_s,
10981 << QgsExpressionFunction::Parameter( u
"array"_s )
10982 << QgsExpressionFunction::Parameter( u
"delimiter"_s,
true,
"," )
10983 << QgsExpressionFunction::Parameter( u
"emptyvalue"_s,
true,
"" ),
10987 << std::make_shared< QgsStaticExpressionFunction >(
10988 u
"string_to_array"_s,
10990 << QgsExpressionFunction::Parameter( u
"string"_s )
10991 << QgsExpressionFunction::Parameter( u
"delimiter"_s,
true,
"," )
10992 << QgsExpressionFunction::Parameter( u
"emptyvalue"_s,
true,
"" ),
10996 << std::make_shared< QgsStaticExpressionFunction >(
10997 u
"generate_series"_s,
10998 QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"start"_s ) << QgsExpressionFunction::Parameter( u
"stop"_s ) << QgsExpressionFunction::Parameter( u
"step"_s,
true, 1.0 ),
11002 << std::make_shared<
11003 QgsStaticExpressionFunction >( u
"geometries_to_array"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"geometries"_s ), fcnGeometryCollectionAsArray, u
"Arrays"_s )
11006 << std::make_shared<
11007 QgsStaticExpressionFunction >( u
"from_json"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"value"_s ), fcnLoadJson, u
"Maps"_s, QString(),
false, QSet<QString>(),
false, QStringList() << u
"json_to_map"_s )
11008 << std::make_shared<
11009 QgsStaticExpressionFunction >( u
"to_json"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"json_string"_s ), fcnWriteJson, u
"Maps"_s, QString(),
false, QSet<QString>(),
false, QStringList() << u
"map_to_json"_s )
11010 << std::make_shared< QgsStaticExpressionFunction >( u
"hstore_to_map"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"string"_s ), fcnHstoreToMap, u
"Maps"_s )
11011 << std::make_shared< QgsStaticExpressionFunction >( u
"map_to_hstore"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"map"_s ), fcnMapToHstore, u
"Maps"_s )
11012 << std::make_shared< QgsStaticExpressionFunction >( u
"map"_s, -1, fcnMap, u
"Maps"_s )
11013 << std::make_shared<
11014 QgsStaticExpressionFunction >( u
"map_get"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"map"_s ) << QgsExpressionFunction::Parameter( u
"key"_s ), fcnMapGet, u
"Maps"_s )
11015 << std::make_shared<
11016 QgsStaticExpressionFunction >( u
"map_exist"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"map"_s ) << QgsExpressionFunction::Parameter( u
"key"_s ), fcnMapExist, u
"Maps"_s )
11017 << std::make_shared<
11018 QgsStaticExpressionFunction >( u
"map_delete"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"map"_s ) << QgsExpressionFunction::Parameter( u
"key"_s ), fcnMapDelete, u
"Maps"_s )
11019 << std::make_shared<
11020 QgsStaticExpressionFunction >( u
"map_insert"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"map"_s ) << QgsExpressionFunction::Parameter( u
"key"_s ) << QgsExpressionFunction::Parameter( u
"value"_s ), fcnMapInsert, u
"Maps"_s )
11021 << std::make_shared< QgsStaticExpressionFunction >( u
"map_concat"_s, -1, fcnMapConcat, u
"Maps"_s )
11022 << std::make_shared< QgsStaticExpressionFunction >( u
"map_akeys"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"map"_s ), fcnMapAKeys, u
"Maps"_s )
11023 << std::make_shared< QgsStaticExpressionFunction >( u
"map_avals"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"map"_s ), fcnMapAVals, u
"Maps"_s )
11024 << std::make_shared<
11025 QgsStaticExpressionFunction >( u
"map_prefix_keys"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"map"_s ) << QgsExpressionFunction::Parameter( u
"prefix"_s ), fcnMapPrefixKeys, u
"Maps"_s )
11026 << std::make_shared< QgsStaticExpressionFunction >( u
"map_to_html_table"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"map"_s ), fcnMapToHtmlTable, u
"Maps"_s )
11027 << std::make_shared< QgsStaticExpressionFunction >( u
"map_to_html_dl"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"map"_s ), fcnMapToHtmlDefinitionList, u
"Maps"_s )
11028 << std::make_shared< QgsStaticExpressionFunction >( u
"url_encode"_s,
QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( u
"map"_s ), fcnToFormUrlEncode, u
"Maps"_s )
11036 sBuiltinFunctionNames << function->name();
11037 sBuiltinFunctionNames.append( function->aliases() );
11040 functions.updateFunctionNameMap();
11042 sFunctions.store( std::make_shared<SharedFunctionPtrList>( functions ), std::memory_order_release );
11045 return sFunctions.load( std::memory_order_acquire );
11050 QMutexLocker lock( &sFunctionWriteMutex );
11053 if ( currentFunctions->functionIndex( function->
name() ) != -1 )
11059 auto newSnapshot = std::make_shared<SharedFunctionPtrList>( *currentFunctions );
11061 if ( transferOwnership )
11064 newSnapshot->append( functionPtr );
11068 SharedFunctionPtr unownedFunctionPtr( function, [](
const QgsExpressionFunction * ) {
11073 newSnapshot->append( unownedFunctionPtr );
11076 newSnapshot->updateFunctionNameMap();
11080 sFunctions.store( newSnapshot, std::memory_order_release );
11092 QMutexLocker lock( &sFunctionWriteMutex );
11095 auto newSnapshot = std::make_shared<SharedFunctionPtrList>();
11099 if ( function->
name() != name )
11101 newSnapshot->append( function );
11104 newSnapshot->updateFunctionNameMap();
11108 sFunctions.store( newSnapshot, std::memory_order_release );
11114 QMutexLocker lock( &sFunctionWriteMutex );
11116 sBuiltinFunctionNames.clear();
11124 sFunctions.store( std::make_shared<SharedFunctionPtrList>(), std::memory_order_release );
11131 return sBuiltinFunctionNames;
11136 u
"array_foreach"_s,
11146 QgsExpressionNode::NodeList *args = node->
args();
11148 if ( args->
count() < 2 )
11151 if ( args->
at( 0 )->
isStatic( parent, context ) && args->
at( 1 )->
isStatic( parent, context ) )
11161 QVariantList result;
11163 if ( args->
count() < 2 )
11167 QVariantList array = args->
at( 0 )->
eval( parent, context ).toList();
11169 QgsExpressionContext *subContext =
const_cast<QgsExpressionContext *
>( context );
11170 std::unique_ptr< QgsExpressionContext > tempContext;
11173 tempContext = std::make_unique< QgsExpressionContext >();
11174 subContext = tempContext.get();
11177 QgsExpressionContextScope *subScope =
new QgsExpressionContextScope();
11181 for ( QVariantList::const_iterator it = array.constBegin(); it != array.constEnd(); ++it, ++i )
11185 result << args->
at( 1 )->
eval( parent, subContext );
11198 Q_UNUSED( context )
11210 if ( args->
count() < 2 )
11214 args->
at( 0 )->
prepare( parent, context );
11218 subContext = *context;
11225 args->
at( 1 )->
prepare( parent, &subContext );
11238 QgsExpressionNode::NodeList *args = node->
args();
11240 if ( args->
count() < 2 )
11243 if ( args->
at( 0 )->
isStatic( parent, context ) && args->
at( 1 )->
isStatic( parent, context ) )
11253 QVariantList result;
11255 if ( args->
count() < 2 )
11259 const QVariantList array = args->
at( 0 )->
eval( parent, context ).toList();
11261 QgsExpressionContext *subContext =
const_cast<QgsExpressionContext *
>( context );
11262 std::unique_ptr< QgsExpressionContext > tempContext;
11265 tempContext = std::make_unique< QgsExpressionContext >();
11266 subContext = tempContext.get();
11269 QgsExpressionContextScope *subScope =
new QgsExpressionContextScope();
11273 if ( args->
count() >= 3 )
11275 const QVariant limitVar = args->
at( 2 )->
eval( parent, context );
11277 if ( QgsExpressionUtils::isIntSafe( limitVar ) )
11279 limit = limitVar.toInt();
11287 for (
const QVariant &value : array )
11289 subScope->
addVariable( QgsExpressionContextScope::StaticVariable( u
"element"_s, value,
true ) );
11290 if ( args->
at( 1 )->
eval( parent, subContext ).toBool() )
11294 if ( limit > 0 && limit == result.size() )
11309 Q_UNUSED( context )
11321 if ( args->
count() < 2 )
11325 args->
at( 0 )->
prepare( parent, context );
11329 subContext = *context;
11335 args->
at( 1 )->
prepare( parent, &subContext );
11347 QgsExpressionNode::NodeList *args = node->
args();
11349 if ( args->
count() < 3 )
11353 if ( args->
at( 0 )->
isStatic( parent, context ) && args->
at( 1 )->
isStatic( parent, context ) )
11355 QVariant
name = args->
at( 0 )->
eval( parent, context );
11356 QVariant value = args->
at( 1 )->
eval( parent, context );
11359 appendTemporaryVariable( context,
name.toString(), value );
11360 if ( args->
at( 2 )->
isStatic( parent, context ) )
11362 popTemporaryVariable( context );
11373 if ( args->
count() < 3 )
11377 QVariant
name = args->
at( 0 )->
eval( parent, context );
11378 QVariant value = args->
at( 1 )->
eval( parent, context );
11380 const QgsExpressionContext *updatedContext = context;
11381 std::unique_ptr< QgsExpressionContext > tempContext;
11382 if ( !updatedContext )
11384 tempContext = std::make_unique< QgsExpressionContext >();
11385 updatedContext = tempContext.get();
11388 appendTemporaryVariable( updatedContext,
name.toString(), value );
11389 result = args->
at( 2 )->
eval( parent, updatedContext );
11392 popTemporaryVariable( updatedContext );
11401 Q_UNUSED( context )
11413 if ( args->
count() < 3 )
11418 QVariant value = args->
at( 1 )->
prepare( parent, context );
11421 std::unique_ptr< QgsExpressionContext > tempContext;
11422 if ( !updatedContext )
11424 tempContext = std::make_unique< QgsExpressionContext >();
11425 updatedContext = tempContext.get();
11428 appendTemporaryVariable( updatedContext,
name.toString(), value );
11429 args->
at( 2 )->
prepare( parent, updatedContext );
11432 popTemporaryVariable( updatedContext );
11437void QgsWithVariableExpressionFunction::popTemporaryVariable(
const QgsExpressionContext *context )
const
11439 QgsExpressionContext *updatedContext =
const_cast<QgsExpressionContext *
>( context );
11440 delete updatedContext->
popScope();
11443void QgsWithVariableExpressionFunction::appendTemporaryVariable(
const QgsExpressionContext *context,
const QString &name,
const QVariant &value )
const
11445 QgsExpressionContextScope *scope =
new QgsExpressionContextScope();
11446 scope->
addVariable( QgsExpressionContextScope::StaticVariable(
name, value,
true ) );
11448 QgsExpressionContext *updatedContext =
const_cast<QgsExpressionContext *
>( context );
GeometryBackend
Geometry backend for QgsGeometry.
@ GEOS
Use GEOS implementation.
@ QGIS
Use internal implementation.
@ Left
Buffer to left of line.
DashPatternSizeAdjustment
Dash pattern size adjustment options.
@ ScaleDashOnly
Only dash lengths are adjusted.
@ ScaleBothDashAndGap
Both the dash and gap lengths are adjusted equally.
@ ScaleGapOnly
Only gap lengths are adjusted.
@ Success
Operation succeeded.
@ Visvalingam
The simplification gives each point in a line an importance weighting, so that least important points...
@ NoGeometry
Geometry is not required. It may still be returned if e.g. required for a filter condition.
JoinStyle
Join styles for buffers.
@ Bevel
Use beveled joins.
@ Round
Use rounded joins.
@ Miter
Use mitered joins.
RasterBandStatistic
Available raster band statistics.
@ StdDev
Standard deviation.
@ NoStatistic
No statistic.
@ Group
Composite group layer. Added in QGIS 3.24.
@ Plugin
Plugin based layer.
@ TiledScene
Tiled scene layer. Added in QGIS 3.34.
@ Annotation
Contains freeform, georeferenced annotations. Added in QGIS 3.16.
@ VectorTile
Vector tile layer. Added in QGIS 3.14.
@ Mesh
Mesh layer. Added in QGIS 3.2.
@ PointCloud
Point cloud layer. Added in QGIS 3.18.
EndCapStyle
End cap styles for buffers.
@ Flat
Flat cap (in line with start/end of line).
@ Square
Square cap (extends past start/end of line by buffer distance).
Aggregate
Available aggregates to calculate.
@ StringMinimumLength
Minimum length of string (string fields only).
@ FirstQuartile
First quartile (numeric fields only).
@ Mean
Mean of values (numeric fields only).
@ Median
Median of values (numeric fields only).
@ StringMaximumLength
Maximum length of string (string fields only).
@ Range
Range of values (max - min) (numeric and datetime fields only).
@ StringConcatenateUnique
Concatenate unique values with a joining string (string fields only). Specify the delimiter using set...
@ Minority
Minority of values.
@ CountMissing
Number of missing (null) values.
@ ArrayAggregate
Create an array of values.
@ Majority
Majority of values.
@ StDevSample
Sample standard deviation of values (numeric fields only).
@ ThirdQuartile
Third quartile (numeric fields only).
@ CountDistinct
Number of distinct values.
@ StringConcatenate
Concatenate values with a joining string (string fields only). Specify the delimiter using setDelimit...
@ GeometryCollect
Create a multipart geometry from aggregated geometries.
@ InterQuartileRange
Inter quartile range (IQR) (numeric fields only).
DashPatternLineEndingRule
Dash pattern line ending rules.
@ HalfDash
Start or finish the pattern with a half length dash.
@ HalfGap
Start or finish the pattern with a half length gap.
@ FullGap
Start or finish the pattern with a full gap.
@ FullDash
Start or finish the pattern with a full dash.
MakeValidMethod
Algorithms to use when repairing invalid geometries.
@ Linework
Combines all rings into a set of noded lines and then extracts valid polygons from that linework.
@ Structure
Structured method, first makes all rings valid and then merges shells and subtracts holes from shells...
@ GeometryCollection
GeometryCollection.
Abstract base class for all geometries.
virtual bool addZValue(double zValue=0)=0
Adds a z-dimension to the geometry, initialized to a preset value.
virtual QgsAbstractGeometry * boundary() const =0
Returns the closure of the combinatorial boundary of the geometry (ie the topological boundary of the...
virtual const QgsAbstractGeometry * simplifiedTypeRef() const
Returns a reference to the simplest lossless representation of this geometry, e.g.
bool isMeasure() const
Returns true if the geometry contains m values.
virtual QgsRectangle boundingBox() const
Returns the minimal bounding box for the geometry.
bool is3D() const
Returns true if the geometry is 3D and contains a z-value.
virtual int nCoordinates() const
Returns the number of nodes contained in the geometry.
virtual QgsPoint vertexAt(QgsVertexId id) const =0
Returns the point corresponding to a specified vertex id.
virtual bool addMValue(double mValue=0)=0
Adds a measure to the geometry, initialized to a preset value.
Qgis::WkbType wkbType() const
Returns the WKB type of the geometry.
virtual double length() const
Returns the planar, 2-dimensional length of the geometry.
virtual QgsCoordinateSequence coordinateSequence() const =0
Retrieves the sequence of geometries, rings and nodes.
virtual int partCount() const =0
Returns count of parts contained in the geometry.
virtual QgsAbstractGeometry * clone() const =0
Clones the geometry by performing a deep copy.
static Qgis::Aggregate stringToAggregate(const QString &string, bool *ok=nullptr)
Converts a string to a aggregate type.
static QgsFieldFormatterRegistry * fieldFormatterRegistry()
Gets the registry of available field formatters.
QVariant func(const QVariantList &values, const QgsExpressionContext *context, QgsExpression *parent, const QgsExpressionNodeFunction *node) override
Returns result of evaluating the function.
bool prepare(const QgsExpressionNodeFunction *node, QgsExpression *parent, const QgsExpressionContext *context) const override
This will be called during the prepare step() of an expression if it is not static.
bool isStatic(const QgsExpressionNodeFunction *node, QgsExpression *parent, const QgsExpressionContext *context) const override
Will be called during prepare to determine if the function is static.
QVariant run(QgsExpressionNode::NodeList *args, const QgsExpressionContext *context, QgsExpression *parent, const QgsExpressionNodeFunction *node) override
Evaluates the function, first evaluating all required arguments before passing them to the function's...
QgsArrayFilterExpressionFunction()
QVariant func(const QVariantList &values, const QgsExpressionContext *context, QgsExpression *parent, const QgsExpressionNodeFunction *node) override
Returns result of evaluating the function.
QgsArrayForeachExpressionFunction()
bool isStatic(const QgsExpressionNodeFunction *node, QgsExpression *parent, const QgsExpressionContext *context) const override
Will be called during prepare to determine if the function is static.
QVariant run(QgsExpressionNode::NodeList *args, const QgsExpressionContext *context, QgsExpression *parent, const QgsExpressionNodeFunction *node) override
Evaluates the function, first evaluating all required arguments before passing them to the function's...
bool prepare(const QgsExpressionNodeFunction *node, QgsExpression *parent, const QgsExpressionContext *context) const override
This will be called during the prepare step() of an expression if it is not static.
Abstract base class for color ramps.
virtual QColor color(double value) const =0
Returns the color corresponding to a specified value.
Represents a coordinate reference system (CRS).
bool isValid() const
Returns whether this CRS is correctly initialized and usable.
QString toProj() const
Returns a Proj string representation of this CRS.
QString ellipsoidAcronym() const
Returns the ellipsoid acronym for the ellipsoid used by the CRS.
Qgis::DistanceUnit mapUnits
Contains information about the context in which a coordinate transform is executed.
Custom exception class for Coordinate Reference System related exceptions.
Curve polygon geometry type.
int numInteriorRings() const
Returns the number of interior rings contained with the curve polygon.
const QgsCurve * exteriorRing() const
Returns the curve polygon's exterior ring.
bool isEmpty() const override
Returns true if the geometry is empty.
const QgsCurve * interiorRing(int i) const
Retrieves an interior ring from the curve polygon.
double area() const override
Returns the planar, 2-dimensional area of the geometry.
double roundness() const
Returns the roundness of the curve polygon.
int ringCount(int part=0) const override
Returns the number of rings of which this geometry is built.
Abstract base class for curved geometry type.
double sinuosity() const
Returns the curve sinuosity, which is the ratio of the curve length() to curve straightDistance2d().
QgsCurve * segmentize(double tolerance=M_PI_2/90, SegmentationToleranceType toleranceType=MaximumAngle) const override
Returns a geometry without curves.
virtual QgsCurve * curveSubstring(double startDistance, double endDistance) const =0
Returns a new curve representing a substring of this curve.
virtual bool isClosed() const
Returns true if the curve is closed.
double straightDistance2d() const
Returns the straight distance of the curve, i.e.
virtual QgsCurve * reversed() const =0
Returns a reversed copy of the curve, where the direction of the curve has been flipped.
virtual QString dataSourceUri(bool expandAuthConfig=false) const
Gets the data source specification.
A general purpose distance and area calculator, capable of performing ellipsoid based calculations.
double measureArea(const QgsGeometry &geometry) const
Measures the area of a geometry.
double convertLengthMeasurement(double length, Qgis::DistanceUnit toUnits) const
Takes a length measurement calculated by this QgsDistanceArea object and converts it to a different d...
double measurePerimeter(const QgsGeometry &geometry) const
Measures the perimeter of a polygon geometry.
double measureLength(const QgsGeometry &geometry) const
Measures the length of a geometry.
double bearing(const QgsPointXY &p1, const QgsPointXY &p2) const
Computes the bearing (in radians) between two points.
void setSourceCrs(const QgsCoordinateReferenceSystem &crs, const QgsCoordinateTransformContext &context)
Sets source spatial reference system crs.
bool setEllipsoid(const QString &ellipsoid)
Sets the ellipsoid by its acronym.
double convertAreaMeasurement(double area, Qgis::AreaUnit toUnits) const
Takes an area measurement calculated by this QgsDistanceArea object and converts it to a different ar...
Defines a QGIS exception class.
Single scope for storing variables and functions for use within a QgsExpressionContext.
void addVariable(const QgsExpressionContextScope::StaticVariable &variable)
Adds a variable into the context scope.
bool isStatic(const QString &name) const
Tests whether the variable with the specified name is static and can be cached.
void setVariable(const QString &name, const QVariant &value, bool isStatic=false)
Convenience method for setting a variable in the context scope by name name and value.
static void registerContextFunctions(QgsExpression::SharedFunctionPtrList &functions)
Registers all known core functions provided by QgsExpressionContextScope objects.
static QList< QgsExpressionContextScope * > globalProjectLayerScopes(const QgsMapLayer *layer)
Creates a list of three scopes: global, layer's project and layer.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
QgsExpressionContextScope * popScope()
Removes the last scope from the expression context and return it.
void setCachedValue(const QString &key, const QVariant &value) const
Sets a value to cache within the expression context.
QString uniqueHash(bool &ok, const QSet< QString > &variables=QSet< QString >()) const
Returns a unique hash representing the current state of the context.
QgsGeometry geometry() const
Convenience function for retrieving the geometry for the context, if set.
QgsFeature feature() const
Convenience function for retrieving the feature for the context, if set.
QgsExpressionContextScope * activeScopeForVariable(const QString &name)
Returns the currently active scope from the context for a specified variable name.
void appendScope(QgsExpressionContextScope *scope)
Appends a scope to the end of the context.
QgsFeedback * feedback() const
Returns the feedback object that can be queried regularly by the expression to check if evaluation sh...
void setFeature(const QgsFeature &feature)
Convenience function for setting a feature for the context.
bool hasGeometry() const
Returns true if the context has a geometry associated with it.
bool hasCachedValue(const QString &key) const
Returns true if the expression context contains a cached value with a matching key.
QVariant variable(const QString &name) const
Fetches a matching variable from the context.
QVariant cachedValue(const QString &key) const
Returns the matching cached value, if set.
bool hasFeature() const
Returns true if the context has a feature associated with it.
QgsFields fields() const
Convenience function for retrieving the fields for the context, if set.
An abstract base class for defining QgsExpression functions.
QList< QgsExpressionFunction::Parameter > ParameterList
List of parameters, used for function definition.
bool operator==(const QgsExpressionFunction &other) const
QgsExpressionFunction(const QString &fnname, int params, const QString &group, const QString &helpText=QString(), bool lazyEval=false, bool handlesNull=false, bool isContextual=false)
Constructor for function which uses unnamed parameters.
virtual bool isDeprecated() const
Returns true if the function is deprecated and should not be presented as a valid option to users in ...
virtual bool isStatic(const QgsExpressionNodeFunction *node, QgsExpression *parent, const QgsExpressionContext *context) const
Will be called during prepare to determine if the function is static.
virtual QStringList aliases() const
Returns a list of possible aliases for the function.
bool lazyEval() const
true if this function should use lazy evaluation.
static bool allParamsStatic(const QgsExpressionNodeFunction *node, QgsExpression *parent, const QgsExpressionContext *context)
This will return true if all the params for the provided function node are static within the constrai...
QString name() const
The name of the function.
virtual QVariant run(QgsExpressionNode::NodeList *args, const QgsExpressionContext *context, QgsExpression *parent, const QgsExpressionNodeFunction *node)
Evaluates the function, first evaluating all required arguments before passing them to the function's...
virtual QVariant func(const QVariantList &values, const QgsExpressionContext *context, QgsExpression *parent, const QgsExpressionNodeFunction *node)=0
Returns result of evaluating the function.
virtual QSet< QString > referencedColumns(const QgsExpressionNodeFunction *node) const
Returns a set of field names which are required for this function.
virtual bool handlesNull() const
Returns true if the function handles NULL values in arguments by itself, and the default NULL value h...
virtual bool prepare(const QgsExpressionNodeFunction *node, QgsExpression *parent, const QgsExpressionContext *context) const
This will be called during the prepare step() of an expression if it is not static.
const QString helpText() const
The help text for the function.
virtual bool usesGeometry(const QgsExpressionNodeFunction *node) const
Does this function use a geometry object.
An expression node which takes its value from a feature's field.
QString name() const
The name of the column.
An expression node for expression functions.
QgsExpressionNode::NodeList * args() const
Returns a list of arguments specified for the function.
An expression node for literal values.
A list of expression nodes.
QList< QgsExpressionNode * > list()
Gets a list of all the nodes.
QgsExpressionNode * at(int i)
Gets the node at position i in the list.
int count() const
Returns the number of nodes in the list.
Abstract base class for all nodes that can appear in an expression.
virtual QString dump() const =0
Dump this node into a serialized (part) of an expression.
QVariant eval(QgsExpression *parent, const QgsExpressionContext *context)
Evaluate this node with the given context and parent.
virtual bool isStatic(QgsExpression *parent, const QgsExpressionContext *context) const =0
Returns true if this node can be evaluated for a static value.
bool prepare(QgsExpression *parent, const QgsExpressionContext *context)
Prepare this node for evaluation.
virtual QSet< QString > referencedColumns() const =0
Abstract virtual method which returns a list of columns required to evaluate this node.
virtual QSet< QString > referencedVariables() const =0
Returns a set of all variables which are used in this expression.
A set of expression-related functions.
A thread-safe container of shared pointers to registered functions.
Handles parsing and evaluation of expressions (formerly called "search strings").
bool prepare(const QgsExpressionContext *context)
Gets the expression ready for evaluation - find out column indexes.
QString expression() const
Returns the original, unmodified expression string.
static void cleanRegisteredFunctions()
Deletes all registered functions whose ownership have been transferred to the expression engine.
Qgis::DistanceUnit distanceUnits() const
Returns the desired distance units for calculations involving geomCalculator(), e....
static bool registerFunction(QgsExpressionFunction *function, bool transferOwnership=false)
Registers a function to the expression engine.
static QString quotedValue(const QVariant &value)
Returns a string representation of a literal value, including appropriate quotations where required.
QSet< QString > referencedVariables() const
Returns a list of all variables which are used in this expression.
std::shared_ptr< const SharedFunctionPtrList > FunctionListSnapshot
static QString replaceExpressionText(const QString &action, const QgsExpressionContext *context, const QgsDistanceArea *distanceArea=nullptr)
This function replaces each expression between [% and %] in the string with the result of its evaluat...
static const FunctionListSnapshot getFunctionsSnapshot()
Returns a thread-safe snapshot of all registered functions.
static PRIVATE QString helpText(QString name)
Returns the help text for a specified function.
static QString createFieldEqualityExpression(const QString &fieldName, const QVariant &value, QMetaType::Type fieldType=QMetaType::Type::UnknownType)
Create an expression allowing to evaluate if a field is equal to a value.
static bool unregisterFunction(const QString &name)
Unregisters a function from the expression engine.
Qgis::AreaUnit areaUnits() const
Returns the desired areal units for calculations involving geomCalculator(), e.g.,...
void setEvalErrorString(const QString &str)
Sets evaluation error (used internally by evaluation functions).
friend class QgsExpressionNodeFunction
bool hasEvalError() const
Returns true if an error occurred when evaluating last input.
QgsExpression(const QString &expr)
Creates a new expression based on the provided string.
std::shared_ptr< QgsExpressionFunction > SharedFunctionPtr
bool needsGeometry() const
Returns true if the expression uses feature geometry for some computation.
QVariant evaluate()
Evaluate the feature and return the result.
static QStringList BuiltinFunctions()
Returns a list of the names of all built-in functions.
QgsDistanceArea * geomCalculator()
Returns calculator used for distance and area calculations (used by $length, $area and $perimeter fun...
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.
The OrderByClause class represents an order by clause for a QgsFeatureRequest.
Represents a list of OrderByClauses, with the most important first and the least important last.
Wraps a request for features to a vector layer (or directly its vector data provider).
QgsFeatureRequest & setFlags(Qgis::FeatureRequestFlags flags)
Sets flags that affect how features will be fetched.
QgsFeatureRequest & setLimit(long long limit)
Set the maximum number of features to request.
QgsFeatureRequest & setRequestMayBeNested(bool requestMayBeNested)
In case this request may be run nested within another already running iteration on the same connectio...
QgsFeatureRequest & setTimeout(int timeout)
Sets the timeout (in milliseconds) for the maximum time we should wait during feature requests before...
static const QString ALL_ATTRIBUTES
A special attribute that if set matches all attributes.
QgsFeatureRequest & setFilterExpression(const QString &expression)
Set the filter expression.
void setFeedback(QgsFeedback *feedback)
Attach a feedback object that can be queried regularly by the iterator to check if it should be cance...
QgsFeatureRequest & setFilterFid(QgsFeatureId fid)
Sets the feature ID that should be fetched.
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...
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.
ConstraintStrength
Strength of constraints.
@ ConstraintStrengthNotSet
Constraint is not set.
@ ConstraintStrengthSoft
User is warned if constraint is violated but feature can still be accepted.
@ ConstraintStrengthHard
Constraint must be honored before feature can be accepted.
QgsEditorWidgetSetup editorWidgetSetup() const
Gets the editor widget setup for the field.
Container of fields for a vector layer.
Q_INVOKABLE int indexFromName(const QString &fieldName) const
Gets the field index from the field name.
int size() const
Returns number of items.
QgsField at(int i) const
Returns the field at particular index (must be in range 0..N-1).
Q_INVOKABLE int lookupField(const QString &fieldName) const
Looks up field's index from the field name.
virtual bool removeGeometry(int nr)
Removes a geometry from the collection.
QgsGeometryCollection * createEmptyWithSameType() const override
Creates a new geometry with the same class and same WKB type as the original and transfers ownership.
virtual bool addGeometry(QgsAbstractGeometry *g)
Adds a geometry and takes ownership. Returns true in case of success.
int partCount() const override
Returns count of parts contained in the geometry.
int numGeometries() const
Returns the number of geometries within the collection.
const QgsAbstractGeometry * geometryN(int n) const
Returns a const reference to a geometry from within the collection.
Encapsulates parameters under which a geometry operation is performed.
static QVector< QgsLineString * > extractLineStrings(const QgsAbstractGeometry *geom)
Returns list of linestrings extracted from the passed geometry.
A geometry is the spatial representation of a feature.
double hausdorffDistanceDensify(const QgsGeometry &geom, double densifyFraction) const
Returns the Hausdorff distance between this geometry and geom.
QgsGeometry densifyByCount(int extraNodesPerSegment) const
Returns a copy of the geometry which has been densified by adding the specified number of extra nodes...
static QgsGeometry fromRect(const QgsRectangle &rect)
Creates a new geometry from a QgsRectangle.
double lineLocatePoint(const QgsGeometry &point) const
Returns a distance representing the location along this linestring of the closest point on this lines...
QgsGeometry intersection(const QgsGeometry &geometry, const QgsGeometryParameters ¶meters=QgsGeometryParameters(), QgsFeedback *feedback=nullptr) const
Returns a geometry representing the points shared by this geometry and other.
double length() const
Returns the planar, 2-dimensional length of geometry.
QgsGeometry offsetCurve(double distance, int segments, Qgis::JoinStyle joinStyle, double miterLimit) const
Returns an offset line at a given distance and side from an input line.
QgsGeometry densifyByDistance(double distance) const
Densifies the geometry by adding regularly placed extra nodes inside each segment so that the maximum...
QgsGeometry poleOfInaccessibility(double precision, double *distanceToBoundary=nullptr) const
Calculates the approximate pole of inaccessibility for a surface, which is the most distant internal ...
QgsAbstractGeometry::const_part_iterator const_parts_begin() const
Returns STL-style const iterator pointing to the first part of the geometry.
QgsGeometry squareWaves(double wavelength, double amplitude, bool strictWavelength=false) const
Constructs square waves along the boundary of the geometry, with the specified wavelength and amplitu...
QgsGeometry concaveHull(double targetPercent, bool allowHoles=false, QgsFeedback *feedback=nullptr) const
Returns a possibly concave polygon that contains all the points in the geometry.
QgsGeometry triangularWaves(double wavelength, double amplitude, bool strictWavelength=false) const
Constructs triangular waves along the boundary of the geometry, with the specified wavelength and amp...
bool vertexIdFromVertexNr(int number, QgsVertexId &id) const
Calculates the vertex ID from a vertex number.
QgsGeometry pointOnSurface() const
Returns a point guaranteed to lie on the surface of a geometry.
Q_INVOKABLE bool touches(const QgsGeometry &geometry) const
Returns true if the geometry touches another geometry.
bool isExactlyEqual(const QgsGeometry &geometry, Qgis::GeometryBackend backend=Qgis::GeometryBackend::QGIS) const
Compares the geometry with another geometry using the specified backend.
QgsGeometry applyDashPattern(const QVector< double > &pattern, Qgis::DashPatternLineEndingRule startRule=Qgis::DashPatternLineEndingRule::NoRule, Qgis::DashPatternLineEndingRule endRule=Qgis::DashPatternLineEndingRule::NoRule, Qgis::DashPatternSizeAdjustment adjustment=Qgis::DashPatternSizeAdjustment::ScaleBothDashAndGap, double patternOffset=0) const
Applies a dash pattern to a geometry, returning a MultiLineString geometry which is the input geometr...
QgsGeometry roundWaves(double wavelength, double amplitude, bool strictWavelength=false) const
Constructs rounded (sine-like) waves along the boundary of the geometry, with the specified wavelengt...
QgsGeometry nearestPoint(const QgsGeometry &other) const
Returns the nearest (closest) point on this geometry to another geometry.
static QgsGeometry collectGeometry(const QVector< QgsGeometry > &geometries)
Creates a new multipart geometry from a list of QgsGeometry objects.
QgsGeometry mergeLines(const QgsGeometryParameters ¶meters=QgsGeometryParameters()) const
Merges any connected lines in a LineString/MultiLineString geometry and converts them to single line ...
static QgsGeometry fromMultiPolylineXY(const QgsMultiPolylineXY &multiline)
Creates a new geometry from a QgsMultiPolylineXY object.
QString lastError() const
Returns an error string referring to the last error encountered either when this geometry was created...
QgsGeometry variableWidthBufferByM(int segments) const
Calculates a variable width buffer for a (multi)linestring geometry, where the width at each node is ...
Qgis::GeometryOperationResult transform(const QgsCoordinateTransform &ct, Qgis::TransformDirection direction=Qgis::TransformDirection::Forward, bool transformZ=false)
Transforms this geometry as described by the coordinate transform ct.
QgsPoint vertexAt(int atVertex) const
Returns coordinates of a vertex.
Q_INVOKABLE bool disjoint(const QgsGeometry &geometry) const
Returns true if the geometry is disjoint of another geometry.
QVector< QgsGeometry > asGeometryCollection() const
Returns contents of the geometry as a list of geometries.
QgsGeometry roundWavesRandomized(double minimumWavelength, double maximumWavelength, double minimumAmplitude, double maximumAmplitude, unsigned long seed=0) const
Constructs randomized rounded (sine-like) waves along the boundary of the geometry,...
double distance(const QgsGeometry &geom) const
Returns the minimum distance between this geometry and another geometry.
QgsGeometry interpolate(double distance) const
Returns an interpolated point on the geometry at the specified distance.
QgsGeometry extrude(double x, double y)
Returns an extruded version of this geometry.
static QgsGeometry fromMultiPointXY(const QgsMultiPointXY &multipoint)
Creates a new geometry from a QgsMultiPointXY object.
QgsGeometry symDifference(const QgsGeometry &geometry, const QgsGeometryParameters ¶meters=QgsGeometryParameters(), QgsFeedback *feedback=nullptr) const
Returns a geometry representing the points making up this geometry that do not make up other.
QgsGeometry singleSidedBuffer(double distance, int segments, Qgis::BufferSide side, Qgis::JoinStyle joinStyle=Qgis::JoinStyle::Round, double miterLimit=2.0) const
Returns a single sided buffer for a (multi)line geometry.
QgsAbstractGeometry * get()
Returns a modifiable (non-const) reference to the underlying abstract geometry primitive.
const QgsAbstractGeometry * constGet() const
Returns a non-modifiable (const) reference to the underlying abstract geometry primitive.
static Q_INVOKABLE QgsGeometry fromWkt(const QString &wkt)
Creates a new geometry from a WKT string.
bool contains(const QgsPointXY *p) const
Returns true if the geometry contains the point p.
QgsGeometry forceRHR() const
Forces geometries to respect the Right-Hand-Rule, in which the area that is bounded by a polygon is t...
QgsPointXY asPoint() const
Returns the contents of the geometry as a 2-dimensional point.
bool isGeosValid(Qgis::GeometryValidityFlags flags=Qgis::GeometryValidityFlags()) const
Checks validity of the geometry using GEOS.
QgsGeometry extendLine(double startDistance, double endDistance, double startDeflection=0, double endDeflection=0) const
Extends a (multi)line geometry by extrapolating out the start or end of the line by a specified dista...
QgsGeometry taperedBuffer(double startWidth, double endWidth, int segments) const
Calculates a variable width buffer ("tapered buffer") for a (multi)curve geometry.
Q_INVOKABLE bool within(const QgsGeometry &geometry) const
Returns true if the geometry is completely within another geometry.
QgsGeometry orientedMinimumBoundingBox(double &area, double &angle, double &width, double &height) const
Returns the oriented minimum bounding box for the geometry, which is the smallest (by area) rotated r...
double area() const
Returns the planar, 2-dimensional area of the geometry.
bool isMultipart() const
Returns true if WKB of the geometry is of WKBMulti* type.
QgsGeometry centroid() const
Returns the center of mass of a geometry.
Q_INVOKABLE bool crosses(const QgsGeometry &geometry) const
Returns true if the geometry crosses another geometry.
double hausdorffDistance(const QgsGeometry &geom) const
Returns the Hausdorff distance between this geometry and geom.
QgsGeometry combine(const QgsGeometry &geometry, const QgsGeometryParameters ¶meters=QgsGeometryParameters(), QgsFeedback *feedback=nullptr) const
Returns a geometry representing all the points in this geometry and other (a union geometry operation...
QgsGeometry makeValid(Qgis::MakeValidMethod method=Qgis::MakeValidMethod::Linework, bool keepCollapsed=false, QgsFeedback *feedback=nullptr) const
Attempts to make an invalid geometry valid without losing vertices.
QgsGeometry convexHull() const
Returns the smallest convex polygon that contains all the points in the geometry.
QgsGeometry sharedPaths(const QgsGeometry &other) const
Find paths shared between the two given lineal geometries (this and other).
void fromWkb(unsigned char *wkb, int length)
Set the geometry, feeding in the buffer containing OGC Well-Known Binary and the buffer's length.
QgsGeometry minimalEnclosingCircle(QgsPointXY ¢er, double &radius, unsigned int segments=36) const
Returns the minimal enclosing circle for the geometry.
static QgsGeometry fromMultiPolygonXY(const QgsMultiPolygonXY &multipoly)
Creates a new geometry from a QgsMultiPolygonXY.
QgsGeometry buffer(double distance, int segments, QgsFeedback *feedback=nullptr) const
Returns a buffer region around this geometry having the given width and with a specified number of se...
bool isEmpty() const
Returns true if the geometry is empty (eg a linestring with no vertices, or a collection with no geom...
double distanceToVertex(int vertex) const
Returns the distance along this geometry from its first vertex to the specified vertex.
QgsAbstractGeometry::const_part_iterator const_parts_end() const
Returns STL-style iterator pointing to the imaginary part after the last part of the geometry.
QgsAbstractGeometry::vertex_iterator vertices_begin() const
Returns STL-style iterator pointing to the first vertex of the geometry.
bool isFuzzyEqual(const QgsGeometry &geometry, double epsilon=1e-4, Qgis::GeometryBackend backend=Qgis::GeometryBackend::QGIS) const
Compares the geometry with another geometry within the tolerance epsilon using the specified backend.
QgsGeometry forcePolygonClockwise() const
Forces geometries to respect the exterior ring is clockwise, interior rings are counter-clockwise con...
static QgsGeometry createWedgeBuffer(const QgsPoint ¢er, double azimuth, double angularWidth, double outerRadius, double innerRadius=0)
Creates a wedge shaped buffer from a center point.
QgsGeometry triangularWavesRandomized(double minimumWavelength, double maximumWavelength, double minimumAmplitude, double maximumAmplitude, unsigned long seed=0) const
Constructs randomized triangular waves along the boundary of the geometry, with the specified wavelen...
QgsGeometry squareWavesRandomized(double minimumWavelength, double maximumWavelength, double minimumAmplitude, double maximumAmplitude, unsigned long seed=0) const
Constructs randomized square waves along the boundary of the geometry, with the specified wavelength ...
bool isTopologicallyEqual(const QgsGeometry &geometry, Qgis::GeometryBackend backend=Qgis::GeometryBackend::GEOS) const
Compares the geometry with another geometry using the specified backend.
QgsGeometry simplify(double tolerance, QgsFeedback *feedback=nullptr) const
Returns a simplified version of this geometry using a specified tolerance value.
QgsRectangle boundingBox() const
Returns the bounding box of the geometry.
Qgis::GeometryOperationResult rotate(double rotation, const QgsPointXY ¢er)
Rotate this geometry around the Z axis.
Qgis::GeometryOperationResult translate(double dx, double dy, double dz=0.0, double dm=0.0)
Translates this geometry by dx, dy, dz and dm.
double interpolateAngle(double distance) const
Returns the angle parallel to the linestring or polygon boundary at the specified distance along the ...
double angleAtVertex(int vertex) const
Returns the bisector angle for this geometry at the specified vertex.
QgsGeometry smooth(unsigned int iterations=1, double offset=0.25, double minimumDistance=-1.0, double maxAngle=180.0) const
Smooths a geometry by rounding off corners using the Chaikin algorithm.
QgsGeometry forcePolygonCounterClockwise() const
Forces geometries to respect the exterior ring is counter-clockwise, interior rings are clockwise con...
Q_INVOKABLE QString asWkt(int precision=17) const
Exports the geometry to WKT.
Qgis::WkbType wkbType() const
Returns type of the geometry as a WKB type (point / linestring / polygon etc.).
static QgsGeometryEngine * createGeometryEngine(const QgsAbstractGeometry *geometry, double precision=0.0, Qgis::GeosCreationFlags flags=Qgis::GeosCreationFlag::SkipEmptyInteriorRings)
Creates and returns a new geometry engine representing the specified geometry using precision on a gr...
Q_INVOKABLE bool intersects(const QgsRectangle &rectangle) const
Returns true if this geometry exactly intersects with a rectangle.
QgsAbstractGeometry::vertex_iterator vertices_end() const
Returns STL-style iterator pointing to the imaginary vertex after the last vertex of the geometry.
QgsGeometry difference(const QgsGeometry &geometry, const QgsGeometryParameters ¶meters=QgsGeometryParameters(), QgsFeedback *feedback=nullptr) const
Returns a geometry representing the points making up this geometry that do not make up other.
Q_INVOKABLE bool overlaps(const QgsGeometry &geometry) const
Returns true if the geometry overlaps another geometry.
QgsGeometry shortestLine(const QgsGeometry &other) const
Returns the shortest line joining this geometry to another geometry.
Does vector analysis using the GEOS library and handles import, export, and exception handling.
std::unique_ptr< QgsAbstractGeometry > maximumInscribedCircle(double tolerance, QString *errorMsg=nullptr, QgsFeedback *feedback=nullptr) const
Returns the maximum inscribed circle.
Gradient color ramp, which smoothly interpolates between two colors and also supports optional extra ...
Represents a color stop within a QgsGradientColorRamp color ramp.
static QString build(const QVariantMap &map)
Build a hstore-formatted string from a QVariantMap.
static QVariantMap parse(const QString &string)
Returns a QVariantMap object containing the key and values from a hstore-formatted string.
A representation of the interval between two datetime values.
bool isValid() const
Returns true if the interval is valid.
double days() const
Returns the interval duration in days.
double weeks() const
Returns the interval duration in weeks.
double months() const
Returns the interval duration in months (based on a 30 day month).
double seconds() const
Returns the interval duration in seconds.
double years() const
Returns the interval duration in years (based on an average year length).
double hours() const
Returns the interval duration in hours.
double minutes() const
Returns the interval duration in minutes.
Line string geometry type, with support for z-dimension and m-values.
bool lineLocatePointByM(double m, double &x, double &y, double &z, double &distanceFromStart, bool use3DDistance=true) const
Attempts to locate a point on the linestring by m value.
QgsLineString * clone() const override
Clones the geometry by performing a deep copy.
Represents a model of the Earth's magnetic field.
static bool fieldComponentsWithTimeDerivatives(double Bx, double By, double Bz, double Bxt, double Byt, double Bzt, double &H, double &F, double &D, double &I, double &Ht, double &Ft, double &Dt, double &It)
Compute various quantities dependent on a magnetic field and their rates of change.
QString dataUrl() const
Returns the DataUrl of the layer used by QGIS Server in GetCapabilities request.
QString attributionUrl() const
Returns the attribution URL of the layer used by QGIS Server in GetCapabilities request.
Base class for all map layer types.
virtual Q_INVOKABLE QgsRectangle extent() const
Returns the extent of the layer.
QString source() const
Returns the source for the layer.
QString providerType() const
Returns the provider type (provider key) for this layer.
QgsCoordinateReferenceSystem crs
QgsMapLayerServerProperties * serverProperties()
Returns QGIS Server Properties for the map layer.
QgsLayerMetadata metadata
QString publicSource(bool hidePassword=false) const
Gets a version of the internal layer definition that has sensitive bits removed (for example,...
virtual bool isEditable() const
Returns true if the layer can be edited.
double minimumScale() const
Returns the minimum map scale (i.e.
virtual Q_INVOKABLE QgsDataProvider * dataProvider()
Returns the layer's data provider, it may be nullptr.
double maximumScale() const
Returns the maximum map scale (i.e.
Implementation of a geometry simplifier using the "MapToPixel" algorithm.
@ SimplifyGeometry
The geometries can be simplified using the current map2pixel context state.
static void logMessage(const QString &message, const QString &tag=QString(), Qgis::MessageLevel level=Qgis::MessageLevel::Warning, bool notifyUser=true, const char *file=__builtin_FILE(), const char *function=__builtin_FUNCTION(), int line=__builtin_LINE(), Qgis::StringFormat format=Qgis::StringFormat::PlainText)
Adds a message to the log instance (and creates it if necessary).
Multi line string geometry collection.
bool addGeometry(QgsAbstractGeometry *g) override
Adds a geometry and takes ownership. Returns true in case of success.
Multi point geometry collection.
bool addGeometry(QgsAbstractGeometry *g) override
Adds a geometry and takes ownership. Returns true in case of success.
Custom exception class which is raised when an operation is not supported.
static QgsGeometry geometryFromGML(const QString &xmlString, const QgsOgcUtils::Context &context=QgsOgcUtils::Context())
Static method that creates geometry from GML.
bool isEmpty() const
Returns true if the geometry is empty.
Point geometry type, with support for z-dimension and m-values.
double inclination(const QgsPoint &other) const
Calculates Cartesian inclination between this point and other one (starting from zenith = 0 to nadir ...
bool addZValue(double zValue=0) override
Adds a z-dimension to the geometry, initialized to a preset value.
bool isValid(QString &error, Qgis::GeometryValidityFlags flags=Qgis::GeometryValidityFlags()) const override
Checks validity of the geometry, and returns true if the geometry is valid.
QgsPoint * clone() const override
Clones the geometry by performing a deep copy.
QgsPoint project(double distance, double azimuth, double inclination=90.0) const
Returns a new point which corresponds to this point projected by a specified distance with specified ...
Encapsulates a QGIS project, including sets of map layers and their styles, layouts,...
QgsRelationManager * relationManager
QVariantMap decodeUri(const QString &providerKey, const QString &uri)
Breaks a provider data source URI into its component paths (e.g.
static QgsProviderRegistry * instance(const QString &pluginPath=QString())
Means of accessing canonical single instance.
Quadrilateral geometry type.
static QgsQuadrilateral squareFromDiagonal(const QgsPoint &p1, const QgsPoint &p2)
Construct a QgsQuadrilateral as a square from a diagonal.
QgsPolygon * toPolygon(bool force2D=false) const
Returns the quadrilateral as a new polygon.
static QgsQuadrilateral rectangleFrom3Points(const QgsPoint &p1, const QgsPoint &p2, const QgsPoint &p3, ConstructionOption mode)
Construct a QgsQuadrilateral as a Rectangle from 3 points.
ConstructionOption
A quadrilateral can be constructed from 3 points where the second distance can be determined by the t...
@ Distance
Second distance is equal to the distance between 2nd and 3rd point.
@ Projected
Second distance is equal to the distance of the perpendicular projection of the 3rd point on the segm...
The Field class represents a Raster Attribute Table field, including its name, usage and type.
bool isRamp() const
Returns true if the field carries a color ramp component information (RedMin/RedMax,...
bool isColor() const
Returns true if the field carries a color component (Red, Green, Blue and optionally Alpha) informati...
The RasterBandStats struct is a container for statistics about a single raster band.
double mean
The mean cell value for the band. NO_DATA values are excluded.
double stdDev
The standard deviation of the cell values.
double minimumValue
The minimum cell value in the raster band.
double sum
The sum of all cells in the band. NO_DATA values are excluded.
double maximumValue
The maximum cell value in the raster band.
double range
The range is the distance between min & max.
A rectangle specified with double values.
void grow(double delta)
Grows the rectangle in place by the specified amount.
Regular Polygon geometry type.
ConstructionOption
A regular polygon can be constructed inscribed in a circle or circumscribed about a circle.
@ CircumscribedCircle
Circumscribed about a circle (the radius is the distance from the center to the midpoints of the side...
@ InscribedCircle
Inscribed in a circle (the radius is the distance between the center and vertices).
QgsPolygon * toPolygon() const
Returns as a polygon.
QList< QgsRelation > relationsByName(const QString &name) const
Returns a list of relations with matching names.
Q_INVOKABLE QgsRelation relation(const QString &id) const
Gets access to a relation by its id.
Represents a relationship between two vector layers.
QgsVectorLayer * referencedLayer
QgsVectorLayer * referencingLayer
Q_INVOKABLE QString getRelatedFeaturesFilter(const QgsFeature &feature) const
Returns a filter expression which returns all the features on the referencing (child) layer which hav...
A spatial index for QgsFeature objects.
@ FlagStoreFeatureGeometries
Indicates that the spatial index should also store feature geometries. This requires more memory,...
QList< QgsFeatureId > nearestNeighbor(const QgsPointXY &point, int neighbors=1, double maxDistance=0) const
Returns nearest neighbors to a point.
QList< QgsFeatureId > intersects(const QgsRectangle &rectangle) const
Returns a list of features with a bounding box which intersects the specified rectangle.
static QString quotedIdentifier(const QString &identifier)
Returns a properly quoted version of identifier.
static QString quotedValue(const QVariant &value)
Returns a properly quoted and escaped version of value for use in SQL strings.
bool prepare(const QgsExpressionNodeFunction *node, QgsExpression *parent, const QgsExpressionContext *context) const override
This will be called during the prepare step() of an expression if it is not static.
void setIsStaticFunction(const std::function< bool(const QgsExpressionNodeFunction *, QgsExpression *, const QgsExpressionContext *) > &isStatic)
Set a function that will be called in the prepare step to determine if the function is static or not.
QStringList aliases() const override
Returns a list of possible aliases for the function.
void setPrepareFunction(const std::function< bool(const QgsExpressionNodeFunction *, QgsExpression *, const QgsExpressionContext *)> &prepareFunc)
Set a function that will be called in the prepare step to determine if the function is static or not.
void setUsesGeometryFunction(const std::function< bool(const QgsExpressionNodeFunction *node)> &usesGeometry)
Set a function that will be called when determining if the function requires feature geometry or not.
bool isStatic(const QgsExpressionNodeFunction *node, QgsExpression *parent, const QgsExpressionContext *context) const override
Will be called during prepare to determine if the function is static.
void setIsStatic(bool isStatic)
Tag this function as either static or not static.
QgsStaticExpressionFunction(const QString &fnname, int params, FcnEval fcn, const QString &group, const QString &helpText=QString(), bool usesGeometry=false, const QSet< QString > &referencedColumns=QSet< QString >(), bool lazyEval=false, const QStringList &aliases=QStringList(), bool handlesNull=false)
Static function for evaluation against a QgsExpressionContext, using an unnamed list of parameter val...
QSet< QString > referencedColumns(const QgsExpressionNodeFunction *node) const override
Returns a set of field names which are required for this function.
bool usesGeometry(const QgsExpressionNodeFunction *node) const override
Does this function use a geometry object.
static int hammingDistance(const QString &string1, const QString &string2, bool caseSensitive=false)
Returns the Hamming distance between two strings.
static QString soundex(const QString &string)
Returns the Soundex representation of a string.
static int levenshteinDistance(const QString &string1, const QString &string2, bool caseSensitive=false)
Returns the Levenshtein edit distance between two strings.
static QString longestCommonSubstring(const QString &string1, const QString &string2, bool caseSensitive=false)
Returns the longest common substring between two strings.
static QString unaccent(const QString &input)
Removes accents and other diacritical marks from a string, replacing accented characters with their u...
static QString wordWrap(const QString &string, int length, bool useMaxLineLength=true, const QString &customDelimiter=QString())
Automatically wraps a string by inserting new line characters at appropriate locations in the string.
const QgsColorRamp * colorRampRef(const QString &name) const
Returns a const pointer to a symbol (doesn't create new instance).
static QgsStyle * defaultStyle(bool initialize=true)
Returns the default application-wide style.
Contains utility functions for working with symbols and symbol layers.
static QColor decodeColor(const QString &str)
Decodes a string to a color.
static QString encodeColor(const QColor &color)
Lossy-encodes a color to a string.
static bool runOnMainThread(const Func &func, QgsFeedback *feedback=nullptr)
Guarantees that func is executed on the main thread.
Allows creation of a multi-layer database-side transaction.
virtual bool executeSql(const QString &sql, QString &error, bool isDirty=false, const QString &name=QString())=0
Execute the sql string.
static Q_INVOKABLE QString encodeUnit(Qgis::DistanceUnit unit)
Encodes a distance unit to a string.
static bool isNull(const QVariant &variant, bool silenceNullWarnings=false)
Returns true if the specified variant should be considered a NULL value.
static QVariant createNullVariant(QMetaType::Type metaType)
Helper method to properly create a null QVariant from a metaType Returns the created QVariant.
virtual QgsTransaction * transaction() const
Returns the transaction this data provider is included in, if any.
static bool validateAttribute(const QgsVectorLayer *layer, const QgsFeature &feature, int attributeIndex, QStringList &errors, QgsFieldConstraints::ConstraintStrength strength=QgsFieldConstraints::ConstraintStrengthNotSet, QgsFieldConstraints::ConstraintOrigin origin=QgsFieldConstraints::ConstraintOriginNotSet)
Tests a feature attribute value to check whether it passes all constraints which are present on the c...
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.
QVariant aggregate(Qgis::Aggregate aggregate, const QString &fieldOrExpression, const QgsAggregateCalculator::AggregateParameters ¶meters=QgsAggregateCalculator::AggregateParameters(), QgsExpressionContext *context=nullptr, bool *ok=nullptr, QgsFeatureIds *fids=nullptr, QgsFeedback *feedback=nullptr, QString *error=nullptr) const
Calculates an aggregated value from the layer's features.
int selectedFeatureCount() const
Returns the number of features that are selected in this layer.
Q_INVOKABLE const QgsFeatureIds & selectedFeatureIds() const
Returns a list of the selected features IDs in this layer.
QString storageType() const
Returns the permanent storage type for this layer as a friendly name.
QString displayExpression
QgsEditorWidgetSetup editorWidgetSetup(int index) const
Returns the editor widget setup for the field at the specified index.
QgsFeatureIterator getFeatures(const QgsFeatureRequest &request=QgsFeatureRequest()) const final
Queries the layer for features specified in request.
Q_INVOKABLE Qgis::GeometryType geometryType() const
Returns point, line or polygon.
Q_INVOKABLE QgsFeature getFeature(QgsFeatureId fid) const
Queries the layer for the feature with the given id.
QgsVectorDataProvider * dataProvider() final
Returns the layer's data provider, it may be nullptr.
bool isStatic(const QgsExpressionNodeFunction *node, QgsExpression *parent, const QgsExpressionContext *context) const override
Will be called during prepare to determine if the function is static.
QgsWithVariableExpressionFunction()
QVariant run(QgsExpressionNode::NodeList *args, const QgsExpressionContext *context, QgsExpression *parent, const QgsExpressionNodeFunction *node) override
Evaluates the function, first evaluating all required arguments before passing them to the function's...
QVariant func(const QVariantList &values, const QgsExpressionContext *context, QgsExpression *parent, const QgsExpressionNodeFunction *node) override
Returns result of evaluating the function.
bool prepare(const QgsExpressionNodeFunction *node, QgsExpression *parent, const QgsExpressionContext *context) const override
This will be called during the prepare step() of an expression if it is not static.
static Q_INVOKABLE bool hasZ(Qgis::WkbType type)
Tests whether a WKB type contains the z-dimension.
static Q_INVOKABLE QString geometryDisplayString(Qgis::GeometryType type)
Returns a display string for a geometry type.
static Qgis::WkbType flatType(Qgis::WkbType type)
Returns the flat type for a WKB type.
Unique pointer for sqlite3 databases, which automatically closes the database when the pointer goes o...
sqlite3_statement_unique_ptr prepare(const QString &sql, int &resultCode) const
Prepares a sql statement, returning the result.
QString errorMessage() const
Returns the most recent error message encountered by the database.
int open_v2(const QString &path, int flags, const char *zVfs)
Opens the database at the specified file path.
int exec(const QString &sql, QString &errorMessage) const
Executes the sql command in the database.
Unique pointer for sqlite3 prepared statements, which automatically finalizes the statement when the ...
int step()
Steps to the next record in the statement, returning the sqlite3 result code.
qlonglong columnAsInt64(int column) const
Gets column value from the current statement row as a long long integer (64 bits).
double ANALYSIS_EXPORT angle(QgsPoint *p1, QgsPoint *p2, QgsPoint *p3, QgsPoint *p4)
Calculates the angle between two segments (in 2 dimension, z-values are ignored).
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into allowing algorithms to be written in pure substantial changes are required in order to port existing x Processing algorithms for QGIS x The most significant changes are outlined not GeoAlgorithm For algorithms which operate on features one by consider subclassing the QgsProcessingFeatureBasedAlgorithm class This class allows much of the boilerplate code for looping over features from a vector layer to be bypassed and instead requires implementation of a processFeature method Ensure that your algorithm(or algorithm 's parent class) implements the new pure virtual createInstance(self) call
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into c
bool qgsVariantLessThan(const QVariant &lhs, const QVariant &rhs)
Compares two QVariant values and returns whether the first is less than the second.
T qgsEnumKeyToValue(const QString &key, const T &defaultValue, bool tryValueAsKey=true, bool *returnOk=nullptr)
Returns the value corresponding to the given key of an enum.
#define Q_NOWARN_DEPRECATED_POP
#define Q_NOWARN_DEPRECATED_PUSH
double qgsRound(double number, int places)
Returns a double number, rounded (as close as possible) to the specified number of places.
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference).
T qgsgeometry_cast(QgsAbstractGeometry *geom)
QVector< QgsRingSequence > QgsCoordinateSequence
QVector< QgsPointSequence > QgsRingSequence
QVector< QgsPoint > QgsPointSequence
const QString cacheKey(const QString &pathIn)
QList< QgsGradientStop > QgsGradientStopsList
List of gradient stops.
Q_DECLARE_METATYPE(QgsDatabaseQueryLogEntry)
std::function< bool(const QgsGeometry &geometry, const QgsGeometry &other, const QVariantList &values, Qgis::GeometryBackend backend)> RelationFunction
allows geometry function with different parameters to be used with the same executeGeomOverlay functi...
double qDateTimeToDecimalYear(const QDateTime &dateTime)
QVariant fcnRampColor(const QVariantList &values, const QgsExpressionContext *context, QgsExpression *parent, const QgsExpressionNodeFunction *node)
#define ENSURE_GEOM_TYPE(f, g, geomtype)
QVariant fcnRampColorObject(const QVariantList &values, const QgsExpressionContext *, QgsExpression *parent, const QgsExpressionNodeFunction *)
#define ENSURE_NO_EVAL_ERROR
#define FEAT_FROM_CONTEXT(c, f)
#define SET_EVAL_ERROR(x)
qint64 QgsFeatureId
64 bit feature ids negative numbers are used for uncommitted/newly added features
QVector< QgsPolylineXY > QgsMultiPolylineXY
A collection of QgsPolylines that share a common collection of attributes.
QVector< QgsPointXY > QgsMultiPointXY
A collection of QgsPoints that share a common collection of attributes.
QVector< QgsPolygonXY > QgsMultiPolygonXY
A collection of QgsPolygons that share a common collection of attributes.
#define GEOS_COMPUTE_VERSION(major, minor, patch)
compute GEOS integer version from major, minor and patch number
#define GEOS_VERSION_NUM
compute current GEOS integer version
QPointer< QgsMapLayer > QgsWeakMapLayerPointer
Weak pointer for QgsMapLayer.
QLineF segment(int index, QRectF rect, double radius)
A bundle of parameters controlling aggregate calculation.
QString filter
Optional filter for calculating aggregate over a subset of features, or an empty string to use all fe...
QString delimiter
Delimiter to use for joining values with the StringConcatenate aggregate.
QgsFeatureRequest::OrderBy orderBy
Optional order by clauses.
Single variable definition for use within a QgsExpressionContextScope.
The Context struct stores the current layer and coordinate transform context.
const QgsMapLayer * layer
QgsCoordinateTransformContext transformContext
Utility class for identifying a unique vertex within a geometry.