GRASS Programmer's Manual  6.4.2(2012)
array.py
Go to the documentation of this file.
00001 """!@package grass.script.array
00002 
00003 @brief GRASS Python scripting module (rasters with numpy)
00004 
00005 Functions to use GRASS rasters with NumPy.
00006 
00007 Usage:
00008 
00009 @code
00010     map = 'elevation'
00011     x = garray.array()
00012     x.read(map)
00013     # calculate something on array
00014     x[...] = x / 50.
00015     x.write(map + ".new")
00016 @endcode
00017 
00018 (C) 2010-2011 by Glynn Clements and the GRASS Development Team
00019 This program is free software under the GNU General Public
00020 License (>=v2). Read the file COPYING that comes with GRASS
00021 for details.
00022 
00023 @author Glynn Clements
00024 """
00025 
00026 import os
00027 import numpy
00028 
00029 import core as grass
00030 
00031 # i18N
00032 import gettext
00033 gettext.install('grasslibs', os.path.join(os.getenv("GISBASE"), 'locale'), unicode = True)
00034 
00035 class array(numpy.memmap):
00036     def __new__(cls, dtype = numpy.double):
00037         """!Define new numpy array
00038 
00039         @param cls
00040         @param dtype data type (default: numpy.double)
00041         """
00042         reg = grass.region()
00043         r = reg['rows']
00044         c = reg['cols']
00045         shape = (r, c)
00046         
00047         filename = grass.tempfile()
00048         
00049         self = numpy.memmap.__new__(
00050             cls,
00051             filename = filename,
00052             dtype = dtype,
00053             mode = 'w+',
00054             shape = shape)
00055         
00056         self.filename = filename
00057         return self
00058     
00059     def _close(self):
00060         numpy.memmap._close(self)
00061         if isinstance(self, array):
00062             grass.try_remove(self.filename)
00063 
00064     def read(self, mapname, null = None):
00065         """!Read raster map into array
00066 
00067         @param mapname name of raster map to be read
00068         @param null null value
00069 
00070         @return 0 on success
00071         @return non-zero code on failure
00072         """
00073         kind = self.dtype.kind
00074         size = self.dtype.itemsize
00075         
00076         if kind == 'f':
00077             flags = 'f'
00078         elif kind in 'biu':
00079             flags = 'i'
00080         else:
00081             raise ValueError(_('Invalid kind <%s>') % kind)
00082         
00083         if size not in [1,2,4,8]:
00084             raise ValueError(_('Invalid size <%d>') % size)
00085         
00086         return grass.run_command(
00087             'r.out.bin',
00088             flags = flags,
00089             input = mapname,
00090             output = self.filename,
00091             bytes = size,
00092             null = null,
00093             quiet = True)
00094         
00095     def write(self, mapname, title = None, null = None, overwrite = None):
00096         """!Write array into raster map
00097 
00098         @param mapname name for raster map
00099         @param title title for raster map
00100         @param null null value
00101         @param overwrite True for overwritting existing raster maps
00102 
00103         @return 0 on success
00104         @return non-zero code on failure
00105         """
00106         kind = self.dtype.kind
00107         size = self.dtype.itemsize
00108         
00109         if kind == 'f':
00110             if size == 4:
00111                 flags = 'f'
00112             elif size == 8:
00113                 flags = 'd'
00114             else:
00115                 raise ValueError(_('Invalid FP size <%d>') % size)
00116             size = None
00117         elif kind in 'biu':
00118             if size not in [1,2,4]:
00119                 raise ValueError(_('Invalid integer size <%d>') % size)
00120             flags = None
00121         else:
00122             raise ValueError(_('Invalid kind <%s>') % kind)
00123         
00124         reg = grass.region()
00125         
00126         return grass.run_command(
00127             'r.in.bin',
00128             flags = flags,
00129             input = self.filename,
00130             output = mapname,
00131             title = title,
00132             bytes = size,
00133             anull = null,
00134             overwrite = overwrite,
00135             verbose = True,
00136             north = reg['n'],
00137             south = reg['s'],
00138             east  = reg['e'],
00139             west  = reg['w'],
00140             rows  = reg['rows'],
00141             cols  = reg['cols'])
00142     
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines