region.py 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on Fri May 25 12:57:10 2012
  4. @author: Pietro Zambelli
  5. """
  6. import ctypes
  7. import grass.lib.gis as libgis
  8. import grass.script as grass
  9. from errors import GrassError
  10. class Region(object):
  11. def __init__(self, default=False):
  12. """::
  13. >>> default = Region(default=True)
  14. >>> current = Region()
  15. >>> default == current
  16. True
  17. >>> current.cols
  18. 1500
  19. >>> current.ewres
  20. 10.0
  21. >>> current.cols = 3000
  22. >>> current.ewres
  23. 5.0
  24. >>> current.ewres = 20.0
  25. >>> current.cols
  26. 750
  27. >>> current.set_current()
  28. >>> default == current
  29. False
  30. >>> current.set_default()
  31. >>> default = Region(default=True)
  32. >>> default == current
  33. True
  34. >>> default
  35. Region(n=228500, s=215000, e=645000, w=630000, nsres=10, ewres=20)
  36. >>> current
  37. Region(n=228500, s=215000, e=645000, w=630000, nsres=10, ewres=20)
  38. >>> default.ewres = 10.
  39. >>> default.set_default()
  40. """
  41. self.c_region = ctypes.pointer(libgis.Cell_head())
  42. if default:
  43. self.get_default()
  44. else:
  45. self.get_current()
  46. def _set_param(self, key, value):
  47. grass.run_command('g.region', **{key: value})
  48. #----------LIMITS----------
  49. def _get_n(self):
  50. return self.c_region.contents.north
  51. def _set_n(self, value):
  52. self.c_region.contents.north = value
  53. north = property(fget=_get_n, fset=_set_n)
  54. def _get_s(self):
  55. return self.c_region.contents.south
  56. def _set_s(self, value):
  57. self.c_region.contents.south = value
  58. south = property(fget=_get_s, fset=_set_s)
  59. def _get_e(self):
  60. return self.c_region.contents.east
  61. def _set_e(self, value):
  62. self.c_region.contents.east = value
  63. east = property(fget=_get_e, fset=_set_e)
  64. def _get_w(self):
  65. return self.c_region.contents.west
  66. def _set_w(self, value):
  67. self.c_region.contents.west = value
  68. west = property(fget=_get_w, fset=_set_w)
  69. def _get_t(self):
  70. return self.c_region.contents.top
  71. def _set_t(self, value):
  72. self.c_region.contents.top = value
  73. top = property(fget=_get_t, fset=_set_t)
  74. def _get_b(self):
  75. return self.c_region.contents.bottom
  76. def _set_b(self, value):
  77. self.c_region.contents.bottom = value
  78. bottom = property(fget=_get_b, fset=_set_b)
  79. #----------RESOLUTION----------
  80. def _get_rows(self):
  81. return self.c_region.contents.rows
  82. def _set_rows(self, value):
  83. self.c_region.contents.rows = value
  84. self.adjust(rows=True)
  85. rows = property(fget=_get_rows, fset=_set_rows)
  86. def _get_cols(self):
  87. return self.c_region.contents.cols
  88. def _set_cols(self, value):
  89. self.c_region.contents.cols = value
  90. self.adjust(cols=True)
  91. cols = property(fget=_get_cols, fset=_set_cols)
  92. def _get_nsres(self):
  93. return self.c_region.contents.ns_res
  94. def _set_nsres(self, value):
  95. self.c_region.contents.ns_res = value
  96. self.adjust()
  97. nsres = property(fget=_get_nsres, fset=_set_nsres)
  98. def _get_ewres(self):
  99. return self.c_region.contents.ew_res
  100. def _set_ewres(self, value):
  101. self.c_region.contents.ew_res = value
  102. self.adjust()
  103. ewres = property(fget=_get_ewres, fset=_set_ewres)
  104. def _get_tbres(self):
  105. return self.c_region.contents.tb_res
  106. def _set_tbres(self, value):
  107. self.c_region.contents.tb_res = value
  108. self.adjust()
  109. tbres = property(fget=_get_tbres, fset=_set_tbres)
  110. @property
  111. def zone(self):
  112. return self.c_region.contents.zone
  113. @property
  114. def proj(self):
  115. return self.c_region.contents.proj
  116. #----------MAGIC METHODS----------
  117. def __repr__(self):
  118. return 'Region(n=%g, s=%g, e=%g, w=%g, nsres=%g, ewres=%g)' % (
  119. self.north, self.south, self.east, self.west,
  120. self.nsres, self.ewres)
  121. def __unicode__(self):
  122. return grass.pipe_command("g.region", flags="p").communicate()[0]
  123. def __str__(self):
  124. return self.__unicode__()
  125. def __eq__(self, reg):
  126. attrs = ['north', 'south', 'west', 'east', 'top', 'bottom',
  127. 'nsres', 'ewres', 'tbres']
  128. for attr in attrs:
  129. if getattr(self, attr) != getattr(reg, attr):
  130. return False
  131. return True
  132. #----------METHODS----------
  133. def zoom(self, raster_name):
  134. """Shrink region until it meets non-NULL data from this raster map:"""
  135. self._set_param('zoom', str(raster_name))
  136. def align(self, raster_name):
  137. """Adjust region cells to cleanly align with this raster map"""
  138. self._set_param('align', str(raster_name))
  139. def adjust(self, rows=False, cols=False):
  140. """Adjust rows and cols number according with the nsres and ewres
  141. resolutions. If rows or cols parameters are True, the adjust method
  142. update nsres and ewres according with the rows and cols numbers.
  143. """
  144. libgis.G_adjust_Cell_head(self.c_region, bool(rows), bool(cols))
  145. def get_current(self):
  146. libgis.G_get_set_window(self.c_region)
  147. def set_current(self):
  148. libgis.G_set_window(self.c_region)
  149. def get_default(self):
  150. libgis.G_get_window(self.c_region)
  151. def set_default(self):
  152. self.adjust()
  153. if libgis.G_put_window(self.c_region) < 0:
  154. raise GrassError("Cannot change region (WIND file).")