array.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. """!@package grass.script.array
  2. @brief GRASS Python scripting module
  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 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. reg = grass.region()
  24. r = reg['rows']
  25. c = reg['cols']
  26. shape = (r, c)
  27. filename = grass.tempfile()
  28. self = numpy.memmap.__new__(
  29. cls,
  30. filename = filename,
  31. dtype = dtype,
  32. mode = 'w+',
  33. shape = shape)
  34. self.filename = filename
  35. return self
  36. def _close(self):
  37. numpy.memmap._close(self)
  38. if isinstance(self, array):
  39. grass.try_remove(self.filename)
  40. def read(self, mapname, null = None):
  41. kind = self.dtype.kind
  42. size = self.dtype.itemsize
  43. if kind == 'f':
  44. flags = 'f'
  45. elif kind in 'biu':
  46. flags = 'i'
  47. else:
  48. raise ValueError(_('invalid kind <%s>') % kind)
  49. if size not in [1,2,4,8]:
  50. raise ValueError(_('invalid size <%d>') % size)
  51. return grass.run_command(
  52. 'r.out.bin',
  53. flags = flags,
  54. input = mapname,
  55. output = self.filename,
  56. bytes = size,
  57. null = null,
  58. quiet = True)
  59. def write(self, mapname, title = None, null = None, overwrite = None):
  60. kind = self.dtype.kind
  61. size = self.dtype.itemsize
  62. if kind == 'f':
  63. if size == 4:
  64. flags = 'f'
  65. elif size == 8:
  66. flags = 'd'
  67. else:
  68. raise ValueError(_('invalid FP size <%d>') % size)
  69. size = None
  70. elif kind in 'biu':
  71. if size not in [1,2,4]:
  72. raise ValueError(_('invalid integer size <%d>') % size)
  73. flags = None
  74. else:
  75. raise ValueError(_('invalid kind <%s>') % kind)
  76. reg = grass.region()
  77. return grass.run_command(
  78. 'r.in.bin',
  79. flags = flags,
  80. input = self.filename,
  81. output = mapname,
  82. title = title,
  83. bytes = size,
  84. anull = null,
  85. overwrite = overwrite,
  86. verbose = True,
  87. north = reg['n'],
  88. south = reg['s'],
  89. east = reg['e'],
  90. west = reg['w'],
  91. rows = reg['rows'],
  92. cols = reg['cols'])