tgis_temporal_extent.py 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439
  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 abstract_temporal_extent(sql_database_interface):
  19. """This is the abstract time base class for relative and absolute time objects"""
  20. def __init__(self, table=None, ident=None, start_time=None, end_time=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. def starts(self, map):
  26. """Return True if this absolute time object starts at the start of the provided absolute time object and finishes within it
  27. A |-----|
  28. B |---------|
  29. """
  30. if self.D["start_time"] == map.D["start_time"] and self.D["end_time"] < map.D["end_time"]:
  31. return True
  32. else:
  33. return False
  34. def started(self, map):
  35. """Return True if this absolute time object is started at the start of the provided absolute time object
  36. A |---------|
  37. B |-----|
  38. """
  39. if self.D["start_time"] == map.D["start_time"] and self.D["end_time"] > map.D["end_time"]:
  40. return True
  41. else:
  42. return False
  43. def finishes(self, map):
  44. """Return True if this absolute time object finishes at the end and within of the provided absolute time object
  45. A |-----|
  46. B |---------|
  47. """
  48. if self.D["end_time"] == map.D["end_time"] and self.D["start_time"] > map.D["start_time"] :
  49. return True
  50. else:
  51. return False
  52. def finished(self, map):
  53. """Return True if this absolute time object finished at the end of the provided absolute time object
  54. A |---------|
  55. B |-----|
  56. """
  57. if self.D["end_time"] == map.D["end_time"] and self.D["start_time"] < map.D["start_time"] :
  58. return True
  59. else:
  60. return False
  61. def after(self, map):
  62. """Return True if this absolute time object is temporal located after the provided absolute time object
  63. A |---------|
  64. B |---------|
  65. """
  66. if self.D["start_time"] > map.D["end_time"]:
  67. return True
  68. else:
  69. return False
  70. def before(self, map):
  71. """Return True if this absolute time object is temporal located bevor the provided absolute time object
  72. A |---------|
  73. B |---------|
  74. """
  75. if self.D["end_time"] < map.D["start_time"]:
  76. return True
  77. else:
  78. return False
  79. def adjacent(self, map):
  80. """Return True if this absolute time object is a meeting neighbour the provided absolute time object
  81. A |---------|
  82. B |---------|
  83. A |---------|
  84. B |---------|
  85. """
  86. if (self.D["start_time"] == map.D["end_time"]) or (self.D["end_time"] == map.D["start_time"]):
  87. return True
  88. else:
  89. return False
  90. def follows(self, map):
  91. """Return True if this absolute time object is temporal follows the provided absolute time object
  92. A |---------|
  93. B |---------|
  94. """
  95. if self.D["start_time"] == map.D["end_time"]:
  96. return True
  97. else:
  98. return False
  99. def precedes(self, map):
  100. """Return True if this absolute time object is temporal precedes the provided absolute time object
  101. A |---------|
  102. B |---------|
  103. """
  104. if self.D["end_time"] == map.D["start_time"]:
  105. return True
  106. else:
  107. return False
  108. def during(self, map):
  109. """Return True if this absolute time object is temporal located during the provided absolute time object
  110. A |-------|
  111. B |---------|
  112. """
  113. if self.D["start_time"] > map.D["start_time"] and self.D["end_time"] < map.D["end_time"]:
  114. return True
  115. else:
  116. return False
  117. def contains(self, map):
  118. """Return True if this absolute time object is temporal located during the provided absolute time object
  119. A |---------|
  120. B |-------|
  121. """
  122. if self.D["start_time"] < map.D["start_time"] and self.D["end_time"] > map.D["end_time"]:
  123. return True
  124. else:
  125. return False
  126. def equivalent(self, map):
  127. """Return True if this absolute time object is temporal located equivalent the provided absolute time object
  128. A |---------|
  129. B |---------|
  130. """
  131. if self.D["start_time"] == map.D["start_time"] and self.D["end_time"] == map.D["end_time"]:
  132. return True
  133. else:
  134. return False
  135. def overlaps(self, map):
  136. """Return True if this absolute time object is temporal overlaps the provided absolute time object
  137. A |---------|
  138. B |---------|
  139. """
  140. if self.D["start_time"] < map.D["start_time"] and self.D["end_time"] < map.D["end_time"] and\
  141. self.D["end_time"] > map.D["start_time"]:
  142. return True
  143. else:
  144. return False
  145. def overlapped(self, map):
  146. """Return True if this absolute time object is temporal overlaped by the provided absolute time object
  147. A |---------|
  148. B |---------|
  149. """
  150. if self.D["start_time"] > map.D["start_time"] and self.D["end_time"] > map.D["end_time"] and\
  151. self.D["start_time"] < map.D["end_time"]:
  152. return True
  153. else:
  154. return False
  155. def temporal_relation(self, map):
  156. """Returns the temporal relation between absolute time temporal objects
  157. Temporal relationsships are implemented after [Allen and Ferguson 1994 Actions and Events in Interval Temporal Logic]
  158. """
  159. if self.equivalent(map):
  160. return "equivalent"
  161. if self.during(map):
  162. return "during"
  163. if self.contains(map):
  164. return "contains"
  165. if self.overlaps(map):
  166. return "overlaps"
  167. if self.overlapped(map):
  168. return "overlapped"
  169. if self.after(map):
  170. return "after"
  171. if self.before(map):
  172. return "before"
  173. if self.starts(map):
  174. return "starts"
  175. if self.finishes(map):
  176. return "finishes"
  177. if self.started(map):
  178. return "started"
  179. if self.finished(map):
  180. return "finished"
  181. if self.equivalent(map):
  182. return "equivalent"
  183. if self.follows(map):
  184. return "follows"
  185. if self.precedes(map):
  186. return "precedes"
  187. return None
  188. def set_id(self, ident):
  189. """Convenient method to set the unique identifier (primary key)"""
  190. self.ident = ident
  191. self.D["id"] = ident
  192. def set_start_time(self, start_time):
  193. """Set the valid start time of the map"""
  194. self.D["start_time"] = start_time
  195. def set_end_time(self, end_time):
  196. """Set the valid end time of the map"""
  197. self.D["end_time"] = end_time
  198. def get_id(self):
  199. """Convenient method to get the unique identifier (primary key)
  200. @return None if not found
  201. """
  202. if self.D.has_key("id"):
  203. return self.D["id"]
  204. else:
  205. return None
  206. def get_start_time(self):
  207. """Get the valid start time of the map
  208. @return None if not found"""
  209. if self.D.has_key("start_time"):
  210. return self.D["start_time"]
  211. else:
  212. return None
  213. def get_end_time(self):
  214. """Get the valid end time of the map
  215. @return None if not found"""
  216. if self.D.has_key("end_time"):
  217. return self.D["end_time"]
  218. else:
  219. return None
  220. def print_info(self):
  221. """Print information about this class in human readable style"""
  222. # 0123456789012345678901234567890
  223. print " | Start time:................. " + str(self.get_start_time())
  224. print " | End time:................... " + str(self.get_end_time())
  225. def print_shell_info(self):
  226. """Print information about this class in shell style"""
  227. print "start_time=" + str(self.get_start_time())
  228. print "end_time=" + str(self.get_end_time())
  229. ###############################################################################
  230. class absolute_temporal_extent(abstract_temporal_extent):
  231. """This is the absolute time class for all maps and spacetime datasets
  232. start_time and end_time must be of type datetime
  233. """
  234. def __init__(self, table=None, ident=None, start_time=None, end_time=None, timezone=None):
  235. abstract_temporal_extent.__init__(self, table, ident, start_time, end_time)
  236. self.set_timezone(timezone)
  237. def set_timezone(self, timezone):
  238. """Set the timezone of the map, integer from 1 - 24"""
  239. self.D["timezone"] = timezone
  240. def get_timezone(self):
  241. """Get the timezone of the map
  242. @return None if not found"""
  243. if self.D.has_key("timezone"):
  244. return self.D["timezone"]
  245. else:
  246. return None
  247. def print_info(self):
  248. """Print information about this class in human readable style"""
  249. # 0123456789012345678901234567890
  250. print " +-------------------- Absolute time -----------------------------------------+"
  251. abstract_temporal_extent.print_info(self)
  252. print " | Timezone:................... " + str(self.get_timezone())
  253. def print_shell_info(self):
  254. """Print information about this class in shell style"""
  255. abstract_temporal_extent.print_shell_info(self)
  256. print "timezone=" + str(self.get_timezone())
  257. ###############################################################################
  258. class raster_absolute_time(absolute_temporal_extent):
  259. def __init__(self, ident=None, start_time=None, end_time=None, timezone=None):
  260. absolute_temporal_extent.__init__(self, "raster_absolute_time", ident, start_time, end_time, timezone)
  261. class raster3d_absolute_time(absolute_temporal_extent):
  262. def __init__(self, ident=None, start_time=None, end_time=None, timezone=None):
  263. absolute_temporal_extent.__init__(self, "raster3d_absolute_time", ident, start_time, end_time, timezone)
  264. class vector_absolute_time(absolute_temporal_extent):
  265. def __init__(self, ident=None, start_time=None, end_time=None, timezone=None):
  266. absolute_temporal_extent.__init__(self, "vector_absolute_time", ident, start_time, end_time, timezone)
  267. ###############################################################################
  268. class stds_absolute_time(absolute_temporal_extent):
  269. def __init__(self, table=None, ident=None, start_time=None, end_time=None, granularity=None, timezone=None):
  270. absolute_temporal_extent.__init__(self, table, ident, start_time, end_time, timezone)
  271. self.set_granularity(granularity)
  272. def set_granularity(self, granularity):
  273. """Set the granularity of the space time dataset"""
  274. self.D["granularity"] = granularity
  275. def get_granularity(self):
  276. """Get the granularity of the space time dataset
  277. @return None if not found"""
  278. if self.D.has_key("granularity"):
  279. return self.D["granularity"]
  280. else:
  281. return None
  282. def print_info(self):
  283. """Print information about this class in human readable style"""
  284. absolute_temporal_extent.print_info(self)
  285. # 0123456789012345678901234567890
  286. print " | Granularity:................ " + str(self.get_granularity())
  287. def print_shell_info(self):
  288. """Print information about this class in shell style"""
  289. absolute_temporal_extent.print_shell_info(self)
  290. print "granularity=" + str(self.get_granularity())
  291. ###############################################################################
  292. class strds_absolute_time(stds_absolute_time):
  293. def __init__(self, ident=None, start_time=None, end_time=None, granularity=None, timezone=None):
  294. stds_absolute_time.__init__(self, "strds_absolute_time", ident, start_time, end_time, granularity, timezone)
  295. class str3ds_absolute_time(stds_absolute_time):
  296. def __init__(self, ident=None, start_time=None, end_time=None, granularity=None, timezone=None):
  297. stds_absolute_time.__init__(self, "str3ds_absolute_time", ident, start_time, end_time, granularity, timezone)
  298. class stvds_absolute_time(stds_absolute_time):
  299. def __init__(self, ident=None, start_time=None, end_time=None, granularity=None, timezone=None):
  300. stds_absolute_time.__init__(self, "stvds_absolute_time", ident, start_time, end_time, granularity, timezone)
  301. ###############################################################################
  302. class relative_temporal_extent(abstract_temporal_extent):
  303. """This is the relative time class for all maps and spacetime datasets
  304. start_time and end_time must be of type datetime
  305. """
  306. def __init__(self, table=None, ident=None, start_time=None, end_time=None):
  307. abstract_temporal_extent.__init__(self, table, ident, start_time, end_time)
  308. def print_info(self):
  309. """Print information about this class in human readable style"""
  310. # 0123456789012345678901234567890
  311. print " +-------------------- Reltive time ------------------------------------------+"
  312. abstract_temporal_extent.print_info(self)
  313. ###############################################################################
  314. class raster_relative_time(relative_temporal_extent):
  315. def __init__(self, ident=None, start_time=None, end_time=None):
  316. relative_temporal_extent.__init__(self, "raster_relative_time", ident, start_time, end_time)
  317. class raster3d_relative_time(relative_temporal_extent):
  318. def __init__(self, ident=None, start_time=None, end_time=None):
  319. relative_temporal_extent.__init__(self, "raster3d_relative_time", ident, start_time, end_time)
  320. class vector_relative_time(relative_temporal_extent):
  321. def __init__(self, ident=None, start_time=None, end_time=None):
  322. relative_temporal_extent.__init__(self, "vector_relative_time", ident, start_time, end_time)
  323. ###############################################################################
  324. class stds_relative_time(relative_temporal_extent):
  325. def __init__(self, table=None, ident=None, start_time=None, end_time=None, granularity=None):
  326. relative_temporal_extent.__init__(self, table, ident, start_time, end_time)
  327. self.set_granularity(granularity)
  328. def set_granularity(self, granularity):
  329. """Set the granularity of the space time dataset"""
  330. self.D["granularity"] = granularity
  331. def get_granularity(self):
  332. """Get the granularity of the space time dataset
  333. @return None if not found"""
  334. if self.D.has_key("granularity"):
  335. return self.D["granularity"]
  336. else:
  337. return None
  338. def print_info(self):
  339. """Print information about this class in human readable style"""
  340. relative_temporal_extent.print_info(self)
  341. # 0123456789012345678901234567890
  342. print " | Granularity:................ " + str(self.get_granularity())
  343. def print_shell_info(self):
  344. """Print information about this class in shell style"""
  345. relative_temporal_extent.print_shell_info(self)
  346. print "granularity=" + str(self.get_granularity())
  347. ###############################################################################
  348. class strds_relative_time(stds_relative_time):
  349. def __init__(self, ident=None, start_time=None, end_time=None, granularity=None):
  350. stds_relative_time.__init__(self, "strds_relative_time", ident, start_time, end_time, granularity)
  351. class str3ds_relative_time(stds_relative_time):
  352. def __init__(self, ident=None, start_time=None, end_time=None, granularity=None):
  353. stds_relative_time.__init__(self, "str3ds_relative_time", ident, start_time, end_time, granularity)
  354. class stvds_relative_time(stds_relative_time):
  355. def __init__(self, ident=None, start_time=None, end_time=None, granularity=None):
  356. stds_relative_time.__init__(self, "stvds_relative_time", ident, start_time, end_time, granularity)