On 23/05/13 10:26, Rainer M Krug wrote:

Hi

I have two raster layers

,----
| dc: CELL, 1, ..., 7, NULL
| ageClass: CELL, 1,2,3,NULL
`----

And I want to create a third one, depending on the value in a lookup table. dc 
corresponds to the row, ageClass to the column,

The lookup table looks as follow:

,----
|     seedling young adult
| dc1   425000 87500 37500
| dc2   270000 55000 23500
| dc3   127500 26000 11250
| dc4    32500  7100  3200
| dc5     5550  1220   500
| dc6      605   132    55
| dc7       56    12     6
`----

Now I want to have something like (using r.mapcalc as an example)

,----
| r.mapcalc expression = "result = lookupTable[col=ageClass, row=dc]"
`----

and e.g. for one cell

,----
| ageClass = 3
| dc = 5
| ==>
| result = 500
`----

I haven't found anything like this in GRASS.

I could use MASKS and then r.reclass(), or generate dynamically a
complex if() construct, but both options sound a little bit
awkward to me.

I am scripting GRASS from R, so there is always the option of doing it
in R, but there is the issue of reading the data into R and writing it
back to GRASS, which takes time. As I am doing this in a simulation
which runs several times, this is not an unimportant issue.

Is there better way of achieving this?

I don't see a possibility to include the lookup table into r.mapcalc, but anyway, IIUC, the result you are looking for is not a raster map, but a numerical value, or ?

My best first guess is:

r.stats -c in=dc,ageClass

possibly combined with a little awk to do the lookup:

r.stats -c in=dc,ageClass | awk '{if($1==5 && $2==3) print $3}'

Or, if the maps are heavy, feed the data resulting from the r.stats call into a new db table and then use sql queries to do the lookup. Or feed the results of r.stats into an R dataframe.

Moritz
_______________________________________________
grass-user mailing list
[email protected]
http://lists.osgeo.org/mailman/listinfo/grass-user

Reply via email to