array.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. """!@package grass.script.array
  2. @brief GRASS Python scripting module (rasters with numpy)
  3. Functions to use GRASS rasters with NumPy.
  4. Usage:
  5. @code
  6. from grass.script import array as garray
  7. ...
  8. @endcode
  9. (C) 2010-2011 by Glynn Clements and the GRASS Development Team
  10. This program is free software under the GNU General Public
  11. License (>=v2). Read the file COPYING that comes with GRASS
  12. for details.
  13. @author Glynn Clements
  14. """
  15. import os
  16. import numpy
  17. import core as grass
  18. # i18N
  19. import gettext
  20. gettext.install('grasslibs', os.path.join(os.getenv("GISBASE"), 'locale'), unicode = True)
  21. class array(numpy.memmap):
  22. def __new__(cls, dtype = numpy.double):
  23. """!Define new numpy array
  24. @param cls
  25. @param dtype data type (default: numpy.double)
  26. """
  27. reg = grass.region()
  28. r = reg['rows']
  29. c = reg['cols']
  30. shape = (r, c)
  31. filename = grass.tempfile()
  32. self = numpy.memmap.__new__(
  33. cls,
  34. filename = filename,
  35. dtype = dtype,
  36. mode = 'w+',
  37. shape = shape)
  38. self.filename = filename
  39. return self
  40. def _close(self):
  41. numpy.memmap._close(self)
  42. if isinstance(self, array):
  43. grass.try_remove(self.filename)
  44. def read(self, mapname, null = None):
  45. """!Read raster map into array
  46. @param mapname name of raster map to be read
  47. @param null null value
  48. @return 0 on success
  49. @return non-zero code on failure
  50. """
  51. kind = self.dtype.kind
  52. size = self.dtype.itemsize
  53. if kind == 'f':
  54. flags = 'f'
  55. elif kind in 'biu':
  56. flags = 'i'
  57. else:
  58. raise ValueError(_('Invalid kind <%s>') % kind)
  59. if size not in [1,2,4,8]:
  60. raise ValueError(_('Invalid size <%d>') % size)
  61. return grass.run_command(
  62. 'r.out.bin',
  63. flags = flags,
  64. input = mapname,
  65. output = self.filename,
  66. bytes = size,
  67. null = null,
  68. quiet = True)
  69. def write(self, mapname, title = None, null = None, overwrite = None):
  70. """!Write array into raster map
  71. @param mapname name for raster map
  72. @param title title for raster map
  73. @param null null value
  74. @param overwrite True for overwritting existing raster maps
  75. @return 0 on success
  76. @return non-zero code on failure
  77. """
  78. kind = self.dtype.kind
  79. size = self.dtype.itemsize
  80. if kind == 'f':
  81. if size == 4:
  82. flags = 'f'
  83. elif size == 8:
  84. flags = 'd'
  85. else:
  86. raise ValueError(_('Invalid FP size <%d>') % size)
  87. size = None
  88. elif kind in 'biu':
  89. if size not in [1,2,4]:
  90. raise ValueError(_('Invalid integer size <%d>') % size)
  91. flags = None
  92. else:
  93. raise ValueError(_('Invalid kind <%s>') % kind)
  94. reg = grass.region()
  95. return grass.run_command(
  96. 'r.in.bin',
  97. flags = flags,
  98. input = self.filename,
  99. output = mapname,
  100. title = title,
  101. bytes = size,
  102. anull = null,
  103. overwrite = overwrite,
  104. verbose = True,
  105. north = reg['n'],
  106. south = reg['s'],
  107. east = reg['e'],
  108. west = reg['w'],
  109. rows = reg['rows'],
  110. cols = reg['cols'])