[GRASS-user] What's wrong with this r.mapcalc usage?
Tom Russo
russo at bogodyn.org
Thu Jan 31 09:07:02 EST 2008
On Thu, Jan 31, 2008 at 09:11:39AM +0000, we recorded a bogon-computron collision of the <glynn at gclements.plus.com> flavor, containing:
>
> Tom Russo wrote:
>
> > The other day I tried to perform an operation with r.mapcalc that didn't
> > work the way I expected.
> >
[...]
> >
> > if(!isnull(SAO),
> > if(!isnull(A)&&A>=11000,
> > 1,
> > if(!isnull(B)&&B>=11000,
> > 1,
> > null()
> > )
> > ),
> > null()
> > )
[...]
>
> It's not so much an issue with the way that if() works (although that
> is a factor), but mainly with the way that && and || work.
>
> If A is null, then !isnull(A) is false and A>=11000 is null (not
> false). The result of "false && null" is null (not false[1]), and the
> result of if(null,...) is always null.
>
> [1] This is presumably the part that caught you out.
Yep. That's it. My C/C++ background caught me, coz in those languages
the right-hand operand of && isn't evaluated if the left-hand operand is
false.
> The behaviour of && and || is consistent with most other infix
> operators operators, insofar as they return null if either argument is
> null.
>
> In newer versions of r.mapcalc (I don't recall exactly which
> versions), you can use the &&& and ||| operators, which behave like &&
> and || except that they follow the common boolean equivalences:
Yes, I saw that &&& and ||| existed in my version of r.mapcalc, but didn't
RTFM carefully enough to realize they were what I wanted.
> Finally, even with these changes, your r.mapcalc expression isn't
> quite the same as the r.patch+r.mapcalc combination, as you're
> treating A<11000 the same as null, whereas r.patch only cares about
> null/non-null. So, if both A and B are non-null, A<11000 and B>=11000,
> you'll get null from r.mapcalc but 1 from r.patch+r.mapcalc. OTOH, if
> A and B are disjoint (I'm not sure from your description), then it
> doesn't make any difference.
Yes, A and B are disjoint DEMs of adjoining USGS quadrangles.
--
Tom Russo KM5VY SAR502 DM64ux http://www.swcp.com/~russo/
Tijeras, NM QRPL#1592 K2#398 SOC#236 AHTB#1 http://kevan.org/brain.cgi?DDTNM
"And, isn't sanity really just a one-trick pony anyway? I mean all you get is
one trick, rational thinking, but when you're good and crazy, oooh, oooh,
oooh, the sky is the limit!" --- The Tick
More information about the grass-user
mailing list