[GRASS-user] How to implement 2D lookup table?

Rainer M. Krug Rainer at krugs.de
Thu May 23 02:04:00 PDT 2013


Moritz Lennert <mlennert at club.worldonline.be> writes:

> 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,

Me neither - that was just the easies to show what I want to do.

> but anyway, IIUC, the result you are looking for is not a raster map,
> but a numerical value, or ?

No - the lookup would be for each cell, therefore resulting in a CELL
raster map.

>
> 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.

Hmm - sounds interesting, but also for other purposes. But as the result
will be a raster map, I don't think this approach is usable here (unless
I can feed the numbers back into a raster map, i.e. the inverse of
r.stats -c)

Rainer

>
> Moritz


-- 
Rainer M. Krug
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 489 bytes
Desc: not available
URL: <http://lists.osgeo.org/pipermail/grass-user/attachments/20130523/7cb9e4b2/attachment-0001.pgp>


More information about the grass-user mailing list