On Mon, Feb 16, 2015 at 10:50 PM, Paulo van Breugel
<p.vanbreu...@gmail.com> wrote:
> On Sat, Feb 14, 2015 at 7:29 PM, Vaclav Petras <wenzesl...@gmail.com> wrote:
>> On Sat, Feb 14, 2015 at 11:47 AM, Paulo van Breugel
>> <p.vanbreu...@gmail.com> wrote:
>>> For a quick solution, what about using r.tile to split the input data in
>>> tiles and compute the mahalanobis distance per tile.
>>
>> See PyGRASS GridModule class which will do tiling (and a lot of other
>> things) for you.
>>
>> http://grass.osgeo.org/grass70/manuals/libpython/pygrass.modules.grid.html
>
> The Grid Module does indeed what I want, except that I want to run a python
> function (the mahalanobis distance computation) on the tiles, while the
> GridModule requires a raster GRASS r.* command. Any way around that? Writing
> an intermediate addon/function that I can then call with the GridModule?

mhh the GridModule it is heavily using the Module interface, therefore
I think you should provide a module and then use the GridModule.

Therefore I wrote a function that do exactly what you are looking for:

{{{
import numpy as np

from grass.pygrass.gis.region import Region
from grass.pygrass.raster import RasterRow
from grass.pygrass.raster.buffer import Buffer
from grass.pygrass.utils import split_in_chunk


def mahalanobis_distance(array, param):
    # compute mahalanobis distance, here just a dummy computation
    dist = array / param
    return dist


def tiled_function(raster_input, raster_output, func,
                   out_mtype='DCELL', overwrite=False, nrows=100,
                   **kwargs):
    reg = Region()
    with RasterRow(raster_input, mode='r') as rinp:
        with RasterRow(raster_output, mode='w', mtype=out_mtype) as rout:
            buf = Buffer((reg.cols, ), mtype=out_mtype)  # take a row buffer
            for chunk in split_in_chunk(rinp, nrows):
                ichunk = np.array(chunk)
                for row in func(ichunk, **kwargs):
                    buf[:] = row[:]
                    rout.put_row(buf)


tiled_function('elevation', 'distance', mahalanobis_distance,
               overwrite=True, param=2.)
}}}

I'm not sure where should I put this function, maybe in pygrass.raster
or in pygrass.utils (but the last one it is a bit generic...).

All the best

Pietro
_______________________________________________
grass-dev mailing list
grass-dev@lists.osgeo.org
http://lists.osgeo.org/mailman/listinfo/grass-dev

Reply via email to