tgis_temporal_extent.py 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488
  1. """!@package grass.script.tgis_temporal_extent
  2. @brief GRASS Python scripting module (temporal GIS functions)
  3. Temporal GIS related temporal extent functions to be used in Python scripts and tgis packages.
  4. Usage:
  5. @code
  6. from grass.script import tgis_temporal_extent as grass
  7. grass.raster_temporal_extent()
  8. ...
  9. @endcode
  10. (C) 2008-2011 by the GRASS Development Team
  11. This program is free software under the GNU General Public
  12. License (>=v2). Read the file COPYING that comes with GRASS
  13. for details.
  14. @author Soeren Gebbert
  15. """
  16. from tgis_base import *
  17. ###############################################################################
  18. class absolute_temporal_extent(sql_database_interface):
  19. """This is the absolute time base class for all maps and spacetime datasets"""
  20. def __init__(self, table=None, ident=None, start_time=None, end_time=None, timezone=None):
  21. sql_database_interface.__init__(self, table, ident)
  22. self.set_id(ident)
  23. self.set_start_time(start_time)
  24. self.set_end_time(end_time)
  25. self.set_timezone(timezone)
  26. def starts(self, map):
  27. """Return True if this absolute time object starts at the start of the provided absolute time object and finishes within it
  28. A |-----|
  29. B |---------|
  30. """
  31. if self.D["start_time"] == map.D["start_time"] and self.D["end_time"] < map.D["end_time"]:
  32. return True
  33. else:
  34. return False
  35. def started(self, map):
  36. """Return True if this absolute time object is started at the start of the provided absolute time object
  37. A |---------|
  38. B |-----|
  39. """
  40. if self.D["start_time"] == map.D["start_time"] and self.D["end_time"] > map.D["end_time"]:
  41. return True
  42. else:
  43. return False
  44. def finishes(self, map):
  45. """Return True if this absolute time object finishes at the end and within of the provided absolute time object
  46. A |-----|
  47. B |---------|
  48. """
  49. if self.D["end_time"] == map.D["end_time"] and self.D["start_time"] > map.D["start_time"] :
  50. return True
  51. else:
  52. return False
  53. def finished(self, map):
  54. """Return True if this absolute time object finished at the end of the provided absolute time object
  55. A |---------|
  56. B |-----|
  57. """
  58. if self.D["end_time"] == map.D["end_time"] and self.D["start_time"] < map.D["start_time"] :
  59. return True
  60. else:
  61. return False
  62. def after(self, map):
  63. """Return True if this absolute time object is temporal located after the provided absolute time object
  64. A |---------|
  65. B |---------|
  66. """
  67. if self.D["start_time"] > map.D["end_time"]:
  68. return True
  69. else:
  70. return False
  71. def before(self, map):
  72. """Return True if this absolute time object is temporal located bevor the provided absolute time object
  73. A |---------|
  74. B |---------|
  75. """
  76. if self.D["end_time"] < map.D["start_time"]:
  77. return True
  78. else:
  79. return False
  80. def adjacent(self, map):
  81. """Return True if this absolute time object is a meeting neighbour the provided absolute time object
  82. A |---------|
  83. B |---------|
  84. A |---------|
  85. B |---------|
  86. """
  87. if (self.D["start_time"] == map.D["end_time"]) or (self.D["end_time"] == map.D["start_time"]):
  88. return True
  89. else:
  90. return False
  91. def follows(self, map):
  92. """Return True if this absolute time object is temporal follows the provided absolute time object
  93. A |---------|
  94. B |---------|
  95. """
  96. if self.D["start_time"] == map.D["end_time"]:
  97. return True
  98. else:
  99. return False
  100. def precedes(self, map):
  101. """Return True if this absolute time object is temporal precedes the provided absolute time object
  102. A |---------|
  103. B |---------|
  104. """
  105. if self.D["end_time"] == map.D["start_time"]:
  106. return True
  107. else:
  108. return False
  109. def during(self, map):
  110. """Return True if this absolute time object is temporal located during the provided absolute time object
  111. A |-------|
  112. B |---------|
  113. """
  114. if self.D["start_time"] > map.D["start_time"] and self.D["end_time"] < map.D["end_time"]:
  115. return True
  116. else:
  117. return False
  118. def contains(self, map):
  119. """Return True if this absolute time object is temporal located during the provided absolute time object
  120. A |---------|
  121. B |-------|
  122. """
  123. if self.D["start_time"] < map.D["start_time"] and self.D["end_time"] > map.D["end_time"]:
  124. return True
  125. else:
  126. return False
  127. def equivalent(self, map):
  128. """Return True if this absolute time object is temporal located equivalent the provided absolute time object
  129. A |---------|
  130. B |---------|
  131. """
  132. if self.D["start_time"] == map.D["start_time"] and self.D["end_time"] == map.D["end_time"]:
  133. return True
  134. else:
  135. return False
  136. def overlaps(self, map):
  137. """Return True if this absolute time object is temporal overlaps the provided absolute time object
  138. A |---------|
  139. B |---------|
  140. """
  141. if self.D["start_time"] < map.D["start_time"] and self.D["end_time"] < map.D["end_time"] and\
  142. self.D["end_time"] > map.D["start_time"]:
  143. return True
  144. else:
  145. return False
  146. def overlapped(self, map):
  147. """Return True if this absolute time object is temporal overlaped by the provided absolute time object
  148. A |---------|
  149. B |---------|
  150. """
  151. if self.D["start_time"] > map.D["start_time"] and self.D["end_time"] > map.D["end_time"] and\
  152. self.D["start_time"] < map.D["end_time"]:
  153. return True
  154. else:
  155. return False
  156. def temporal_relation(self, map):
  157. """Returns the temporal relation between absolute time temporal objects
  158. Temporal relationsships are implemented after [Allen and Ferguson 1994 Actions and Events in Interval Temporal Logic]
  159. """
  160. if self.equivalent(map):
  161. return "equivalent"
  162. if self.during(map):
  163. return "during"
  164. if self.contains(map):
  165. return "contains"
  166. if self.overlaps(map):
  167. return "overlaps"
  168. if self.overlapped(map):
  169. return "overlapped"
  170. if self.after(map):
  171. return "after"
  172. if self.before(map):
  173. return "before"
  174. if self.starts(map):
  175. return "starts"
  176. if self.finishes(map):
  177. return "finishes"
  178. if self.started(map):
  179. return "started"
  180. if self.finished(map):
  181. return "finished"
  182. if self.equivalent(map):
  183. return "equivalent"
  184. if self.follows(map):
  185. return "follows"
  186. if self.precedes(map):
  187. return "precedes"
  188. return None
  189. def set_id(self, ident):
  190. """Convenient method to set the unique identifier (primary key)"""
  191. self.ident = ident
  192. self.D["id"] = ident
  193. def set_start_time(self, start_time):
  194. """Set the valid start time of the map, this should be of type datetime"""
  195. self.D["start_time"] = start_time
  196. def set_end_time(self, end_time):
  197. """Set the valid end time of the map, this should be of type datetime"""
  198. self.D["end_time"] = end_time
  199. def set_timezone(self, timezone):
  200. """Set the timezone of the map, integer from 1 - 24"""
  201. self.D["timezone"] = timezone
  202. def get_id(self):
  203. """Convenient method to get the unique identifier (primary key)
  204. @return None if not found
  205. """
  206. if self.D.has_key("id"):
  207. return self.D["id"]
  208. else:
  209. return None
  210. def get_start_time(self):
  211. """Get the valid start time of the map
  212. @return None if not found"""
  213. if self.D.has_key("start_time"):
  214. return self.D["start_time"]
  215. else:
  216. return None
  217. def get_end_time(self):
  218. """Get the valid end time of the map
  219. @return None if not found"""
  220. if self.D.has_key("end_time"):
  221. return self.D["end_time"]
  222. else:
  223. return None
  224. def get_timezone(self):
  225. """Get the timezone of the map
  226. @return None if not found"""
  227. if self.D.has_key("timezone"):
  228. return self.D["timezone"]
  229. else:
  230. return None
  231. def print_info(self):
  232. """Print information about this class in human readable style"""
  233. # 0123456789012345678901234567890
  234. print " +-------------------- Absolute time -----------------------------------------+"
  235. print " | Start time:................. " + str(self.get_start_time())
  236. print " | End time:................... " + str(self.get_end_time())
  237. print " | Timezone:................... " + str(self.get_timezone())
  238. def print_shell_info(self):
  239. """Print information about this class in shell style"""
  240. print "start_time=" + str(self.get_start_time())
  241. print "end_time=" + str(self.get_end_time())
  242. print "timezone=" + str(self.get_timezone())
  243. ###############################################################################
  244. class raster_absolute_time(absolute_temporal_extent):
  245. def __init__(self, ident=None, start_time=None, end_time=None, timezone=None):
  246. absolute_temporal_extent.__init__(self, "raster_absolute_time", ident, start_time, end_time, timezone)
  247. class raster3d_absolute_time(absolute_temporal_extent):
  248. def __init__(self, ident=None, start_time=None, end_time=None, timezone=None):
  249. absolute_temporal_extent.__init__(self, "raster3d_absolute_time", ident, start_time, end_time, timezone)
  250. class vector_absolute_time(absolute_temporal_extent):
  251. def __init__(self, ident=None, start_time=None, end_time=None, timezone=None):
  252. absolute_temporal_extent.__init__(self, "vector_absolute_time", ident, start_time, end_time, timezone)
  253. ###############################################################################
  254. class stds_absolute_time(absolute_temporal_extent):
  255. def __init__(self, table=None, ident=None, start_time=None, end_time=None, granularity=None, timezone=None):
  256. absolute_temporal_extent.__init__(self, table, ident, start_time, end_time, timezone)
  257. self.set_granularity(granularity)
  258. def set_granularity(self, granularity):
  259. """Set the granularity of the space time dataset"""
  260. self.D["granularity"] = granularity
  261. def get_granularity(self):
  262. """Get the granularity of the space time dataset
  263. @return None if not found"""
  264. if self.D.has_key("granularity"):
  265. return self.D["granularity"]
  266. else:
  267. return None
  268. def print_info(self):
  269. """Print information about this class in human readable style"""
  270. absolute_temporal_extent.print_info(self)
  271. # 0123456789012345678901234567890
  272. print " | Granularity:................ " + str(self.get_granularity())
  273. def print_shell_info(self):
  274. """Print information about this class in shell style"""
  275. absolute_temporal_extent.print_shell_info(self)
  276. print "granularity=" + str(self.get_granularity())
  277. ###############################################################################
  278. class strds_absolute_time(stds_absolute_time):
  279. def __init__(self, ident=None, start_time=None, end_time=None, granularity=None, timezone=None):
  280. stds_absolute_time.__init__(self, "strds_absolute_time", ident, start_time, end_time, granularity, timezone)
  281. class str3ds_absolute_time(stds_absolute_time):
  282. def __init__(self, ident=None, start_time=None, end_time=None, granularity=None, timezone=None):
  283. stds_absolute_time.__init__(self, "str3ds_absolute_time", ident, start_time, end_time, granularity, timezone)
  284. class stvds_absolute_time(stds_absolute_time):
  285. def __init__(self, ident=None, start_time=None, end_time=None, granularity=None, timezone=None):
  286. stds_absolute_time.__init__(self, "stvds_absolute_time", ident, start_time, end_time, granularity, timezone)
  287. ###############################################################################
  288. class relative_temporal_extent(sql_database_interface):
  289. """This is the relative time base class for all maps and spacetime datasets"""
  290. def __init__(self, table=None, ident=None, interval=None):
  291. sql_database_interface.__init__(self, table, ident)
  292. self.set_id(ident)
  293. self.set_interval(interval)
  294. def after(self, map):
  295. """Return True if this relative time object is temporal located after the provided relative time object
  296. A |
  297. B |
  298. """
  299. if self.D["interval"] > map.D["interval"]:
  300. return True
  301. else:
  302. return False
  303. def before(self, map):
  304. """Return True if this relative time object is temporal located bevor the provided relative time object
  305. A |
  306. B |
  307. """
  308. if self.D["interval"] < map.D["interval"]:
  309. return True
  310. else:
  311. return False
  312. def equivalent(self, map):
  313. """Return True if this relative time object is equivalent to the provided relative time object
  314. A |
  315. B |
  316. """
  317. if self.D["interval"] == map.D["interval"]:
  318. return True
  319. else:
  320. return False
  321. def temporal_relation(self, map):
  322. """Returns the temporal relation between relative time temporal objects
  323. """
  324. if self.equivalent(map):
  325. return "equivalent"
  326. if self.after(map):
  327. return "after"
  328. if self.before(map):
  329. return "before"
  330. return None
  331. def set_id(self, ident):
  332. """Convenient method to set the unique identifier (primary key)"""
  333. self.ident = ident
  334. self.D["id"] = ident
  335. def set_interval(self, interval):
  336. """Set the valid interval time of the map, this should be of type datetime"""
  337. self.D["interval"] = interval
  338. def get_id(self):
  339. """Convenient method to get the unique identifier (primary key)
  340. @return None if not found
  341. """
  342. if self.D.has_key("id"):
  343. return self.D["id"]
  344. else:
  345. return None
  346. def get_interval(self):
  347. """Get the valid interval time of the map
  348. @return None if not found"""
  349. if self.D.has_key("interval"):
  350. return self.D["interval"]
  351. else:
  352. return None
  353. def print_info(self):
  354. """Print information about this class in human readable style"""
  355. # 0123456789012345678901234567890
  356. print " +-------------------- Relative time -----------------------------------------+"
  357. print " | Interval:................... " + str(self.get_interval())
  358. def print_shell_info(self):
  359. """Print information about this class in shell style"""
  360. print "interval=" + str(self.get_interval())
  361. ###############################################################################
  362. class raster_relative_time(relative_temporal_extent):
  363. def __init__(self, ident=None, interval=None):
  364. relative_temporal_extent.__init__(self, "raster_relative_time", ident, interval)
  365. class raster3d_relative_time(relative_temporal_extent):
  366. def __init__(self, ident=None, interval=None):
  367. relative_temporal_extent.__init__(self, "raster3d_relative_time", ident, interval)
  368. class vector_relative_time(relative_temporal_extent):
  369. def __init__(self, ident=None, interval=None):
  370. relative_temporal_extent.__init__(self, "vector_relative_time", ident, interval)
  371. ###############################################################################
  372. class stds_relative_time(relative_temporal_extent):
  373. def __init__(self, table=None, ident=None, interval=None, granularity=None):
  374. relative_temporal_extent.__init__(self, table, ident, interval)
  375. self.set_granularity(granularity)
  376. def set_granularity(self, granularity):
  377. """Set the granularity of the space time dataset"""
  378. self.D["granularity"] = granularity
  379. def get_granularity(self):
  380. """Get the granularity of the space time dataset
  381. @return None if not found"""
  382. if self.D.has_key("granularity"):
  383. return self.D["granularity"]
  384. else:
  385. return None
  386. def print_info(self):
  387. """Print information about this class in human readable style"""
  388. relative_temporal_extent.print_info(self)
  389. # 0123456789012345678901234567890
  390. print " | Granularity:................ " + str(self.get_granularity())
  391. def print_shell_info(self):
  392. """Print information about this class in shell style"""
  393. relative_temporal_extent.print_shell_info(self)
  394. print "granularity=" + str(self.get_granularity())
  395. ###############################################################################
  396. class strds_relative_time(stds_relative_time):
  397. def __init__(self, ident=None, interval=None, granularity=None):
  398. stds_relative_time.__init__(self, "strds_relative_time", ident, interval, granularity)
  399. class str3ds_relative_time(stds_relative_time):
  400. def __init__(self, ident=None, interval=None, granularity=None):
  401. stds_relative_time.__init__(self, "str3ds_relative_time", ident, interval, granularity)
  402. class stvds_relative_time(stds_relative_time):
  403. def __init__(self, ident=None, interval=None, granularity=None):
  404. stds_relative_time.__init__(self, "stvds_relative_time", ident, interval, granularity)