test_register_function.py 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970
  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 grass.script as gscript
  13. import datetime
  14. import os
  15. class TestRasterRegisterFunctions(TestCase):
  16. @classmethod
  17. def setUpClass(cls):
  18. """Initiate the temporal GIS and set the region"""
  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, t=1.0, b=0.0, res=10.0)
  25. @classmethod
  26. def tearDownClass(cls):
  27. """Remove the temporary region"""
  28. cls.del_temp_region()
  29. def setUp(self):
  30. """Create the test maps and the space time raster datasets"""
  31. self.runModule(
  32. "r.mapcalc", overwrite=True, quiet=True, expression="register_map_1 = 1"
  33. )
  34. self.runModule(
  35. "r.mapcalc", overwrite=True, quiet=True, expression="register_map_2 = 2"
  36. )
  37. self.runModule(
  38. "r.mapcalc",
  39. overwrite=True,
  40. quiet=True,
  41. expression="register_map_null = null()",
  42. )
  43. self.strds_abs = tgis.open_new_stds(
  44. name="register_test_abs",
  45. type="strds",
  46. temporaltype="absolute",
  47. title="Test strds",
  48. descr="Test strds",
  49. semantic="field",
  50. overwrite=True,
  51. )
  52. self.strds_rel = tgis.open_new_stds(
  53. name="register_test_rel",
  54. type="strds",
  55. temporaltype="relative",
  56. title="Test strds",
  57. descr="Test strds",
  58. semantic="field",
  59. overwrite=True,
  60. )
  61. def tearDown(self):
  62. """Remove maps from temporal database"""
  63. self.runModule(
  64. "t.unregister",
  65. type="raster",
  66. maps="register_map_1,register_map_2",
  67. quiet=True,
  68. )
  69. self.runModule(
  70. "g.remove",
  71. flags="f",
  72. type="raster",
  73. name="register_map_1,register_map_2,register_map_null",
  74. quiet=True,
  75. )
  76. self.strds_abs.delete()
  77. self.strds_rel.delete()
  78. def test_absolute_time_strds_1(self):
  79. """Test the registration of maps with absolute time in a
  80. space time raster dataset
  81. """
  82. tgis.register_maps_in_space_time_dataset(
  83. type="raster",
  84. name=self.strds_abs.get_name(),
  85. maps="register_map_1,register_map_2",
  86. start="2001-01-01",
  87. increment="1 day",
  88. interval=True,
  89. )
  90. map = tgis.RasterDataset("register_map_1@" + tgis.get_current_mapset())
  91. map.select()
  92. start, end = map.get_absolute_time()
  93. self.assertEqual(start, datetime.datetime(2001, 1, 1))
  94. self.assertEqual(end, datetime.datetime(2001, 1, 2))
  95. map = tgis.RasterDataset("register_map_2@" + tgis.get_current_mapset())
  96. map.select()
  97. start, end = map.get_absolute_time()
  98. self.assertEqual(start, datetime.datetime(2001, 1, 2))
  99. self.assertEqual(end, datetime.datetime(2001, 1, 3))
  100. self.strds_abs.select()
  101. start, end = self.strds_abs.get_absolute_time()
  102. self.assertEqual(start, datetime.datetime(2001, 1, 1))
  103. self.assertEqual(end, datetime.datetime(2001, 1, 3))
  104. def test_absolute_time_strds_2(self):
  105. """Test the registration of maps with absolute time in a
  106. space time raster dataset.
  107. The timestamps are set using the C-Interface beforehand, so that the register function needs
  108. to read the timetsamp from the map metadata.
  109. """
  110. ciface = tgis.get_tgis_c_library_interface()
  111. ciface.write_raster_timestamp(
  112. "register_map_1", tgis.get_current_mapset(), "1 Jan 2001/2 Jan 2001"
  113. )
  114. ciface.write_raster_timestamp(
  115. "register_map_2", tgis.get_current_mapset(), "2 Jan 2001/3 Jan 2001"
  116. )
  117. tgis.register_maps_in_space_time_dataset(
  118. type="raster",
  119. name=self.strds_abs.get_name(),
  120. maps="register_map_1,register_map_2",
  121. )
  122. map = tgis.RasterDataset("register_map_1@" + tgis.get_current_mapset())
  123. map.select()
  124. start, end = map.get_absolute_time()
  125. self.assertEqual(start, datetime.datetime(2001, 1, 1))
  126. self.assertEqual(end, datetime.datetime(2001, 1, 2))
  127. map = tgis.RasterDataset("register_map_2@" + tgis.get_current_mapset())
  128. map.select()
  129. start, end = map.get_absolute_time()
  130. self.assertEqual(start, datetime.datetime(2001, 1, 2))
  131. self.assertEqual(end, datetime.datetime(2001, 1, 3))
  132. self.strds_abs.select()
  133. start, end = self.strds_abs.get_absolute_time()
  134. self.assertEqual(start, datetime.datetime(2001, 1, 1))
  135. self.assertEqual(end, datetime.datetime(2001, 1, 3))
  136. def test_absolute_time_strds_3(self):
  137. """Test the registration of maps with absolute time in a
  138. space time raster dataset. The timestamps are set via method arguments and with the
  139. c-interface. The timestamps of the method arguments should overwrite the
  140. time stamps set via the C-interface.
  141. """
  142. ciface = tgis.get_tgis_c_library_interface()
  143. ciface.write_raster_timestamp(
  144. "register_map_1", tgis.get_current_mapset(), "1 Jan 2001/2 Jan 2001"
  145. )
  146. tgis.register_maps_in_space_time_dataset(
  147. type="raster",
  148. name=self.strds_abs.get_name(),
  149. maps="register_map_1",
  150. start="2001-02-01",
  151. increment="1 day",
  152. interval=True,
  153. )
  154. map = tgis.RasterDataset("register_map_1@" + tgis.get_current_mapset())
  155. map.select()
  156. start, end = map.get_absolute_time()
  157. self.assertEqual(start, datetime.datetime(2001, 2, 1))
  158. self.assertEqual(end, datetime.datetime(2001, 2, 2))
  159. self.strds_abs.select()
  160. start, end = self.strds_abs.get_absolute_time()
  161. self.assertEqual(start, datetime.datetime(2001, 2, 1))
  162. self.assertEqual(end, datetime.datetime(2001, 2, 2))
  163. def test_absolute_time_strds_4(self):
  164. """Test the registration of maps with absolute time in a
  165. space time raster dataset. The timestamps are set via method arguments and with the
  166. c-interface. The timestamps of the method arguments should overwrite the
  167. time stamps set via the C-interface. The C-interface sets relative time stamps.
  168. """
  169. ciface = tgis.get_tgis_c_library_interface()
  170. # Set the timestamp as relative time
  171. ciface.write_raster_timestamp(
  172. "register_map_1", tgis.get_current_mapset(), "1 day"
  173. )
  174. tgis.register_maps_in_space_time_dataset(
  175. type="raster",
  176. name=self.strds_abs.get_name(),
  177. maps="register_map_1",
  178. start="2001-02-01",
  179. increment="1 day",
  180. interval=True,
  181. )
  182. map = tgis.RasterDataset("register_map_1@" + tgis.get_current_mapset())
  183. map.select()
  184. start, end = map.get_absolute_time()
  185. self.assertEqual(start, datetime.datetime(2001, 2, 1))
  186. self.assertEqual(end, datetime.datetime(2001, 2, 2))
  187. self.strds_abs.select()
  188. start, end = self.strds_abs.get_absolute_time()
  189. self.assertEqual(start, datetime.datetime(2001, 2, 1))
  190. self.assertEqual(end, datetime.datetime(2001, 2, 2))
  191. def test_absolute_time_1(self):
  192. """Test the registration of maps with absolute time
  193. using register_maps_in_space_time_dataset() and register_map_object_list()
  194. """
  195. tgis.register_maps_in_space_time_dataset(
  196. type="raster",
  197. name=None,
  198. maps="register_map_1,register_map_2",
  199. start="2001-01-01",
  200. increment="1 day",
  201. interval=True,
  202. )
  203. map_1 = tgis.RasterDataset("register_map_1@" + tgis.get_current_mapset())
  204. map_1.select()
  205. start, end = map_1.get_absolute_time()
  206. self.assertEqual(start, datetime.datetime(2001, 1, 1))
  207. self.assertEqual(end, datetime.datetime(2001, 1, 2))
  208. map_2 = tgis.RasterDataset("register_map_2@" + tgis.get_current_mapset())
  209. map_2.select()
  210. start, end = map_2.get_absolute_time()
  211. self.assertEqual(start, datetime.datetime(2001, 1, 2))
  212. self.assertEqual(end, datetime.datetime(2001, 1, 3))
  213. map_list = [map_1, map_2]
  214. tgis.register_map_object_list(
  215. type="raster",
  216. map_list=map_list,
  217. output_stds=self.strds_abs,
  218. delete_empty=False,
  219. )
  220. self.strds_abs.select()
  221. start, end = self.strds_abs.get_absolute_time()
  222. self.assertEqual(start, datetime.datetime(2001, 1, 1))
  223. self.assertEqual(end, datetime.datetime(2001, 1, 3))
  224. def test_absolute_time_2(self):
  225. """Test the registration of maps with absolute time
  226. using register_maps_in_space_time_dataset() and register_map_object_list() with empty map deletion
  227. """
  228. tgis.register_maps_in_space_time_dataset(
  229. type="raster",
  230. name=None,
  231. maps="register_map_1,register_map_2,register_map_null",
  232. start="2001-01-01 10:30:01",
  233. increment="8 hours",
  234. interval=False,
  235. )
  236. map_1 = tgis.RasterDataset("register_map_1@" + tgis.get_current_mapset())
  237. map_1.select()
  238. start, end = map_1.get_absolute_time()
  239. self.assertEqual(start, datetime.datetime(2001, 1, 1, 10, 30, 1))
  240. map_2 = tgis.RasterDataset("register_map_2@" + tgis.get_current_mapset())
  241. map_2.select()
  242. start, end = map_2.get_absolute_time()
  243. self.assertEqual(start, datetime.datetime(2001, 1, 1, 18, 30, 1))
  244. map_3 = tgis.RasterDataset("register_map_null@" + tgis.get_current_mapset())
  245. map_3.select()
  246. start, end = map_3.get_absolute_time()
  247. self.assertEqual(start, datetime.datetime(2001, 1, 2, 2, 30, 1))
  248. map_list = [map_1, map_2, map_3]
  249. tgis.register_map_object_list(
  250. type="raster",
  251. map_list=map_list,
  252. output_stds=self.strds_abs,
  253. delete_empty=True,
  254. )
  255. self.strds_abs.select()
  256. start, end = self.strds_abs.get_absolute_time()
  257. self.assertEqual(start, datetime.datetime(2001, 1, 1, 10, 30, 1))
  258. self.assertEqual(end, datetime.datetime(2001, 1, 1, 18, 30, 1))
  259. map_3 = tgis.VectorDataset("register_map_null@" + tgis.get_current_mapset())
  260. self.assertEqual(map_3.map_exists(), False)
  261. def test_absolute_time_3(self):
  262. """Test the registration of maps with absolute time.
  263. The timestamps are set using the C-Interface beforehand, so that the register function needs
  264. to read the timetsamp from the map metadata.
  265. """
  266. ciface = tgis.get_tgis_c_library_interface()
  267. ciface.write_raster_timestamp(
  268. "register_map_1", tgis.get_current_mapset(), "1 Jan 2001 10:30:01"
  269. )
  270. ciface.write_raster_timestamp(
  271. "register_map_2", tgis.get_current_mapset(), "1 Jan 2001 18:30:01"
  272. )
  273. tgis.register_maps_in_space_time_dataset(
  274. type="raster", name=None, maps="register_map_1,register_map_2"
  275. )
  276. map = tgis.RasterDataset("register_map_1@" + tgis.get_current_mapset())
  277. map.select()
  278. start, end = map.get_absolute_time()
  279. self.assertEqual(start, datetime.datetime(2001, 1, 1, 10, 30, 1))
  280. map = tgis.RasterDataset("register_map_2@" + tgis.get_current_mapset())
  281. map.select()
  282. start, end = map.get_absolute_time()
  283. self.assertEqual(start, datetime.datetime(2001, 1, 1, 18, 30, 1))
  284. def test_relative_time_strds_1(self):
  285. """Test the registration of maps with relative time in a
  286. space time raster dataset
  287. """
  288. tgis.register_maps_in_space_time_dataset(
  289. type="raster",
  290. name=self.strds_rel.get_name(),
  291. maps="register_map_1,register_map_2",
  292. start=0,
  293. increment=1,
  294. unit="day",
  295. interval=True,
  296. )
  297. map = tgis.RasterDataset("register_map_1@" + tgis.get_current_mapset())
  298. map.select()
  299. start, end, unit = map.get_relative_time()
  300. self.assertEqual(start, 0)
  301. self.assertEqual(end, 1)
  302. self.assertEqual(unit, "day")
  303. map = tgis.RasterDataset("register_map_2@" + tgis.get_current_mapset())
  304. map.select()
  305. start, end, unit = map.get_relative_time()
  306. self.assertEqual(start, 1)
  307. self.assertEqual(end, 2)
  308. self.assertEqual(unit, "day")
  309. self.strds_rel.select()
  310. start, end, unit = self.strds_rel.get_relative_time()
  311. self.assertEqual(start, 0)
  312. self.assertEqual(end, 2)
  313. self.assertEqual(unit, "day")
  314. def test_relative_time_strds_2(self):
  315. """Test the registration of maps with relative time in a
  316. space time raster dataset. The timetsamps are set for the maps using the
  317. C-interface before registration.
  318. """
  319. ciface = tgis.get_tgis_c_library_interface()
  320. ciface.write_raster_timestamp(
  321. "register_map_1",
  322. tgis.get_current_mapset(),
  323. "1000000 seconds/1500000 seconds",
  324. )
  325. ciface.write_raster_timestamp(
  326. "register_map_2",
  327. tgis.get_current_mapset(),
  328. "1500000 seconds/2000000 seconds",
  329. )
  330. tgis.register_maps_in_space_time_dataset(
  331. type="raster",
  332. name=self.strds_rel.get_name(),
  333. maps="register_map_1,register_map_2",
  334. )
  335. map = tgis.RasterDataset("register_map_1@" + tgis.get_current_mapset())
  336. map.select()
  337. start, end, unit = map.get_relative_time()
  338. self.assertEqual(start, 1000000)
  339. self.assertEqual(end, 1500000)
  340. self.assertEqual(unit, "seconds")
  341. map = tgis.RasterDataset("register_map_2@" + tgis.get_current_mapset())
  342. map.select()
  343. start, end, unit = map.get_relative_time()
  344. self.assertEqual(start, 1500000)
  345. self.assertEqual(end, 2000000)
  346. self.assertEqual(unit, "seconds")
  347. self.strds_rel.select()
  348. start, end, unit = self.strds_rel.get_relative_time()
  349. self.assertEqual(start, 1000000)
  350. self.assertEqual(end, 2000000)
  351. self.assertEqual(unit, "seconds")
  352. def test_relative_time_1(self):
  353. """Test the registration of maps with relative time"""
  354. tgis.register_maps_in_space_time_dataset(
  355. type="raster",
  356. name=None,
  357. maps="register_map_1,register_map_2",
  358. start=0,
  359. increment=1,
  360. unit="day",
  361. interval=True,
  362. )
  363. map = tgis.RasterDataset("register_map_1@" + tgis.get_current_mapset())
  364. map.select()
  365. start, end, unit = map.get_relative_time()
  366. self.assertEqual(start, 0)
  367. self.assertEqual(end, 1)
  368. self.assertEqual(unit, "day")
  369. map = tgis.RasterDataset("register_map_2@" + tgis.get_current_mapset())
  370. map.select()
  371. start, end, unit = map.get_relative_time()
  372. self.assertEqual(start, 1)
  373. self.assertEqual(end, 2)
  374. self.assertEqual(unit, "day")
  375. def test_relative_time_2(self):
  376. """Test the registration of maps with relative time"""
  377. tgis.register_maps_in_space_time_dataset(
  378. type="raster",
  379. name=None,
  380. maps="register_map_1,register_map_2",
  381. start=1000000,
  382. increment=500000,
  383. unit="seconds",
  384. interval=True,
  385. )
  386. map = tgis.RasterDataset("register_map_1@" + tgis.get_current_mapset())
  387. map.select()
  388. start, end, unit = map.get_relative_time()
  389. self.assertEqual(start, 1000000)
  390. self.assertEqual(end, 1500000)
  391. self.assertEqual(unit, "seconds")
  392. map = tgis.RasterDataset("register_map_2@" + tgis.get_current_mapset())
  393. map.select()
  394. start, end, unit = map.get_relative_time()
  395. self.assertEqual(start, 1500000)
  396. self.assertEqual(end, 2000000)
  397. self.assertEqual(unit, "seconds")
  398. def test_relative_time_3(self):
  399. """Test the registration of maps with relative time. The timetsamps are set beforehand using
  400. the C-interface.
  401. """
  402. ciface = tgis.get_tgis_c_library_interface()
  403. ciface.write_raster_timestamp(
  404. "register_map_1",
  405. tgis.get_current_mapset(),
  406. "1000000 seconds/1500000 seconds",
  407. )
  408. ciface.write_raster_timestamp(
  409. "register_map_2",
  410. tgis.get_current_mapset(),
  411. "1500000 seconds/2000000 seconds",
  412. )
  413. tgis.register_maps_in_space_time_dataset(
  414. type="raster", name=None, maps="register_map_1,register_map_2"
  415. )
  416. map = tgis.RasterDataset("register_map_1@" + tgis.get_current_mapset())
  417. map.select()
  418. start, end, unit = map.get_relative_time()
  419. self.assertEqual(start, 1000000)
  420. self.assertEqual(end, 1500000)
  421. self.assertEqual(unit, "seconds")
  422. map = tgis.RasterDataset("register_map_2@" + tgis.get_current_mapset())
  423. map.select()
  424. start, end, unit = map.get_relative_time()
  425. self.assertEqual(start, 1500000)
  426. self.assertEqual(end, 2000000)
  427. self.assertEqual(unit, "seconds")
  428. class TestVectorRegisterFunctions(TestCase):
  429. @classmethod
  430. def setUpClass(cls):
  431. """Initiate the temporal GIS and set the region"""
  432. os.putenv("GRASS_OVERWRITE", "1")
  433. # Use always the current mapset as temporal database
  434. cls.runModule("g.gisenv", set="TGIS_USE_CURRENT_MAPSET=1")
  435. tgis.init()
  436. cls.use_temp_region()
  437. cls.runModule("g.region", n=80.0, s=0.0, e=120.0, w=0.0, t=1.0, b=0.0, res=10.0)
  438. @classmethod
  439. def tearDownClass(cls):
  440. """Remove the temporary region"""
  441. cls.del_temp_region()
  442. def setUp(self):
  443. """Create the test maps and the space time raster datasets"""
  444. self.runModule(
  445. "v.random",
  446. overwrite=True,
  447. quiet=True,
  448. output="register_map_1",
  449. npoints=5,
  450. seed=1,
  451. )
  452. self.runModule(
  453. "v.random",
  454. overwrite=True,
  455. quiet=True,
  456. output="register_map_2",
  457. npoints=5,
  458. seed=1,
  459. )
  460. self.runModule(
  461. "r.mapcalc",
  462. overwrite=True,
  463. quiet=True,
  464. expression="register_map_null = null()",
  465. )
  466. self.runModule(
  467. "r.to.vect",
  468. overwrite=True,
  469. quiet=True,
  470. input="register_map_null",
  471. type="point",
  472. output="register_map_empty",
  473. )
  474. self.stvds_abs = tgis.open_new_stds(
  475. name="register_test_abs",
  476. type="stvds",
  477. temporaltype="absolute",
  478. title="Test stvds",
  479. descr="Test stvds",
  480. semantic="field",
  481. overwrite=True,
  482. )
  483. self.stvds_rel = tgis.open_new_stds(
  484. name="register_test_rel",
  485. type="stvds",
  486. temporaltype="relative",
  487. title="Test stvds",
  488. descr="Test stvds",
  489. semantic="field",
  490. overwrite=True,
  491. )
  492. def tearDown(self):
  493. """Remove maps from temporal database"""
  494. self.runModule(
  495. "t.unregister",
  496. type="vector",
  497. maps="register_map_1,register_map_2",
  498. quiet=True,
  499. )
  500. self.runModule(
  501. "g.remove",
  502. flags="f",
  503. type="vector",
  504. name="register_map_1,register_map_2",
  505. quiet=True,
  506. )
  507. self.runModule(
  508. "g.remove",
  509. flags="f",
  510. type="raster",
  511. name="register_map_null",
  512. quiet=True,
  513. )
  514. self.stvds_abs.delete()
  515. self.stvds_rel.delete()
  516. def test_absolute_time_stvds_1(self):
  517. """Test the registration of maps with absolute time in a
  518. space time raster dataset
  519. """
  520. tgis.register_maps_in_space_time_dataset(
  521. type="vector",
  522. name=self.stvds_abs.get_name(),
  523. maps="register_map_1,register_map_2",
  524. start="2001-01-01",
  525. increment="1 day",
  526. interval=True,
  527. )
  528. map = tgis.VectorDataset("register_map_1@" + tgis.get_current_mapset())
  529. map.select()
  530. start, end = map.get_absolute_time()
  531. self.assertEqual(start, datetime.datetime(2001, 1, 1))
  532. self.assertEqual(end, datetime.datetime(2001, 1, 2))
  533. map = tgis.VectorDataset("register_map_2@" + tgis.get_current_mapset())
  534. map.select()
  535. start, end = map.get_absolute_time()
  536. self.assertEqual(start, datetime.datetime(2001, 1, 2))
  537. self.assertEqual(end, datetime.datetime(2001, 1, 3))
  538. self.stvds_abs.select()
  539. start, end = self.stvds_abs.get_absolute_time()
  540. self.assertEqual(start, datetime.datetime(2001, 1, 1))
  541. self.assertEqual(end, datetime.datetime(2001, 1, 3))
  542. def test_absolute_time_stvds_2(self):
  543. """Test the registration of maps with absolute time in a
  544. space time raster dataset.
  545. The timestamps are set using the C-Interface beforehand, so that the register function needs
  546. to read the timetsamp from the map metadata.
  547. """
  548. ciface = tgis.get_tgis_c_library_interface()
  549. ciface.write_vector_timestamp(
  550. "register_map_1", tgis.get_current_mapset(), "1 Jan 2001/2 Jan 2001"
  551. )
  552. ciface.write_vector_timestamp(
  553. "register_map_2", tgis.get_current_mapset(), "2 Jan 2001/3 Jan 2001"
  554. )
  555. tgis.register_maps_in_space_time_dataset(
  556. type="vector",
  557. name=self.stvds_abs.get_name(),
  558. maps="register_map_1,register_map_2",
  559. )
  560. map = tgis.VectorDataset("register_map_1@" + tgis.get_current_mapset())
  561. map.select()
  562. start, end = map.get_absolute_time()
  563. self.assertEqual(start, datetime.datetime(2001, 1, 1))
  564. self.assertEqual(end, datetime.datetime(2001, 1, 2))
  565. map = tgis.VectorDataset("register_map_2@" + tgis.get_current_mapset())
  566. map.select()
  567. start, end = map.get_absolute_time()
  568. self.assertEqual(start, datetime.datetime(2001, 1, 2))
  569. self.assertEqual(end, datetime.datetime(2001, 1, 3))
  570. self.stvds_abs.select()
  571. start, end = self.stvds_abs.get_absolute_time()
  572. self.assertEqual(start, datetime.datetime(2001, 1, 1))
  573. self.assertEqual(end, datetime.datetime(2001, 1, 3))
  574. def test_absolute_time_stvds_3(self):
  575. """Test the registration of maps with absolute time in a
  576. space time raster dataset. The timestamps are set via method arguments and with the
  577. c-interface. The timestamps of the method arguments should overwrite the
  578. time stamps set via the C-interface.
  579. """
  580. ciface = tgis.get_tgis_c_library_interface()
  581. ciface.write_vector_timestamp(
  582. "register_map_1", tgis.get_current_mapset(), "1 Jan 2001/2 Jan 2001"
  583. )
  584. tgis.register_maps_in_space_time_dataset(
  585. type="vector",
  586. name=self.stvds_abs.get_name(),
  587. maps="register_map_1",
  588. start="2001-02-01",
  589. increment="1 day",
  590. interval=True,
  591. )
  592. map = tgis.VectorDataset("register_map_1@" + tgis.get_current_mapset())
  593. map.select()
  594. start, end = map.get_absolute_time()
  595. self.assertEqual(start, datetime.datetime(2001, 2, 1))
  596. self.assertEqual(end, datetime.datetime(2001, 2, 2))
  597. self.stvds_abs.select()
  598. start, end = self.stvds_abs.get_absolute_time()
  599. self.assertEqual(start, datetime.datetime(2001, 2, 1))
  600. self.assertEqual(end, datetime.datetime(2001, 2, 2))
  601. def test_absolute_time_1(self):
  602. """Register vector maps in the temporal database and in addition in a stvds using the object method
  603. :return:
  604. """
  605. tgis.register_maps_in_space_time_dataset(
  606. type="vector",
  607. name=None,
  608. maps="register_map_1,register_map_2",
  609. start="2001-01-01",
  610. increment="1 day",
  611. interval=True,
  612. )
  613. map_1 = tgis.VectorDataset("register_map_1@" + tgis.get_current_mapset())
  614. map_1.select()
  615. start, end = map_1.get_absolute_time()
  616. self.assertEqual(start, datetime.datetime(2001, 1, 1))
  617. self.assertEqual(end, datetime.datetime(2001, 1, 2))
  618. map_2 = tgis.VectorDataset("register_map_2@" + tgis.get_current_mapset())
  619. map_2.select()
  620. start, end = map_2.get_absolute_time()
  621. self.assertEqual(start, datetime.datetime(2001, 1, 2))
  622. self.assertEqual(end, datetime.datetime(2001, 1, 3))
  623. map_list = [map_1, map_2]
  624. tgis.register_map_object_list(
  625. type="vector",
  626. map_list=map_list,
  627. output_stds=self.stvds_abs,
  628. delete_empty=False,
  629. )
  630. self.stvds_abs.select()
  631. start, end = self.stvds_abs.get_absolute_time()
  632. self.assertEqual(start, datetime.datetime(2001, 1, 1))
  633. self.assertEqual(end, datetime.datetime(2001, 1, 3))
  634. def test_absolute_time_2(self):
  635. """Register vector maps in the temporal database and in addition
  636. in a stvds using the object method deleting empty maps
  637. :return:
  638. """
  639. tgis.register_maps_in_space_time_dataset(
  640. type="vector",
  641. name=None,
  642. maps="register_map_1,register_map_2,register_map_empty",
  643. start="2001-01-01",
  644. increment="1 day",
  645. interval=True,
  646. )
  647. map_1 = tgis.VectorDataset("register_map_1@" + tgis.get_current_mapset())
  648. map_1.select()
  649. start, end = map_1.get_absolute_time()
  650. self.assertEqual(start, datetime.datetime(2001, 1, 1))
  651. self.assertEqual(end, datetime.datetime(2001, 1, 2))
  652. map_2 = tgis.VectorDataset("register_map_2@" + tgis.get_current_mapset())
  653. map_2.select()
  654. start, end = map_2.get_absolute_time()
  655. self.assertEqual(start, datetime.datetime(2001, 1, 2))
  656. self.assertEqual(end, datetime.datetime(2001, 1, 3))
  657. map_3 = tgis.VectorDataset("register_map_empty@" + tgis.get_current_mapset())
  658. map_3.select()
  659. start, end = map_3.get_absolute_time()
  660. self.assertEqual(start, datetime.datetime(2001, 1, 3))
  661. self.assertEqual(end, datetime.datetime(2001, 1, 4))
  662. map_list = [map_1, map_2, map_3]
  663. tgis.register_map_object_list(
  664. type="vector",
  665. map_list=map_list,
  666. output_stds=self.stvds_abs,
  667. delete_empty=True,
  668. )
  669. self.stvds_abs.select()
  670. start, end = self.stvds_abs.get_absolute_time()
  671. self.assertEqual(start, datetime.datetime(2001, 1, 1))
  672. self.assertEqual(end, datetime.datetime(2001, 1, 3))
  673. map_3 = tgis.VectorDataset("register_map_empty@" + tgis.get_current_mapset())
  674. self.assertEqual(map_3.map_exists(), False)
  675. class TestRegisterFails(TestCase):
  676. def test_error_handling_1(self):
  677. # start option is missing
  678. self.assertModuleFail(
  679. "t.register", input="test", end="2001-01-01", maps=("a", "b")
  680. )
  681. def test_error_handling_2(self):
  682. # No input definition
  683. self.assertModuleFail("t.register", input="test", start="2001-01-01")
  684. def test_error_handling_3(self):
  685. # File and maps are mutually exclusive
  686. self.assertModuleFail(
  687. "t.register",
  688. input="test",
  689. start="2001-01-01",
  690. maps=("a", "b"),
  691. file="maps.txt",
  692. )
  693. def test_error_handling_4(self):
  694. # Increment needs start
  695. self.assertModuleFail(
  696. "t.register", input="test", increment="1 day", maps=("a", "b")
  697. )
  698. def test_error_handling_5(self):
  699. # Interval needs start
  700. self.assertModuleFail("t.register", flags="i", input="test", maps=("a", "b"))
  701. def test_error_handling_6(self):
  702. # Increment and end are mutually exclusive
  703. self.assertModuleFail(
  704. "t.register",
  705. input="test",
  706. start="2001-01-01",
  707. end="2001-01-01",
  708. increment="1 day",
  709. maps=("a", "b"),
  710. )
  711. def test_error_handling_7(self):
  712. # Interval and end are mutually exclusive
  713. self.assertModuleFail(
  714. "t.register",
  715. flags="i",
  716. input="test",
  717. start="2001-01-01",
  718. end="2001-01-01",
  719. maps=("a", "b"),
  720. )
  721. class TestRegisterMapsetAccess(TestCase):
  722. @classmethod
  723. def setUpClass(cls):
  724. """Initiate the temporal GIS and set the region"""
  725. os.putenv("GRASS_OVERWRITE", "1")
  726. tgis.init()
  727. cls.use_temp_region()
  728. cls.runModule("g.region", n=80.0, s=0.0, e=120.0, w=0.0, t=1.0, b=0.0, res=10.0)
  729. # Create the test maps
  730. cls.runModule(
  731. "r.mapcalc",
  732. expression="register_map_1 = 1",
  733. overwrite=True,
  734. quiet=True,
  735. )
  736. cls.runModule(
  737. "r.mapcalc",
  738. expression="register_map_2 = 2",
  739. overwrite=True,
  740. quiet=True,
  741. )
  742. cls.del_temp_region()
  743. def setUp(self):
  744. """Create the space time raster dataset"""
  745. self.strds_abs = tgis.open_new_stds(
  746. name="register_test_abs",
  747. type="strds",
  748. temporaltype="absolute",
  749. title="Test strds",
  750. descr="Test strds",
  751. semantic="field",
  752. overwrite=True,
  753. )
  754. tgis.register_maps_in_space_time_dataset(
  755. type="raster",
  756. name=self.strds_abs.get_name(),
  757. maps="register_map_1,register_map_2",
  758. start="2001-01-01",
  759. increment="1 day",
  760. interval=True,
  761. )
  762. self.currmapset = tgis.get_current_mapset()
  763. self.newmapset = "test_temporal_register_mapset_access"
  764. # create and switch to new mapset
  765. self.runModule(
  766. "g.mapset",
  767. mapset=self.newmapset,
  768. flags="c",
  769. quiet=True,
  770. )
  771. # add old mapset to search path
  772. self.runModule(
  773. "g.mapsets",
  774. mapset=self.currmapset,
  775. operation="add",
  776. quiet=True,
  777. )
  778. self.runModule(
  779. "g.mapsets",
  780. flags="p",
  781. verbose=True,
  782. )
  783. tgis.stop_subprocesses()
  784. tgis.init()
  785. self.assertNotEqual(self.currmapset, tgis.get_current_mapset())
  786. def tearDown(self):
  787. """Remove raster maps from current mapset"""
  788. # switch to old mapset
  789. self.runModule(
  790. "g.mapset",
  791. mapset=self.currmapset,
  792. quiet=True,
  793. )
  794. tgis.stop_subprocesses()
  795. tgis.init()
  796. self.strds_abs.delete()
  797. self.runModule(
  798. "g.remove",
  799. flags="f",
  800. type="raster",
  801. name="register_map_1,register_map_2",
  802. quiet=True,
  803. )
  804. grassenv = gscript.gisenv()
  805. mapset_path = os.path.join(
  806. grassenv["GISDBASE"], grassenv["LOCATION_NAME"], self.newmapset
  807. )
  808. gscript.try_rmdir(mapset_path)
  809. def test_mapset_access_1(self):
  810. """Test the registration of maps from a different mapset."""
  811. self.strds_abs_2 = tgis.open_new_stds(
  812. name="register_test_abs",
  813. type="strds",
  814. temporaltype="absolute",
  815. title="Test strds",
  816. descr="Test strds",
  817. semantic="field",
  818. overwrite=True,
  819. )
  820. # register maps from another mapset
  821. # names are not fully qualified, maps are in a different mapset
  822. strdsname = self.strds_abs_2.get_name() + "@" + self.newmapset
  823. maps = "register_map_1,register_map_2"
  824. tgis.register_maps_in_space_time_dataset(
  825. type="raster",
  826. name=strdsname,
  827. maps=maps,
  828. start="2001-01-01",
  829. increment="1 day",
  830. interval=True,
  831. )
  832. self.assertModule(
  833. "t.remove",
  834. type="strds",
  835. inputs=strdsname,
  836. flags="rf",
  837. quiet=True,
  838. )
  839. if __name__ == "__main__":
  840. test()