GRASS Programmer's Manual
6.4.2(2012)
|
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