[GRASS-user] r3.mapcalc / r.mapcalc: Logical Operators &&, || behave differently

"Peter Löwe" peter.loewe at gmx.de
Wed Aug 20 14:05:13 PDT 2014


Glynn,

thanks for your quick response:
You are of course correct regarding the non-null/non-zero aspects and I stand corrected for the substellar cut'n past blunder :-)

Yet still I'm puzzled, as I hoped that type casting to INT would do the trick:

r3.mapcalc l01i='int(l01)'
r3.mapcalc l02i='int(l02)'

GRASS 6.4.2 (utm10n_wgs84):~ > r3.mapcalc "FOO3 = if((l01i || l02i),42,null())"
Incorrect argument types to function or()
Parse error

same here:
GRASS 6.4.2 (utm10n_wgs84):~ > r3.mapcalc "FOO3 = if((l01i && l02i),42,null())"
Incorrect argument types to function and()
Parse error

FWIW, the volumes are quite trivial:
GRASS 6.4.2 (utm10n_wgs84):~ > r3.info l01i
 +----------------------------------------------------------------------------+
 | Layer:    l01i                           Date: Wed Aug 20 22:32:46 2014    |
 | Mapset:   PERMANENT                      Login of Creator: ploewe          |
 | Location: utm10n_wgs84                                                     |
 | DataBase: /home/cegit/ploewe/geodata/locations                             |
 | Title:     ( l01i )                                                        |
 | Timestamp: none                                                            |
 |----------------------------------------------------------------------------|
 |                                                                            |
 |   Type of Map:  3d cell              Number of Categories: 0               |
 |   Data Type:    double                                                     |
 |   Rows:         1400                                                       |
 |   Columns:      979                                                        |
 |   Depths:       188                                                        |
 |   Total Cells:  257672800                                                  |
 |        Projection: UTM (zone 10)                                           |
 |            N:    5121985    S:    5107985   Res:    10                     |
 |            E:     567605    W:     557815   Res:    10                     |
 |            T:       2550    B:        670   Res:    10                     |
 |   Range of data:   min =          1 max =          1                       |
 |                                                                            |
 |   Data Source:                                                             |
 |                                                                            |
 |                                                                            |
 |                                                                            |
 |   Data Description:                                                        |
 |    generated by r3.mapcalc                                                 |
 |                                                                            |
 |   Comments:                                                                |
 |    r3.mapcalc                                                              |
 |                                                                            |
 +----------------------------------------------------------------------------+

Any further advice would be much appreciated.

Best,
Peter


<peter.loewe at gmx.de>


> Gesendet: Mittwoch, 20. August 2014 um 22:14 Uhr
> Von: "Glynn Clements" <glynn at gclements.plus.com>
> An: "Peter Löwe" <peter.loewe at gmx.de>
> Cc: grass-user at lists.osgeo.org
> Betreff: Re: [GRASS-user] r3.mapcalc / r.mapcalc: Logical Operators &&, || behave differently
>
> 
> "Peter Löwe" wrote:
> 
> > for r3.mapcalc and r.mapcalc, there seems to be a difference
> > regarding the logical operators (&& ||, etc.):
> > 
> > Assuming that two raster maps BAR and BAZ exist, the following
> > statement creates new map content FOO whenever BAZ and BAR are not
> > null:
> > 
> > r.mapcalc FOO='if((BAZ && BAR),42,null())'
> 
> Not quite.
> 
> The result will be 42 if both BAZ and BAR are non-null and non-zero. 
> If either are null or either are zero, the result will be null.
> 
> Regarding &&:
> 
> * A && B is null if either A or B are null, otherwise ...
> 
> * A && B is zero if either A or B are zero, otherwise ...
> 
> * A && B is one.
> 
> Regarding if():
> 
> * if(A,B,C) is null if A is null, otherwise ...
> 
> * if(A,B,C) is B if A is non-zero, otherwise ...
> 
> * if(A,B,C) is C
> 
> So if either BAZ or BAR are null, (BAZ && BAR) will be null and the
> if() function will evaluate to null regardless of its second and third
> arguments.
> 
> If neither are null, then (BAZ && BAR) will be 0 if either BAZ or BAR
> are zero, and 1 if both are non-zero.
> 
> > Doing the same with volumes (BAZ3, BAR3) results in an error message:
> > 
> > r3.mapcalc FOO3='if((BAZ3 && BAR3),42,null())'
> 
> FWIW, you should change the quoting to:
> 
> 	r3.mapcalc 'FOO3 = if((BAZ3 && BAR3),42,null())'
> 
> This will work in both 6.x and 7.x, whereas your original version will
> only work in 6.x (in 7.x, r.mapcalc/r3.mapcalc use the GRASS argument
> parser, so the expression musn't match the "option=value" syntax;
> adding spaces around the "=" avoids this issue).
> 
> > =>
> > 
> > Incorrect argument types to function or()
> > Parse error
> > 
> > Where's my mistake ?
> 
> I suspect that either BAZ3 or BAR3 is a floating-point volume. The
> arguments to logical operators must be integers.
> 
> Also, I don't see how you can get a reference to "or()" from an
> expression involving only "&&".
> 
> -- 
> Glynn Clements <glynn at gclements.plus.com>
>


More information about the grass-user mailing list