test_register_function.py 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392
  1. """Unit test to register raster maps with absolute and relative
  2. time using tgis.register_maps_in_space_time_dataset()
  3. (C) 2013 by the GRASS Development Team
  4. This program is free software under the GNU General Public
  5. License (>=v2). Read the file COPYING that comes with GRASS
  6. for details.
  7. :authors: Soeren Gebbert
  8. """
  9. import grass.temporal as tgis
  10. from grass.gunittest.case import TestCase
  11. from grass.gunittest.main import test
  12. import datetime
  13. import os
  14. class TestRegisterFunctions(TestCase):
  15. @classmethod
  16. def setUpClass(cls):
  17. """Initiate the temporal GIS and set the region
  18. """
  19. os.putenv("GRASS_OVERWRITE", "1")
  20. # Use always the current mapset as temporal database
  21. cls.runModule("g.gisenv", set="TGIS_USE_CURRENT_MAPSET=1")
  22. tgis.init()
  23. cls.use_temp_region()
  24. cls.runModule('g.region', n=80.0, s=0.0, e=120.0, w=0.0,
  25. t=1.0, b=0.0, res=10.0)
  26. @classmethod
  27. def tearDownClass(cls):
  28. """Remove the temporary region
  29. """
  30. cls.del_temp_region()
  31. def setUp(self):
  32. """Create the test maps and the space time raster datasets
  33. """
  34. self.runModule("r.mapcalc", overwrite=True, quiet=True,
  35. expression="register_map_1 = 1")
  36. self.runModule("r.mapcalc", overwrite=True, quiet=True,
  37. expression="register_map_2 = 2")
  38. self.strds_abs = tgis.open_new_stds(name="register_test_abs", type="strds", temporaltype="absolute",
  39. title="Test strds", descr="Test strds", semantic="field",
  40. overwrite=True)
  41. self.strds_rel = tgis.open_new_stds(name="register_test_rel", type="strds", temporaltype="relative",
  42. title="Test strds", descr="Test strds", semantic="field",
  43. overwrite=True)
  44. def tearDown(self):
  45. """Remove maps from temporal database
  46. """
  47. self.runModule("t.unregister", maps="register_map_1,register_map_2", quiet=True)
  48. self.runModule("g.remove", flags='f', type="raster", name="register_map_1,register_map_2", quiet=True)
  49. self.strds_abs.delete()
  50. self.strds_rel.delete()
  51. def test_absolute_time_strds_1(self):
  52. """Test the registration of maps with absolute time in a
  53. space time raster dataset
  54. """
  55. tgis.register_maps_in_space_time_dataset(type="raster", name=self.strds_abs.get_name(),
  56. maps="register_map_1,register_map_2",
  57. start="2001-01-01", increment="1 day", interval=True)
  58. map = tgis.RasterDataset("register_map_1@" + tgis.get_current_mapset())
  59. map.select()
  60. start, end = map.get_absolute_time()
  61. self.assertEqual(start, datetime.datetime(2001, 1, 1))
  62. self.assertEqual(end, datetime.datetime(2001, 1, 2))
  63. map = tgis.RasterDataset("register_map_2@" + tgis.get_current_mapset())
  64. map.select()
  65. start, end = map.get_absolute_time()
  66. self.assertEqual(start, datetime.datetime(2001, 1, 2))
  67. self.assertEqual(end, datetime.datetime(2001, 1, 3))
  68. self.strds_abs.select()
  69. start, end = self.strds_abs.get_absolute_time()
  70. self.assertEqual(start, datetime.datetime(2001, 1, 1))
  71. self.assertEqual(end, datetime.datetime(2001, 1, 3))
  72. def test_absolute_time_strds_2(self):
  73. """Test the registration of maps with absolute time in a
  74. space time raster dataset.
  75. The timestamps are set using the C-Interface beforehand, so that the register function needs
  76. to read the timetsamp from the map metadata.
  77. """
  78. ciface = tgis.get_tgis_c_library_interface()
  79. ciface.write_raster_timestamp("register_map_1", tgis.get_current_mapset(), "1 Jan 2001/2 Jan 2001")
  80. ciface.write_raster_timestamp("register_map_2", tgis.get_current_mapset(), "2 Jan 2001/3 Jan 2001")
  81. tgis.register_maps_in_space_time_dataset(type="raster", name=self.strds_abs.get_name(),
  82. maps="register_map_1,register_map_2")
  83. map = tgis.RasterDataset("register_map_1@" + tgis.get_current_mapset())
  84. map.select()
  85. start, end = map.get_absolute_time()
  86. self.assertEqual(start, datetime.datetime(2001, 1, 1))
  87. self.assertEqual(end, datetime.datetime(2001, 1, 2))
  88. map = tgis.RasterDataset("register_map_2@" + tgis.get_current_mapset())
  89. map.select()
  90. start, end = map.get_absolute_time()
  91. self.assertEqual(start, datetime.datetime(2001, 1, 2))
  92. self.assertEqual(end, datetime.datetime(2001, 1, 3))
  93. self.strds_abs.select()
  94. start, end = self.strds_abs.get_absolute_time()
  95. self.assertEqual(start, datetime.datetime(2001, 1, 1))
  96. self.assertEqual(end, datetime.datetime(2001, 1, 3))
  97. def test_absolute_time_strds_3(self):
  98. """Test the registration of maps with absolute time in a
  99. space time raster dataset. The timestamps are set via method arguments and with the
  100. c-interface. The timestamps of the method arguments should overwrite the
  101. time stamps set via the C-interface.
  102. """
  103. ciface = tgis.get_tgis_c_library_interface()
  104. ciface.write_raster_timestamp("register_map_1", tgis.get_current_mapset(), "1 Jan 2001/2 Jan 2001")
  105. tgis.register_maps_in_space_time_dataset(type="raster", name=self.strds_abs.get_name(),
  106. maps="register_map_1",
  107. start="2001-02-01", increment="1 day",
  108. interval=True)
  109. map = tgis.RasterDataset("register_map_1@" + tgis.get_current_mapset())
  110. map.select()
  111. start, end = map.get_absolute_time()
  112. self.assertEqual(start, datetime.datetime(2001, 2, 1))
  113. self.assertEqual(end, datetime.datetime(2001, 2, 2))
  114. self.strds_abs.select()
  115. start, end = self.strds_abs.get_absolute_time()
  116. self.assertEqual(start, datetime.datetime(2001, 2, 1))
  117. self.assertEqual(end, datetime.datetime(2001, 2, 2))
  118. def test_absolute_time_strds_4(self):
  119. """Test the registration of maps with absolute time in a
  120. space time raster dataset. The timestamps are set via method arguments and with the
  121. c-interface. The timestamps of the method arguments should overwrite the
  122. time stamps set via the C-interface. The C-interface sets relative time stamps.
  123. """
  124. ciface = tgis.get_tgis_c_library_interface()
  125. ciface.write_raster_timestamp("register_map_1", tgis.get_current_mapset(), "1 day")
  126. tgis.register_maps_in_space_time_dataset(type="raster", name=self.strds_abs.get_name(),
  127. maps="register_map_1",
  128. start="2001-02-01", increment="1 day",
  129. interval=True)
  130. map = tgis.RasterDataset("register_map_1@" + tgis.get_current_mapset())
  131. map.select()
  132. start, end = map.get_absolute_time()
  133. self.assertEqual(start, datetime.datetime(2001, 2, 1))
  134. self.assertEqual(end, datetime.datetime(2001, 2, 2))
  135. self.strds_abs.select()
  136. start, end = self.strds_abs.get_absolute_time()
  137. self.assertEqual(start, datetime.datetime(2001, 2, 1))
  138. self.assertEqual(end, datetime.datetime(2001, 2, 2))
  139. def test_absolute_time_1(self):
  140. """Test the registration of maps with absolute time
  141. """
  142. tgis.register_maps_in_space_time_dataset(type="raster", name=None,
  143. maps="register_map_1,register_map_2",
  144. start="2001-01-01", increment="1 day", interval=True)
  145. map = tgis.RasterDataset("register_map_1@" + tgis.get_current_mapset())
  146. map.select()
  147. start, end = map.get_absolute_time()
  148. self.assertEqual(start, datetime.datetime(2001, 1, 1))
  149. self.assertEqual(end, datetime.datetime(2001, 1, 2))
  150. map = tgis.RasterDataset("register_map_2@" + tgis.get_current_mapset())
  151. map.select()
  152. start, end = map.get_absolute_time()
  153. self.assertEqual(start, datetime.datetime(2001, 1, 2))
  154. self.assertEqual(end, datetime.datetime(2001, 1, 3))
  155. def test_absolute_time_2(self):
  156. """Test the registration of maps with absolute time
  157. """
  158. tgis.register_maps_in_space_time_dataset(type="raster", name=None,
  159. maps="register_map_1,register_map_2",
  160. start="2001-01-01 10:30:01", increment="8 hours", interval=False)
  161. map = tgis.RasterDataset("register_map_1@" + tgis.get_current_mapset())
  162. map.select()
  163. start, end = map.get_absolute_time()
  164. self.assertEqual(start, datetime.datetime(2001, 1, 1, 10, 30, 1))
  165. map = tgis.RasterDataset("register_map_2@" + tgis.get_current_mapset())
  166. map.select()
  167. start, end = map.get_absolute_time()
  168. self.assertEqual(start, datetime.datetime(2001, 1, 1, 18, 30, 1))
  169. def test_absolute_time_3(self):
  170. """Test the registration of maps with absolute time.
  171. The timestamps are set using the C-Interface beforehand, so that the register function needs
  172. to read the timetsamp from the map metadata.
  173. """
  174. ciface = tgis.get_tgis_c_library_interface()
  175. ciface.write_raster_timestamp("register_map_1", tgis.get_current_mapset(), "1 Jan 2001 10:30:01")
  176. ciface.write_raster_timestamp("register_map_2", tgis.get_current_mapset(), "1 Jan 2001 18:30:01")
  177. tgis.register_maps_in_space_time_dataset(type="raster", name=None,
  178. maps="register_map_1,register_map_2")
  179. map = tgis.RasterDataset("register_map_1@" + tgis.get_current_mapset())
  180. map.select()
  181. start, end = map.get_absolute_time()
  182. self.assertEqual(start, datetime.datetime(2001, 1, 1, 10, 30, 1))
  183. map = tgis.RasterDataset("register_map_2@" + tgis.get_current_mapset())
  184. map.select()
  185. start, end = map.get_absolute_time()
  186. self.assertEqual(start, datetime.datetime(2001, 1, 1, 18, 30, 1))
  187. def test_relative_time_strds_1(self):
  188. """Test the registration of maps with relative time in a
  189. space time raster dataset
  190. """
  191. tgis.register_maps_in_space_time_dataset(type="raster", name=self.strds_rel.get_name(),
  192. maps="register_map_1,register_map_2", start=0,
  193. increment=1, unit="day", interval=True)
  194. map = tgis.RasterDataset("register_map_1@" + tgis.get_current_mapset())
  195. map.select()
  196. start, end, unit = map.get_relative_time()
  197. self.assertEqual(start, 0)
  198. self.assertEqual(end, 1)
  199. self.assertEqual(unit, "day")
  200. map = tgis.RasterDataset("register_map_2@" + tgis.get_current_mapset())
  201. map.select()
  202. start, end, unit = map.get_relative_time()
  203. self.assertEqual(start, 1)
  204. self.assertEqual(end, 2)
  205. self.assertEqual(unit, "day")
  206. self.strds_rel.select()
  207. start, end, unit = self.strds_rel.get_relative_time()
  208. self.assertEqual(start, 0)
  209. self.assertEqual(end, 2)
  210. self.assertEqual(unit, "day")
  211. def test_relative_time_strds_2(self):
  212. """Test the registration of maps with relative time in a
  213. space time raster dataset. The timetsamps are set for the maps using the
  214. C-interface before registration.
  215. """
  216. ciface = tgis.get_tgis_c_library_interface()
  217. ciface.write_raster_timestamp("register_map_1", tgis.get_current_mapset(), "1000000 seconds/1500000 seconds")
  218. ciface.write_raster_timestamp("register_map_2", tgis.get_current_mapset(), "1500000 seconds/2000000 seconds")
  219. tgis.register_maps_in_space_time_dataset(type="raster", name=self.strds_rel.get_name(),
  220. maps="register_map_1,register_map_2")
  221. map = tgis.RasterDataset("register_map_1@" + tgis.get_current_mapset())
  222. map.select()
  223. start, end, unit = map.get_relative_time()
  224. self.assertEqual(start, 1000000)
  225. self.assertEqual(end, 1500000)
  226. self.assertEqual(unit, "seconds")
  227. map = tgis.RasterDataset("register_map_2@" + tgis.get_current_mapset())
  228. map.select()
  229. start, end, unit = map.get_relative_time()
  230. self.assertEqual(start, 1500000)
  231. self.assertEqual(end, 2000000)
  232. self.assertEqual(unit, "seconds")
  233. self.strds_rel.select()
  234. start, end, unit = self.strds_rel.get_relative_time()
  235. self.assertEqual(start, 1000000)
  236. self.assertEqual(end, 2000000)
  237. self.assertEqual(unit, "seconds")
  238. def test_relative_time_1(self):
  239. """Test the registration of maps with relative time
  240. """
  241. tgis.register_maps_in_space_time_dataset(type="raster", name=None,
  242. maps="register_map_1,register_map_2",
  243. start=0, increment=1, unit="day", interval=True)
  244. map = tgis.RasterDataset("register_map_1@" + tgis.get_current_mapset())
  245. map.select()
  246. start, end, unit = map.get_relative_time()
  247. self.assertEqual(start, 0)
  248. self.assertEqual(end, 1)
  249. self.assertEqual(unit, "day")
  250. map = tgis.RasterDataset("register_map_2@" + tgis.get_current_mapset())
  251. map.select()
  252. start, end, unit = map.get_relative_time()
  253. self.assertEqual(start, 1)
  254. self.assertEqual(end, 2)
  255. self.assertEqual(unit, "day")
  256. def test_relative_time_2(self):
  257. """Test the registration of maps with relative time
  258. """
  259. tgis.register_maps_in_space_time_dataset(type="raster", name=None,
  260. maps="register_map_1,register_map_2",
  261. start=1000000, increment=500000, unit="seconds", interval=True)
  262. map = tgis.RasterDataset("register_map_1@" + tgis.get_current_mapset())
  263. map.select()
  264. start, end, unit = map.get_relative_time()
  265. self.assertEqual(start, 1000000)
  266. self.assertEqual(end, 1500000)
  267. self.assertEqual(unit, "seconds")
  268. map = tgis.RasterDataset("register_map_2@" + tgis.get_current_mapset())
  269. map.select()
  270. start, end, unit = map.get_relative_time()
  271. self.assertEqual(start, 1500000)
  272. self.assertEqual(end, 2000000)
  273. self.assertEqual(unit, "seconds")
  274. def test_relative_time_3(self):
  275. """Test the registration of maps with relative time. The timetsamps are set beforhand using
  276. the C-interface.
  277. """
  278. ciface = tgis.get_tgis_c_library_interface()
  279. ciface.write_raster_timestamp("register_map_1", tgis.get_current_mapset(), "1000000 seconds/1500000 seconds")
  280. ciface.write_raster_timestamp("register_map_2", tgis.get_current_mapset(), "1500000 seconds/2000000 seconds")
  281. tgis.register_maps_in_space_time_dataset(type="raster", name=None,
  282. maps="register_map_1,register_map_2")
  283. map = tgis.RasterDataset("register_map_1@" + tgis.get_current_mapset())
  284. map.select()
  285. start, end, unit = map.get_relative_time()
  286. self.assertEqual(start, 1000000)
  287. self.assertEqual(end, 1500000)
  288. self.assertEqual(unit, "seconds")
  289. map = tgis.RasterDataset("register_map_2@" + tgis.get_current_mapset())
  290. map.select()
  291. start, end, unit = map.get_relative_time()
  292. self.assertEqual(start, 1500000)
  293. self.assertEqual(end, 2000000)
  294. self.assertEqual(unit, "seconds")
  295. class TestRegisterFails(TestCase):
  296. def test_error_handling_1(self):
  297. # start option is missing
  298. self.assertModuleFail("t.register", input="test", end='2001-01-01', maps=("a", "b"))
  299. def test_error_handling_2(self):
  300. # No input definition
  301. self.assertModuleFail("t.register", input="test", start='2001-01-01')
  302. def test_error_handling_3(self):
  303. # File and maps are mutually exclusive
  304. self.assertModuleFail("t.register", input="test", start='2001-01-01', maps=("a", "b"), file="maps.txt")
  305. def test_error_handling_4(self):
  306. # Increment needs start
  307. self.assertModuleFail("t.register", input="test", increment="1 day", maps=("a", "b"))
  308. def test_error_handling_5(self):
  309. # Interval needs start
  310. self.assertModuleFail("t.register", flags="i", input="test", maps=("a", "b"))
  311. def test_error_handling_6(self):
  312. # Increment and end are mutually exclusive
  313. self.assertModuleFail("t.register", input="test", start='2001-01-01', end='2001-01-01',
  314. increment="1 day", maps=("a", "b"))
  315. def test_error_handling_7(self):
  316. # Interval and end are mutually exclusive
  317. self.assertModuleFail("t.register", flags="i", input="test", start='2001-01-01', end='2001-01-01',
  318. maps=("a", "b"))
  319. if __name__ == '__main__':
  320. test()