array.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  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. class array(numpy.memmap):
  19. def __new__(cls, dtype = numpy.double):
  20. """!Define new numpy array
  21. @param cls
  22. @param dtype data type (default: numpy.double)
  23. """
  24. reg = grass.region()
  25. r = reg['rows']
  26. c = reg['cols']
  27. shape = (r, c)
  28. filename = grass.tempfile()
  29. self = numpy.memmap.__new__(
  30. cls,
  31. filename = filename,
  32. dtype = dtype,
  33. mode = 'w+',
  34. shape = shape)
  35. self.filename = filename
  36. return self
  37. def _close(self):
  38. numpy.memmap._close(self)
  39. if isinstance(self, array):
  40. grass.try_remove(self.filename)
  41. def read(self, mapname, null = None):
  42. """!Read raster map into array
  43. @param mapname name of raster map to be read
  44. @param null null value
  45. @return 0 on success
  46. @return non-zero code on failure
  47. """
  48. kind = self.dtype.kind
  49. size = self.dtype.itemsize
  50. if kind == 'f':
  51. flags = 'f'
  52. elif kind in 'biu':
  53. flags = 'i'
  54. else:
  55. raise ValueError(_('Invalid kind <%s>') % kind)
  56. if size not in [1,2,4,8]:
  57. raise ValueError(_('Invalid size <%d>') % size)
  58. return grass.run_command(
  59. 'r.out.bin',
  60. flags = flags,
  61. input = mapname,
  62. output = self.filename,
  63. bytes = size,
  64. null = null,
  65. quiet = True)
  66. def write(self, mapname, title = None, null = None, overwrite = None):
  67. """!Write array into raster map
  68. @param mapname name for raster map
  69. @param title title for raster map
  70. @param null null value
  71. @param overwrite True for overwritting existing raster maps
  72. @return 0 on success
  73. @return non-zero code on failure
  74. """
  75. kind = self.dtype.kind
  76. size = self.dtype.itemsize
  77. if kind == 'f':
  78. if size == 4:
  79. flags = 'f'
  80. elif size == 8:
  81. flags = 'd'
  82. else:
  83. raise ValueError(_('Invalid FP size <%d>') % size)
  84. size = None
  85. elif kind in 'biu':
  86. if size not in [1,2,4]:
  87. raise ValueError(_('Invalid integer size <%d>') % size)
  88. flags = None
  89. else:
  90. raise ValueError(_('Invalid kind <%s>') % kind)
  91. reg = grass.region()
  92. return grass.run_command(
  93. 'r.in.bin',
  94. flags = flags,
  95. input = self.filename,
  96. output = mapname,
  97. title = title,
  98. bytes = size,
  99. anull = null,
  100. overwrite = overwrite,
  101. verbose = True,
  102. north = reg['n'],
  103. south = reg['s'],
  104. east = reg['e'],
  105. west = reg['w'],
  106. rows = reg['rows'],
  107. cols = reg['cols'])