[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