@@ -1283,6 +1283,48 @@ static QVariant fcnFeatureId( const QVariantList &, const QgsExpressionContext *
1283
1283
return QVariant ( static_cast < int >( f.id () ) );
1284
1284
}
1285
1285
1286
+ static QVariant fcnRasterValue ( const QVariantList &values, const QgsExpressionContext *, QgsExpression *parent, const QgsExpressionNodeFunction * )
1287
+ {
1288
+ QgsRasterLayer *layer = QgsExpressionUtils::getRasterLayer ( values.at ( 0 ), parent );
1289
+ if ( !layer || !layer->dataProvider () )
1290
+ {
1291
+ parent->setEvalErrorString ( QObject::tr ( " Function `raster_value` requires a valid raster layer." ) );
1292
+ return QVariant ();
1293
+ }
1294
+
1295
+ int bandNb = QgsExpressionUtils::getIntValue ( values.at ( 1 ), parent );
1296
+ if ( bandNb < 1 || bandNb > layer->bandCount () )
1297
+ {
1298
+ parent->setEvalErrorString ( QObject::tr ( " Function `raster_value` requires a valid raster band number." ) );
1299
+ return QVariant ();
1300
+ }
1301
+
1302
+ QgsGeometry geom = QgsExpressionUtils::getGeometry ( values.at ( 2 ), parent );
1303
+ if ( geom.isNull () || geom.type () != QgsWkbTypes::PointGeometry )
1304
+ {
1305
+ parent->setEvalErrorString ( QObject::tr ( " Function `raster_value` requires a valid point geometry." ) );
1306
+ return QVariant ();
1307
+ }
1308
+
1309
+ QgsPointXY point = geom.asPoint ();
1310
+ if ( geom.isMultipart () )
1311
+ {
1312
+ QgsMultiPointXY multiPoint = geom.asMultiPoint ();
1313
+ if ( multiPoint.count () == 1 )
1314
+ {
1315
+ point = multiPoint[0 ];
1316
+ }
1317
+ else
1318
+ {
1319
+ // if the geometry contains more than one part, return an undefined value
1320
+ return QVariant ();
1321
+ }
1322
+ }
1323
+
1324
+ double value = layer->dataProvider ()->sample ( point, bandNb );
1325
+ return std::isnan ( value ) ? QVariant () : value;
1326
+ }
1327
+
1286
1328
static QVariant fcnFeature ( const QVariantList &, const QgsExpressionContext *context, QgsExpression *, const QgsExpressionNodeFunction * )
1287
1329
{
1288
1330
if ( !context )
@@ -4559,7 +4601,7 @@ const QList<QgsExpressionFunction *> &QgsExpression::Functions()
4559
4601
<< new QgsStaticExpressionFunction ( QStringLiteral ( " layer_property" ), 2 , fcnGetLayerProperty, QStringLiteral ( " General" ) )
4560
4602
<< new QgsStaticExpressionFunction ( QStringLiteral ( " raster_statistic" ), QgsExpressionFunction::ParameterList () << QgsExpressionFunction::Parameter ( QStringLiteral ( " layer" ) )
4561
4603
<< QgsExpressionFunction::Parameter ( QStringLiteral ( " band" ) )
4562
- << QgsExpressionFunction::Parameter ( QStringLiteral ( " statistic" ) ), fcnGetRasterBandStat, QStringLiteral ( " General " ) );
4604
+ << QgsExpressionFunction::Parameter ( QStringLiteral ( " statistic" ) ), fcnGetRasterBandStat, QStringLiteral ( " Rasters " ) );
4563
4605
4564
4606
// **var** function
4565
4607
QgsStaticExpressionFunction *varFunction = new QgsStaticExpressionFunction ( QStringLiteral ( " var" ), 1 , fcnGetVariable, QStringLiteral ( " General" ) );
@@ -4617,6 +4659,7 @@ const QList<QgsExpressionFunction *> &QgsExpression::Functions()
4617
4659
<< new QgsStaticExpressionFunction ( QStringLiteral ( " env" ), 1 , fcnEnvVar, QStringLiteral ( " General" ), QString () )
4618
4660
<< new QgsWithVariableExpressionFunction ()
4619
4661
<< new QgsStaticExpressionFunction ( QStringLiteral ( " attribute" ), 2 , fcnAttribute, QStringLiteral ( " Record and Attributes" ), QString (), false , QSet<QString>() << QgsFeatureRequest::ALL_ATTRIBUTES )
4662
+ << new QgsStaticExpressionFunction ( QStringLiteral ( " raster_value" ), QgsExpressionFunction::ParameterList () << QgsExpressionFunction::Parameter ( QStringLiteral ( " layer" ) ) << QgsExpressionFunction::Parameter ( QStringLiteral ( " band" ) ) << QgsExpressionFunction::Parameter ( QStringLiteral ( " point" ) ), fcnRasterValue, QStringLiteral ( " Rasters" ) )
4620
4663
4621
4664
// functions for arrays
4622
4665
<< new QgsStaticExpressionFunction ( QStringLiteral ( " array" ), -1 , fcnArray, QStringLiteral ( " Arrays" ), QString (), false , QSet<QString>(), false , QStringList (), true )
0 commit comments