[gdal-dev] Map algebra
Even Rouault
even.rouault at spatialys.com
Sat Apr 2 05:15:01 PDT 2016
Le vendredi 01 avril 2016 10:38:48, Ari Jolma a écrit :
> I've got this into a rather nice working shape. The code needs to be
> reorganized (it is now, horror, all in header files) but that's another
> thing.
From the perspective of people wanting to use the core mechanisms to extend
with their own operations, that could be interesting I guess.
>
> I've so far built this around a basic DEM catchment analysis workflow.
> It includes many kinds of steps so it is a pretty good benchmark. In
> pseudo code the workflow is something like
>
> dem = open_from_file
> dem->fill_depressions
> fd = dem->compute_flow_directions
> fd->route_flat_cells
> ua = fd->compute_upstream_area
> c = new_raster // compute the catchment into this
> c->set_border_cells // we're interested in the outlet cells
> c *= ua
> c *= c > 10000 // we're interested in the big catchments
> outlets = c->get_cells // outlets is an array of cells, and a cell is an
> object containing (x,y,value)
> c = 0
> c->mark_catchment(fd, outlets[0], 1) // assuming the outlet cell is now
> in outlets[0]
> ua2 = new_raster // for visualization log of upstream area is nice
> ua2 += ua
> ua2->log
A few thoughts and questions :
- I guess what would be cool from the perspective of a C++ user is to be
really to write the above pseudo code with C++ operator overload when
appropriate ! A += B, A.min(B), min_A= A.min(), etc...
- There might be some numpy reinvention here... Or at least, it could perhaps
serve as an inspiration. I guess Python users would in priority use numpy for
the most basic operations. Of course the GIS specific methods would still be of
value.
- Saturation arithmetics could be interesting. numpy by default do wrapped
arithmetics, you have to cast to a larger type and clip down afterwards,
whereas OpenCV does it by default :
http://opencvpython.blogspot.fr/2012/06/difference-between-matrix-arithmetic-
in.html
- Are the methods handling 2 bands able to deal with different block sizes ?
- And with bands of different data types ?
- Why the need to reinvent a hashset mechanism ? Isn't std::set good enough ?
- Same for gma_array vs std::vector ?
- various methods take a void* argument, whereas it seems that could be
rewritten as datatype* for better type safety
- there seems to be a block cache mechanism. What is it for ? How does that
work ?
- there is some overlap/connection with the pixel functions of VRT ( see
"Using Derived Bands" of http://gdal.org/gdal_vrttut.html).
>
> The C code is of course not this nice but it is not very far from this.
> All the basic four method types I mention below are implemented and
> adding new methods is not very difficult. The code makes heavy use of
> templates and macros in an attempt for versatility (GDAL rasters can
> have many datatypes) and easiness to write methods in a few lines of
> code. The whole set of code is now ~2500 lines but it creates rather
> large executables due to templates. The code is C++ but the API is C
> like, I've so far done no changes to existing GDAL code because of this.
>
> As written below, the code works on two levels of x,y loops: the blocks
> within a band, which is generic and cells within a block, which is
> separate for each method. The methods work on line by line (no recursion
> etc.) and thus for example the fill_depressions is not optimal but
> instead very simple. Also, very large rasters can be processed.
>
> I think this may be somewhat similar thing in relation to GDAL as the
> network support, so it could be a thing to add to the library if wished.
>
> I've added RFC 62 "raster algebra" to spark discussion.
>
> Ari
>
> 20.03.2016, 10:21, Ari Jolma kirjoitti:
> > Folks,
> >
> > I played around a bit with the map algebra idea and came up with
> > something that could work nicely as a plugin. The initial code is at
> > https://github.com/ajolma/gdal/tree/trunk/gdal/map_algebra
> >
> > The idea is based on processing raster bands block by block and
> > calling a given function on each block. Using macros and templates the
> > code should be rather nice and manageable even when supporting
> > multiple data types for raster cells.
> >
> > Further, the idea is to support three kinds of map algebra methods,
> > mostly working on a raster band in-place.
> >
> > 1) Simple ones, which do not take any arguments beyond the raster band
> > itself, examples are functions like log, sin, rand.
> >
> > 2) Those which take one non-spatial argument. The argument can be a
> > scalar like a number, or more complex like a reclassifier.
> >
> > 3) Those which operate on two rasters. Examples are summation of
> > rasters and computing flow directions on a DEM. The latter is a bit
> > more complex since it is a focal method and requires a 3 x 3 matrix of
> > blocks from the other operand raster.
> >
> > Maybe a fourth kind of methods are those which compute something from
> > a raster.
> >
> > This would lead to four functions in the C API and raster band methods
> > in the bindings.
> >
> > Comments are welcome, the initial code base contains a small demo
> > program. Eventually, if this works, I'll make a RFC from this.
> >
> > Ari
>
> _______________________________________________
> gdal-dev mailing list
> gdal-dev at lists.osgeo.org
> http://lists.osgeo.org/mailman/listinfo/gdal-dev
--
Spatialys - Geospatial professional services
http://www.spatialys.com
More information about the gdal-dev
mailing list