test_v_rast_stats.py 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. """Test of r.univar
  2. @author Soeren Gebbert
  3. """
  4. from grass.gunittest.case import TestCase
  5. from grass.gunittest.gmodules import SimpleModule
  6. from grass.pygrass.vector import VectorTopo
  7. from grass.pygrass.vector.geometry import Line
  8. from grass.pygrass.vector.geometry import Boundary
  9. from grass.pygrass.vector.geometry import Centroid
  10. class TestRastStats(TestCase):
  11. @classmethod
  12. def setUpClass(cls):
  13. """Use temporary region settings"""
  14. cls.use_temp_region()
  15. @classmethod
  16. def tearDownClass(cls):
  17. """!Remove the temporary region"""
  18. cls.del_temp_region()
  19. def tearDown(self):
  20. self.runModule("g.remove", flags="f", type="raster", name="map_a")
  21. self.runModule("g.remove", flags="f", type="raster", name="map_b")
  22. self.runModule("g.remove", flags="f", type="raster", name="zone_map")
  23. self.runModule("g.remove", flags="f", type="raster", name="row_map")
  24. self.runModule("g.remove", flags="f", type="raster", name="test_line")
  25. def setUp(self):
  26. """Create input data"""
  27. self.runModule("g.region", res=1, n=90, s=0, w=0, e=90)
  28. self.runModule(
  29. "r.mapcalc", expression="map_a = 100 + row() + col()", overwrite=True
  30. )
  31. self.runModule(
  32. "r.mapcalc", expression="zone_map = if(row() < 20, 1,2)", overwrite=True
  33. )
  34. self.runModule("r.mapcalc", expression="row_map = row()", overwrite=True)
  35. self.runModule(
  36. "r.to.vect",
  37. input="zone_map",
  38. output="zone_map",
  39. type="area",
  40. overwrite=True,
  41. )
  42. cols = [("cat", "INTEGER PRIMARY KEY"), ("name", "VARCHAR(20)")]
  43. vt = VectorTopo("test_line")
  44. vt.open("w", tab_cols=cols)
  45. line1 = Line([(1, 1), (2, 1), (2, 2)])
  46. line2 = Line([(10, 20), (15, 22), (20, 32), (30, 40)])
  47. vt.write(line1, ("first",))
  48. vt.write(line2, ("second",))
  49. vt.table.conn.commit()
  50. vt.close()
  51. vt = VectorTopo("test_small_area")
  52. vt.open("w", tab_cols=cols)
  53. area1 = Boundary(points=[(0, 0), (0, 0.2), (0.2, 0.2), (0.2, 0), (0, 0)])
  54. area2 = Boundary(
  55. points=[(2.7, 2.7), (2.7, 2.8), (2.8, 2.8), (2.8, 2.7), (2.7, 2.7)]
  56. )
  57. cent1 = Centroid(x=0.1, y=0.1)
  58. cent2 = Centroid(x=2.75, y=2.75)
  59. vt.write(area1)
  60. vt.write(area2)
  61. vt.write(cent1, ("first",))
  62. vt.write(cent2, ("second",))
  63. vt.table.conn.commit()
  64. vt.close()
  65. def test_1(self):
  66. # Output of v.rast.stats
  67. univar_string = """cat|value|label|a_minimum|a_maximum|a_sum
  68. 1|1||102|209|265905
  69. 2|2||121|280|1281195
  70. """
  71. self.assertModule(
  72. "v.rast.stats",
  73. map="zone_map",
  74. raster="map_a",
  75. method=["minimum", "maximum", "sum"],
  76. flags="c",
  77. column_prefix="a",
  78. )
  79. v_db_select = SimpleModule("v.db.select", map="zone_map")
  80. self.runModule(v_db_select)
  81. self.assertLooksLike(univar_string, str(v_db_select.outputs.stdout))
  82. def test_line_d(self):
  83. output_str = """cat|name|a_median|a_number|a_range
  84. 1|first|192|3|1
  85. 2|second|181|41|6
  86. """
  87. self.assertModule(
  88. "v.rast.stats",
  89. map="test_line",
  90. raster="map_a",
  91. method=["median", "number", "range"],
  92. flags="dc",
  93. column_prefix="a",
  94. )
  95. v_db_select = SimpleModule("v.db.select", map="test_line")
  96. self.runModule(v_db_select)
  97. self.assertLooksLike(output_str, str(v_db_select.outputs.stdout))
  98. def test_line(self):
  99. output_str = """cat|name|a_median|a_number|a_range
  100. 1|first|192|5|2
  101. 2|second|181|27|5
  102. """
  103. self.assertModule(
  104. "v.rast.stats",
  105. map="test_line",
  106. raster="map_a",
  107. method=["median", "number", "range"],
  108. flags="c",
  109. column_prefix="a",
  110. )
  111. v_db_select = SimpleModule("v.db.select", map="test_line")
  112. self.runModule(v_db_select)
  113. self.assertLooksLike(output_str, str(v_db_select.outputs.stdout))
  114. def test_zone_all(self):
  115. # Output of v.rast.stats
  116. univar_string = """cat|value|label|a_number|a_null_cells|a_minimum|a_maximum|a_range|a_average|a_stddev|a_variance|a_coeff_var|a_sum|a_first_quartile|a_median|a_third_quartile|a_percentile_90
  117. 1|1||1710|0|102|209|107|155.5|26.5502667908755|704.916666666667|17.0741265536177|265905|133|155.5|178|191
  118. 2|2||6390|0|121|280|159|200.5|33.0895250293302|1094.91666666667|16.5035037552769|1281195|177|200.5|224|245
  119. """
  120. self.assertModule(
  121. "v.rast.stats", map="zone_map", raster="map_a", flags="c", column_prefix="a"
  122. )
  123. v_db_select = SimpleModule("v.db.select", map="zone_map")
  124. self.runModule(v_db_select)
  125. self.assertLooksLike(univar_string, str(v_db_select.outputs.stdout))
  126. def test_small_area_with_centroid(self):
  127. # Output of v.rast.stats
  128. univar_string = """cat|name|a_number|a_null_cells|a_minimum|a_maximum|a_range|a_average|a_stddev|a_variance|a_coeff_var|a_sum|a_first_quartile|a_median|a_third_quartile|a_percentile_90
  129. 1|first|1|0|90|90|0|90|0|0|0|90|90|90|90|90
  130. 2|second|1|0|88|88|0|88|0|0|0|88|88|88|88|88
  131. """
  132. self.assertModule(
  133. "v.rast.stats",
  134. map="test_small_area",
  135. raster="row_map",
  136. flags="c",
  137. column_prefix="a",
  138. type_=["area", "centroid"],
  139. )
  140. v_db_select = SimpleModule("v.db.select", map="test_small_area")
  141. self.runModule(v_db_select)
  142. self.assertLooksLike(univar_string, str(v_db_select.outputs.stdout))
  143. class TestRastStatsFails(TestCase):
  144. def test_error_handling_a(self):
  145. # No vector map
  146. self.assertModuleFail("v.rast.stats", raster="map_a", column_prefix="a")
  147. def test_error_handling_b(self):
  148. # No raster map
  149. self.assertModuleFail("v.rast.stats", map="zone_map", column_prefix="a")
  150. def test_error_handling_d(self):
  151. # No column_prefix
  152. self.assertModuleFail("v.rast.stats", map="zone_map", raster="map_b")
  153. def test_small_area_no_centroid_fails(self):
  154. # No categories in raster map
  155. self.assertModuleFail(
  156. "v.rast.stats",
  157. map="test_small_area",
  158. raster="row_map",
  159. flags="c",
  160. column_prefix="a",
  161. type_="area",
  162. )
  163. if __name__ == "__main__":
  164. from grass.gunittest.main import test
  165. test()