5

I have two grids, grid A representing observed extents of flooding and grid B representing simulated extents from a hydraulic model. The rasters have the same extent and grid size.

I want to be able to compare each pixel and create a new raster with 4 unique values (A/B/C/D equivalent in the table below) to show the difference between the two rasters:

enter image description here

If this was a shapefile field calculator problem I'd use a CASE logic like the one below but I'm struggling to identify a QGIS raster-based equivalent. Can anyone suggest anything I could try?

CASE
    WHEN "Modelled" > 0 AND "Observed" > 0 THEN D
    WHEN "Modelled" = 0 AND "Observed" > 0 THEN C
    WHEN "Modelled" > 0 AND "Observed" = 0 THEN B
    WHEN "Modelled" = 0 AND "Observed" = 0 THEN A
END
5
  • Hi, have you tried the Raster Calculator? You can add many different expression with a similar syntax to that one of the vector Field Calculator
    – matteo
    Sep 21, 2016 at 12:43
  • As far as I can see the standard raster calculator doesn't support CASE/ELSE or IF/ELSE statements. SAGA grid calculator will support IF/ELSE but won't allow chaining of statements together; for example A>0 AND B>0. Sep 21, 2016 at 12:53
  • you are right, but maybe you can achieve want you are looking for, with some logic statement. Maybe this answer can help you: gis.stackexchange.com/questions/48752/…
    – matteo
    Sep 21, 2016 at 12:58
  • I tried that but grid calc seems to fall over with the AND used in "eq(g1>0 AND g2>0" - I'll explore some more. Sep 21, 2016 at 13:40
  • @EdRollason - I forgot that AND isn't used. Try something like: ifelse(gt(a,0)+gt(b,0),400,ifelse(eq(a,0)+gt(b,0),300,ifelse(gt(a,0)+eq(b,0),200,ifelse(eq(a,0)+eq(b,0),100,0))))
    – Joseph
    Sep 21, 2016 at 14:54

1 Answer 1

4

You can use the QGIS raster calculator for this, using boolean masks. An example:

(("grid1@1">0) AND ("grid2@1">0)) * 1
+ (("grid1@1"=0) AND ("grid2@1">0)) * 2
+ (("grid1@1">0) AND ("grid2@1"=0)) * 3
+ (("grid1@1"=0) AND ("grid2@1"=0)) * 4

where you can change 1, 2, 3, and 4 to be whatever values you like.

The way that this works is that the first part of each term is a boolean mask. ("grid1@1">0) AND ("grid2@1">0)) is True when your first condition is met, and it can be multiplied by your categorical value D (I used 1). The next three terms match your next three conditions.

Note

Steven Kay notes in the comments that the same expression can be performed without using AND by replacing it with a *. In this case, the first term looks like

(("grid1@1">0) * ("grid2@1">0)) * 1
5
  • 1
    good answer, certainly works in 2.16. I think some older versions don't support AND, but you can replace AND with *, as QGIS treats false as 0 and true as 1. OR is slightly trickier, but you can use + and check that the answer > 0.
    – Steven Kay
    Oct 1, 2016 at 12:50
  • Older versions didn't support the AND so I'd looked elsewhere as I couldn't get the more complex syntax to work. Good to know they've added it. I'll test this out on the data. Thanks Oct 3, 2016 at 13:39
  • I can confirm that replacing AND with * returns identical results, at least in QGIS 2.16.
    – Nat Wilson
    Oct 3, 2016 at 15:29
  • My syntax must have been wrong I guess! Oct 4, 2016 at 8:22
  • This took me a while to check but this definitely works in 2.16. Nov 1, 2016 at 14:26

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.