3333
3434from math import log10 , floor
3535from qgis .core import (QgsDataSourceURI , QgsCredentials , QgsExpressionContext ,
36- QgsExpressionContextUtils , QgsExpression )
36+ QgsExpressionContextUtils , QgsExpression , QgsRasterLayer )
3737from qgis .gui import QgsEncodingFileDialog , QgsExpressionBuilderDialog
38+ from qgis .utils import iface
39+ from processing .tools import dataobjects
3840
3941pluginPath = os .path .split (os .path .dirname (__file__ ))[0 ]
4042WIDGET , BASE = uic .loadUiType (
@@ -87,7 +89,9 @@ def __init__(self, number, minimum, maximum, isInteger):
8789 def showExpressionsBuilder (self ):
8890 context = QgsExpressionContext ()
8991 context .appendScope (QgsExpressionContextUtils .globalScope ())
90- context .appendScope (QgsExpressionContextUtils .projectScope ())
92+ scope = QgsExpressionContextUtils .projectScope ()
93+ self .addVariablesToScope (scope )
94+ context .appendScope (scope )
9195 dlg = QgsExpressionBuilderDialog (None , self .spnValue .text (), self , "generic" , context )
9296 dlg .setWindowTitle (self .tr ("Expression based input" ));
9397 if dlg .exec_ () == QDialog .Accepted :
@@ -100,6 +104,41 @@ def showExpressionsBuilder(self):
100104 except :
101105 pass
102106
107+ def addVariablesToScope (self , scope ):
108+ layers = dataobjects .getAllLayers ()
109+ for layer in layers :
110+ name = layer .name ()
111+ scope .setVariable ("%s_minx" % name , layer .extent ().xMinimum ())
112+ scope .setVariable ("%s_miny" % name , layer .extent ().yMinimum ())
113+ scope .setVariable ("%s_maxx" % name , layer .extent ().xMaximum ())
114+ scope .setVariable ("%s_maxy" % name , layer .extent ().yMaximum ())
115+ if isinstance (layer , QgsRasterLayer ):
116+ cellsize = (layer .extent ().xMaximum ()
117+ - layer .extent ().xMinimum ()) / layer .width ()
118+ scope .setVariable ("%s_cellsize" % name , cellsize )
119+
120+ layers = dataobjects .getRasterLayers ()
121+ for layer in layers :
122+ for i in range (layer .bandCount ()):
123+ stats = layer .dataProvider ().bandStatistics (i + 1 )
124+ scope .setVariable ("%s_band%i_avg" % (name , i + 1 ), stats .mean )
125+ scope .setVariable ("%s_band%i_stddev" % (name , i + 1 ), stats .stdDev )
126+ scope .setVariable ("%s_band%i_min" % (name , i + 1 ), stats .minimumValue )
127+ scope .setVariable ("%s_band%i_max" % (name , i + 1 ), stats .maximumValue )
128+
129+ extent = iface .mapCanvas ().extent ()
130+ scope .setVariable ("canvasextent_minx" , extent .xMinimum ())
131+ scope .setVariable ("canvasextent_miny" , extent .yMinimum ())
132+ scope .setVariable ("canvasextent_maxx" , extent .xMaximum ())
133+ scope .setVariable ("canvasextent_maxy" , extent .yMaximum ())
134+
135+ extent = iface .mapCanvas ().fullExtent ()
136+ scope .setVariable ("fullextent_minx" , extent .xMinimum ())
137+ scope .setVariable ("fullextent_miny" , extent .yMinimum ())
138+ scope .setVariable ("fullextent_maxx" , extent .xMaximum ())
139+ scope .setVariable ("fullextent_maxy" , extent .yMaximum ())
140+
141+
103142 def getValue (self ):
104143 return self .spnValue .value ()
105144
0 commit comments