array.py 2.2 KB

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