Skip to content

Commit d9d4bd2

Browse files
authoredDec 6, 2018
Merge pull request #8611 from elpaso/backport-3_4-2
Backports to 3.4
2 parents 4d5b195 + 4fd305c commit d9d4bd2

File tree

15 files changed

+521
-136
lines changed

15 files changed

+521
-136
lines changed
 

‎python/analysis/auto_generated/raster/qgsrastercalcnode.sip.in

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,22 @@ QgsRasterCalcNode cannot be copied
7474
void setRight( QgsRasterCalcNode *right );
7575

7676

77+
QString toString( bool cStyle = false ) const;
78+
%Docstring
79+
Returns a string representation of the expression
80+
81+
:param cStyle: if true operators will follow C syntax
82+
83+
.. versionadded:: 3.6
84+
%End
85+
86+
QList<const QgsRasterCalcNode *> findNodes( const QgsRasterCalcNode::Type type ) const;
87+
%Docstring
88+
Returns a list of nodes of a specific ``type``
89+
90+
.. versionadded:: 3.6
91+
%End
92+
7793
static QgsRasterCalcNode *parseRasterCalcString( const QString &str, QString &parserErrorMsg ) /Factory/;
7894

7995
private:

‎python/plugins/processing/algs/qgis/RasterCalculator.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -168,8 +168,8 @@ def _cellsize(layer):
168168

169169
output = self.parameterAsOutputLayer(parameters, self.OUTPUT, context)
170170

171-
width = math.floor((bbox.xMaximum() - bbox.xMinimum()) / cellsize)
172-
height = math.floor((bbox.yMaximum() - bbox.yMinimum()) / cellsize)
171+
width = round((bbox.xMaximum() - bbox.xMinimum()) / cellsize)
172+
height = round((bbox.yMaximum() - bbox.yMinimum()) / cellsize)
173173
driverName = GdalUtils.getFormatShortNameFromFilename(output)
174174

175175
calc = QgsRasterCalculator(expression,

‎python/plugins/processing/tests/testdata/qgis_algorithm_tests.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2537,7 +2537,7 @@ tests:
25372537
EXPRESSION: dem@1
25382538
results:
25392539
OUTPUT:
2540-
hash: ef97a22ee16e0e28bbdc0341449777b1527e37febc3c4339b2c057c9
2540+
hash: 525577c05dd999239d9c6f95fd5e70d96355da3a0ea71bfcf021e729
25412541
type: rasterhash
25422542

25432543
- algorithm: qgis:rastercalculator
@@ -2552,7 +2552,7 @@ tests:
25522552
EXPRESSION: dem@1 * 2
25532553
results:
25542554
OUTPUT:
2555-
hash: fe6e018be13c5a3c17f3f4d0f0dc7686c628cb440b74c4642aa0c939
2555+
hash: 98daf025230ec9d031f7502c6a80a3b04dd060808d6b7bcb4328e87c
25562556
type: rasterhash
25572557

25582558
- algorithm: native:orientedminimumboundingbox

‎src/analysis/raster/qgsninecellfilter.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ int QgsNineCellFilter::processRasterGPU( const QString &source, QgsFeedback *fee
215215

216216
// Prepare context and queue
217217
cl::Context ctx = QgsOpenClUtils::context();
218-
cl::CommandQueue queue( ctx );
218+
cl::CommandQueue queue = QgsOpenClUtils::commandQueue( );
219219

220220
//keep only three scanlines in memory at a time, make room for initial and final nodata
221221
QgsOpenClUtils::CPLAllocator<float> scanLine( xSize + 2 );
@@ -245,7 +245,7 @@ int QgsNineCellFilter::processRasterGPU( const QString &source, QgsFeedback *fee
245245
cl::Buffer resultLineBuffer( ctx, CL_MEM_WRITE_ONLY, inputSize, nullptr, nullptr );
246246

247247
// Create a program from the kernel source
248-
cl::Program program( QgsOpenClUtils::buildProgram( ctx, source, QgsOpenClUtils::ExceptionBehavior::Throw ) );
248+
cl::Program program( QgsOpenClUtils::buildProgram( source, QgsOpenClUtils::ExceptionBehavior::Throw ) );
249249

250250
// Create the OpenCL kernel
251251
auto kernel = cl::KernelFunctor <

‎src/analysis/raster/qgsrastercalcnode.cpp

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include "qgsrasterblock.h"
1717
#include "qgsrastermatrix.h"
1818
#include <cfloat>
19+
#include <QtDebug>
1920

2021
QgsRasterCalcNode::QgsRasterCalcNode( double number )
2122
: mNumber( number )
@@ -199,6 +200,127 @@ bool QgsRasterCalcNode::calculate( QMap<QString, QgsRasterBlock * > &rasterData,
199200
return false;
200201
}
201202

203+
QString QgsRasterCalcNode::toString( bool cStyle ) const
204+
{
205+
QString result;
206+
QString left;
207+
QString right;
208+
if ( mLeft )
209+
left = mLeft->toString( cStyle );
210+
if ( mRight )
211+
right = mRight->toString( cStyle );
212+
switch ( mType )
213+
{
214+
case tOperator:
215+
switch ( mOperator )
216+
{
217+
case opPLUS:
218+
result = QStringLiteral( "%1 + %2" ).arg( left ).arg( right );
219+
break;
220+
case opMINUS:
221+
case opSIGN:
222+
result = QStringLiteral( "%1 - %2" ).arg( left ).arg( right );
223+
break;
224+
case opMUL:
225+
result = QStringLiteral( "%1 * %2" ).arg( left ).arg( right );
226+
break;
227+
case opDIV:
228+
result = QStringLiteral( "%1 / %2" ).arg( left ).arg( right );
229+
break;
230+
case opPOW:
231+
if ( cStyle )
232+
result = QStringLiteral( "pow( %1, %2 )" ).arg( left ).arg( right );
233+
else
234+
result = QStringLiteral( "%1^%2" ).arg( left ).arg( right );
235+
break;
236+
case opEQ:
237+
if ( cStyle )
238+
result = QStringLiteral( "%1 == %2" ).arg( left ).arg( right );
239+
else
240+
result = QStringLiteral( "%1 = %2" ).arg( left ).arg( right );
241+
break;
242+
case opNE:
243+
result = QStringLiteral( "%1 != %2" ).arg( left ).arg( right );
244+
break;
245+
case opGT:
246+
result = QStringLiteral( "%1 > %2" ).arg( left ).arg( right );
247+
break;
248+
case opLT:
249+
result = QStringLiteral( "%1 < %2" ).arg( left ).arg( right );
250+
break;
251+
case opGE:
252+
result = QStringLiteral( "%1 >= %2" ).arg( left ).arg( right );
253+
break;
254+
case opLE:
255+
result = QStringLiteral( "%1 <= %2" ).arg( left ).arg( right );
256+
break;
257+
case opAND:
258+
if ( cStyle )
259+
result = QStringLiteral( "%1 && %2" ).arg( left ).arg( right );
260+
else
261+
result = QStringLiteral( "%1 AND %2" ).arg( left ).arg( right );
262+
break;
263+
case opOR:
264+
if ( cStyle )
265+
result = QStringLiteral( "%1 || %2" ).arg( left ).arg( right );
266+
else
267+
result = QStringLiteral( "%1 OR %2" ).arg( left ).arg( right );
268+
break;
269+
case opSQRT:
270+
result = QStringLiteral( "sqrt( %1 )" ).arg( left );
271+
break;
272+
case opSIN:
273+
result = QStringLiteral( "sin( %1 )" ).arg( left );
274+
break;
275+
case opCOS:
276+
result = QStringLiteral( "cos( %1 )" ).arg( left );
277+
break;
278+
case opTAN:
279+
result = QStringLiteral( "tan( %1 )" ).arg( left );
280+
break;
281+
case opASIN:
282+
result = QStringLiteral( "asin( %1 )" ).arg( left );
283+
break;
284+
case opACOS:
285+
result = QStringLiteral( "acos( %1 )" ).arg( left );
286+
break;
287+
case opATAN:
288+
result = QStringLiteral( "atan( %1 )" ).arg( left );
289+
break;
290+
case opLOG:
291+
result = QStringLiteral( "log( %1 )" ).arg( left );
292+
break;
293+
case opLOG10:
294+
result = QStringLiteral( "log10( %1 )" ).arg( left );
295+
break;
296+
case opNONE:
297+
break;
298+
}
299+
break;
300+
case tRasterRef:
301+
result = QStringLiteral( "\"%1\"" ).arg( mRasterName );
302+
break;
303+
case tNumber:
304+
result = QString::number( mNumber );
305+
break;
306+
case tMatrix:
307+
break;
308+
}
309+
return result;
310+
}
311+
312+
QList<const QgsRasterCalcNode *> QgsRasterCalcNode::findNodes( const QgsRasterCalcNode::Type type ) const
313+
{
314+
QList<const QgsRasterCalcNode *> nodeList;
315+
if ( mType == type )
316+
nodeList.push_back( this );
317+
if ( mLeft )
318+
nodeList.append( mLeft->findNodes( type ) );
319+
if ( mRight )
320+
nodeList.append( mRight->findNodes( type ) );
321+
return nodeList;
322+
}
323+
202324
QgsRasterCalcNode *QgsRasterCalcNode::parseRasterCalcString( const QString &str, QString &parserErrorMsg )
203325
{
204326
extern QgsRasterCalcNode *localParseRasterCalcString( const QString & str, QString & parserErrorMsg );

‎src/analysis/raster/qgsrastercalcnode.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,19 @@ class ANALYSIS_EXPORT QgsRasterCalcNode
106106
*/
107107
bool calculate( QMap<QString, QgsRasterBlock * > &rasterData, QgsRasterMatrix &result, int row = -1 ) const SIP_SKIP;
108108

109+
/**
110+
* Returns a string representation of the expression
111+
* \param cStyle if true operators will follow C syntax
112+
* \since QGIS 3.6
113+
*/
114+
QString toString( bool cStyle = false ) const;
115+
116+
/**
117+
* Returns a list of nodes of a specific \a type
118+
* \since QGIS 3.6
119+
*/
120+
QList<const QgsRasterCalcNode *> findNodes( const QgsRasterCalcNode::Type type ) const;
121+
109122
static QgsRasterCalcNode *parseRasterCalcString( const QString &str, QString &parserErrorMsg ) SIP_FACTORY;
110123

111124
private:

0 commit comments

Comments
 (0)
Please sign in to comment.