[GRASS-dev] problem with r.mapcalc in GRASS 7

Glynn Clements glynn at gclements.plus.com
Fri Jun 25 21:34:31 EDT 2010


Barton Michael wrote:

> I'm not sure if this is a general issues or something specific to my OS X 10.6.4 build.
> 
> I just updated and compiled trunk.
> 
> When I try to use r.mapcalc, I get the following error: ERROR: Unable to load GDAL library

This is related to the r.external support. GDAL should only be loaded
on demand, i.e. if you try to open or create a "linked" map.

You can eliminate the problem by unsetting GDAL_DYNAMIC, e.g.

	make GDAL_DYNAMIC= ...

This causes libraster to be linked against GDAL directly, rather than
loading it dynamically with dlopen(). However, this might cause other
problems. GDAL is written in C++, which means that simply loading it
will cause constructors to be executed.

FWIW, the list of candidate filenames is:

	libgdal.1.1.so
	gdal.1.0.so
	gdal.so.1.0
	libgdal.so.1
	libgdal.so

If GDAL is called something else, or isn't found by the loader (for
whatever reason), you'll get the error you describe. On Linux, the
library needs to either be in $LD_LIBRARY_PATH, or in the cache
created by ldconfig. I'm not familiar with the mechanisms used on OSX.

> I'm also not sure how to use the new syntax, as the manual is
> lacking in examples of the use of the "expression" argument.
> 
> Old mapcalc: 
> r.mapcalc 'newmap=oldmap*2'
> 
> New mapcalc: 
> r.mapcalc "newmap = oldmap*2"  [CORRECT? This gives the gdal error]
> r.mapcalc file=newmap expression="oldmap*2"  [This gives a parse error]

The expression= option is the first option, so you don't need to
specify expression= explicitly *provided* that the value won't itself
be mistaken for an option.

"newmap=oldmap*2" will be mistaken for an attempt to specify the
(non-existent) newmap= option, resulting in an error. Placing a space
before or after the "=" sign will prevent this, so the "CORRECT?" 
example above works (at least so far as the parser is concerned).

For maximum compatibility when invoking r.mapcalc, use e.g.:

	r.mapcalc "outmap = inmap"	# works with both 6.x and 7.0

rather than:

	r.mapcalc expr="outmap = inmap"	# won't work with 6.x
	r.mapcalc "outmap=inmap"	# won't work with 7.0
	r.mapcalc outmap = inmap	# won't work with 7.0

The file= option is used to specify a file containing r.mapcalc
expressions (file=- reads from stdin), so:

	r.mapcalc file=foo

is equivalent to:

	r.mapcalc < foo
or:
	cat foo | r.mapcalc

except that file= is more GUI-friendly.

If you specify both file= and expression=, file= takes precedence[1]. 
As "newmap" presumably doesn't contain valid r.mapcalc expressions,
your last example results in a parse error.

If you specify neither file= nor expression=, "file=-" (i.e. read
expressions from stdin) is used, for compatibility with previous
versions.

[1] Fixed in r42659; using both expression= and file= now generates an
error.

-- 
Glynn Clements <glynn at gclements.plus.com>


More information about the grass-dev mailing list