@@ -40,6 +40,14 @@ class TestQgsRasterCalculator : public QObject
40
40
void singleOp_data ();
41
41
void singleOp (); // test operators which operate on a single value
42
42
43
+ void singleOpMatrices (); // test single op using matrix
44
+ void dualOpNumberMatrix (); // test dual op run on number and matrix
45
+ void dualOpMatrixNumber (); // test dual op run on matrix and number
46
+ void dualOpMatrixMatrix (); // test dual op run on matrix and matrix
47
+
48
+ void rasterRefOp ();
49
+ void dualOpRasterRaster (); // test dual op on raster ref and raster ref
50
+
43
51
};
44
52
45
53
void TestQgsRasterCalculator::initTestCase ()
@@ -178,5 +186,209 @@ void TestQgsRasterCalculator::singleOp()
178
186
179
187
}
180
188
189
+ void TestQgsRasterCalculator::singleOpMatrices ()
190
+ {
191
+ // test single op run on matrix
192
+ double * d = new double [6 ];
193
+ d[0 ] = 1.0 ;
194
+ d[1 ] = 2.0 ;
195
+ d[2 ] = 3.0 ;
196
+ d[3 ] = 4.0 ;
197
+ d[4 ] = 5.0 ;
198
+ d[5 ] = -1.0 ;
199
+
200
+ QgsRasterMatrix m ( 2 , 3 , d, -1.0 );
201
+
202
+ QgsRasterCalcNode node ( QgsRasterCalcNode::opSIGN, new QgsRasterCalcNode ( &m ) , 0 );
203
+
204
+ QgsRasterMatrix result;
205
+ result.setNodataValue ( -9999 );
206
+ QMap<QString, QgsRasterMatrix*> rasterData;
207
+
208
+ QVERIFY ( node.calculate ( rasterData, result ) );
209
+
210
+ QCOMPARE ( result.data ()[0 ], -d[0 ] );
211
+ QCOMPARE ( result.data ()[1 ], -d[1 ] );
212
+ QCOMPARE ( result.data ()[2 ], -d[2 ] );
213
+ QCOMPARE ( result.data ()[3 ], -d[3 ] );
214
+ QCOMPARE ( result.data ()[4 ], -d[4 ] );
215
+ QCOMPARE ( result.data ()[5 ], -9999.0 );
216
+ }
217
+
218
+ void TestQgsRasterCalculator::dualOpNumberMatrix ()
219
+ {
220
+ // test dual op run on number and matrix
221
+ double * d = new double [6 ];
222
+ d[0 ] = 1.0 ;
223
+ d[1 ] = 2.0 ;
224
+ d[2 ] = 3.0 ;
225
+ d[3 ] = 4.0 ;
226
+ d[4 ] = 5.0 ;
227
+ d[5 ] = -1.0 ;
228
+
229
+ QgsRasterMatrix m ( 2 , 3 , d, -1.0 );
230
+
231
+ QgsRasterCalcNode node ( QgsRasterCalcNode::opPLUS, new QgsRasterCalcNode ( 5.0 ), new QgsRasterCalcNode ( &m ) );
232
+
233
+ QgsRasterMatrix result;
234
+ result.setNodataValue ( -9999 );
235
+ QMap<QString, QgsRasterMatrix*> rasterData;
236
+
237
+ QVERIFY ( node.calculate ( rasterData, result ) );
238
+
239
+ QCOMPARE ( result.data ()[0 ], 6.0 );
240
+ QCOMPARE ( result.data ()[1 ], 7.0 );
241
+ QCOMPARE ( result.data ()[2 ], 8.0 );
242
+ QCOMPARE ( result.data ()[3 ], 9.0 );
243
+ QCOMPARE ( result.data ()[4 ], 10.0 );
244
+ QCOMPARE ( result.data ()[5 ], -9999.0 );
245
+
246
+ // also check adding no data number
247
+ QgsRasterCalcNode nodeNoData ( QgsRasterCalcNode::opPLUS, new QgsRasterCalcNode ( -9999 ), new QgsRasterCalcNode ( &m ) );
248
+ QVERIFY ( nodeNoData.calculate ( rasterData, result ) );
249
+ QCOMPARE ( result.data ()[0 ], -9999.0 );
250
+ }
251
+
252
+ void TestQgsRasterCalculator::dualOpMatrixNumber ()
253
+ {
254
+ // test dual op run on matrix and number
255
+ double * d = new double [6 ];
256
+ d[0 ] = 1.0 ;
257
+ d[1 ] = 2.0 ;
258
+ d[2 ] = 3.0 ;
259
+ d[3 ] = 4.0 ;
260
+ d[4 ] = 5.0 ;
261
+ d[5 ] = -1.0 ;
262
+
263
+ QgsRasterMatrix m ( 2 , 3 , d, -1.0 );
264
+
265
+ QgsRasterCalcNode node ( QgsRasterCalcNode::opPLUS, new QgsRasterCalcNode ( &m ), new QgsRasterCalcNode ( 5.0 ) );
266
+
267
+ QgsRasterMatrix result;
268
+ result.setNodataValue ( -9999 );
269
+ QMap<QString, QgsRasterMatrix*> rasterData;
270
+
271
+ QVERIFY ( node.calculate ( rasterData, result ) );
272
+
273
+ QCOMPARE ( result.data ()[0 ], 6.0 );
274
+ QCOMPARE ( result.data ()[1 ], 7.0 );
275
+ QCOMPARE ( result.data ()[2 ], 8.0 );
276
+ QCOMPARE ( result.data ()[3 ], 9.0 );
277
+ QCOMPARE ( result.data ()[4 ], 10.0 );
278
+ QCOMPARE ( result.data ()[5 ], -9999.0 );
279
+
280
+ // also check adding no data number
281
+ QgsRasterCalcNode nodeNoData ( QgsRasterCalcNode::opPLUS, new QgsRasterCalcNode ( &m ), new QgsRasterCalcNode ( -9999 ) );
282
+ QVERIFY ( nodeNoData.calculate ( rasterData, result ) );
283
+ QCOMPARE ( result.data ()[0 ], -9999.0 );
284
+ }
285
+
286
+ void TestQgsRasterCalculator::dualOpMatrixMatrix ()
287
+ {
288
+ // test dual op run on matrix and matrix
289
+ double * d = new double [6 ];
290
+ d[0 ] = 1.0 ;
291
+ d[1 ] = 2.0 ;
292
+ d[2 ] = -2.0 ;
293
+ d[3 ] = -1.0 ; // nodata
294
+ d[4 ] = 5.0 ;
295
+ d[5 ] = -1.0 ; // nodata
296
+ QgsRasterMatrix m1 ( 2 , 3 , d, -1.0 );
297
+
298
+ double * d2 = new double [6 ];
299
+ d2[0 ] = -1.0 ;
300
+ d2[1 ] = -2.0 ; // nodata
301
+ d2[2 ] = 13.0 ;
302
+ d2[3 ] = -2.0 ; // nodata
303
+ d2[4 ] = 15.0 ;
304
+ d2[5 ] = -1.0 ;
305
+ QgsRasterMatrix m2 ( 2 , 3 , d2, -2.0 ); // different no data value
306
+
307
+ QgsRasterCalcNode node ( QgsRasterCalcNode::opPLUS, new QgsRasterCalcNode ( &m1 ), new QgsRasterCalcNode ( &m2 ) );
308
+
309
+ QgsRasterMatrix result;
310
+ result.setNodataValue ( -9999 );
311
+ QMap<QString, QgsRasterMatrix*> rasterData;
312
+
313
+ QVERIFY ( node.calculate ( rasterData, result ) );
314
+
315
+ QCOMPARE ( result.data ()[0 ], 0.0 );
316
+ QCOMPARE ( result.data ()[1 ], -9999.0 );
317
+ QCOMPARE ( result.data ()[2 ], 11.0 );
318
+ QCOMPARE ( result.data ()[3 ], -9999.0 );
319
+ QCOMPARE ( result.data ()[4 ], 20.0 );
320
+ QCOMPARE ( result.data ()[5 ], -9999.0 );
321
+ }
322
+
323
+ void TestQgsRasterCalculator::rasterRefOp ()
324
+ {
325
+ // test single op run on raster ref
326
+ QgsRasterCalcNode node ( QgsRasterCalcNode::opSIGN, new QgsRasterCalcNode ( " raster" ), 0 );
327
+
328
+ QgsRasterMatrix result;
329
+ result.setNodataValue ( -9999 );
330
+ QMap<QString, QgsRasterMatrix*> rasterData;
331
+
332
+ // first test invalid raster ref
333
+ QVERIFY ( !node.calculate ( rasterData, result ) );
334
+
335
+ // now create raster ref
336
+ double * d = new double [6 ];
337
+ d[0 ] = 1.0 ;
338
+ d[1 ] = 2.0 ;
339
+ d[2 ] = 3.0 ;
340
+ d[3 ] = 4.0 ;
341
+ d[4 ] = 5.0 ;
342
+ d[5 ] = -1.0 ;
343
+ QgsRasterMatrix m ( 2 , 3 , d, -1.0 );
344
+ rasterData.insert ( " raster" , &m );
345
+
346
+ QVERIFY ( node.calculate ( rasterData, result ) );
347
+ QCOMPARE ( result.data ()[0 ], -d[0 ] );
348
+ QCOMPARE ( result.data ()[1 ], -d[1 ] );
349
+ QCOMPARE ( result.data ()[2 ], -d[2 ] );
350
+ QCOMPARE ( result.data ()[3 ], -d[3 ] );
351
+ QCOMPARE ( result.data ()[4 ], -d[4 ] );
352
+ QCOMPARE ( result.data ()[5 ], -9999.0 );
353
+ }
354
+
355
+ void TestQgsRasterCalculator::dualOpRasterRaster ()
356
+ {
357
+ // test dual op run on matrix and matrix
358
+ double * d = new double [6 ];
359
+ d[0 ] = 1.0 ;
360
+ d[1 ] = 2.0 ;
361
+ d[2 ] = -2.0 ;
362
+ d[3 ] = -1.0 ; // nodata
363
+ d[4 ] = 5.0 ;
364
+ d[5 ] = -1.0 ; // nodata
365
+ QgsRasterMatrix m1 ( 2 , 3 , d, -1.0 );
366
+ QMap<QString, QgsRasterMatrix*> rasterData;
367
+ rasterData.insert ( " raster1" , &m1 );
368
+
369
+ double * d2 = new double [6 ];
370
+ d2[0 ] = -1.0 ;
371
+ d2[1 ] = -2.0 ; // nodata
372
+ d2[2 ] = 13.0 ;
373
+ d2[3 ] = -2.0 ; // nodata
374
+ d2[4 ] = 15.0 ;
375
+ d2[5 ] = -1.0 ;
376
+ QgsRasterMatrix m2 ( 2 , 3 , d2, -2.0 ); // different no data value
377
+ rasterData.insert ( " raster2" , &m2 );
378
+
379
+ QgsRasterCalcNode node ( QgsRasterCalcNode::opPLUS, new QgsRasterCalcNode ( " raster1" ), new QgsRasterCalcNode ( " raster2" ) );
380
+
381
+ QgsRasterMatrix result;
382
+ result.setNodataValue ( -9999 );
383
+
384
+ QVERIFY ( node.calculate ( rasterData, result ) );
385
+ QCOMPARE ( result.data ()[0 ], 0.0 );
386
+ QCOMPARE ( result.data ()[1 ], -9999.0 );
387
+ QCOMPARE ( result.data ()[2 ], 11.0 );
388
+ QCOMPARE ( result.data ()[3 ], -9999.0 );
389
+ QCOMPARE ( result.data ()[4 ], 20.0 );
390
+ QCOMPARE ( result.data ()[5 ], -9999.0 );
391
+ }
392
+
181
393
QTEST_MAIN ( TestQgsRasterCalculator )
182
394
#include " testqgsrastercalculator.moc"
0 commit comments