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:5121985S:5107985 Res:10 |
|E: 567605W: 557815 Res:10 |
|T: 2550B: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.lo...@gmx.de
Gesendet: Mittwoch, 20. August 2014 um 22:14 Uhr
Von: Glynn Clements gl...@gclements.plus.com
An: Peter Löwe peter.lo...@gmx.de
Cc: grass-user@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