tgis_temporal_extent.py 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486
  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 " Start time:................. " + str(self.get_start_time())
  235. print " End time:................... " + str(self.get_end_time())
  236. print " Timezone:................... " + str(self.get_timezone())
  237. def print_shell_info(self):
  238. """Print information about this class in shell style"""
  239. print "start_time=" + str(self.get_start_time())
  240. print "end_time=" + str(self.get_end_time())
  241. print "timezone=" + str(self.get_timezone())
  242. ###############################################################################
  243. class raster_absolute_time(absolute_temporal_extent):
  244. def __init__(self, ident=None, start_time=None, end_time=None, timezone=None):
  245. absolute_temporal_extent.__init__(self, "raster_absolute_time", ident, start_time, end_time, timezone)
  246. class raster3d_absolute_time(absolute_temporal_extent):
  247. def __init__(self, ident=None, start_time=None, end_time=None, timezone=None):
  248. absolute_temporal_extent.__init__(self, "raster3d_absolute_time", ident, start_time, end_time, timezone)
  249. class vector_absolute_time(absolute_temporal_extent):
  250. def __init__(self, ident=None, start_time=None, end_time=None, timezone=None):
  251. absolute_temporal_extent.__init__(self, "vector_absolute_time", ident, start_time, end_time, timezone)
  252. ###############################################################################
  253. class stds_absolute_time(absolute_temporal_extent):
  254. def __init__(self, table=None, ident=None, start_time=None, end_time=None, granularity=None, timezone=None):
  255. absolute_temporal_extent.__init__(self, table, ident, start_time, end_time, timezone)
  256. self.set_granularity(granularity)
  257. def set_granularity(self, granularity):
  258. """Set the granularity of the space time dataset"""
  259. self.D["granularity"] = granularity
  260. def get_granularity(self):
  261. """Get the granularity of the space time dataset
  262. @return None if not found"""
  263. if self.D.has_key("granularity"):
  264. return self.D["granularity"]
  265. else:
  266. return None
  267. def print_info(self):
  268. """Print information about this class in human readable style"""
  269. absolute_temporal_extent.print_info(self)
  270. # 0123456789012345678901234567890
  271. print " Granularity:................ " + str(self.get_granularity())
  272. def print_shell_info(self):
  273. """Print information about this class in shell style"""
  274. absolute_temporal_extent.print_shell_info(self)
  275. print "granularity=" + str(self.get_granularity())
  276. ###############################################################################
  277. class strds_absolute_time(stds_absolute_time):
  278. def __init__(self, ident=None, start_time=None, end_time=None, granularity=None, timezone=None):
  279. stds_absolute_time.__init__(self, "strds_absolute_time", ident, start_time, end_time, granularity, timezone)
  280. class str3ds_absolute_time(stds_absolute_time):
  281. def __init__(self, ident=None, start_time=None, end_time=None, granularity=None, timezone=None):
  282. stds_absolute_time.__init__(self, "str3ds_absolute_time", ident, start_time, end_time, granularity, timezone)
  283. class stvds_absolute_time(stds_absolute_time):
  284. def __init__(self, ident=None, start_time=None, end_time=None, granularity=None, timezone=None):
  285. stds_absolute_time.__init__(self, "stvds_absolute_time", ident, start_time, end_time, granularity, timezone)
  286. ###############################################################################
  287. class relative_temporal_extent(sql_database_interface):
  288. """This is the relative time base class for all maps and spacetime datasets"""
  289. def __init__(self, table=None, ident=None, interval=None):
  290. sql_database_interface.__init__(self, table, ident)
  291. self.set_id(ident)
  292. self.set_interval(interval)
  293. def after(self, map):
  294. """Return True if this relative time object is temporal located after the provided relative time object
  295. A |
  296. B |
  297. """
  298. if self.D["interval"] > map.D["interval"]:
  299. return True
  300. else:
  301. return False
  302. def before(self, map):
  303. """Return True if this relative time object is temporal located bevor the provided relative time object
  304. A |
  305. B |
  306. """
  307. if self.D["interval"] < map.D["interval"]:
  308. return True
  309. else:
  310. return False
  311. def equivalent(self, map):
  312. """Return True if this relative time object is equivalent to the provided relative time object
  313. A |
  314. B |
  315. """
  316. if self.D["interval"] == map.D["interval"]:
  317. return True
  318. else:
  319. return False
  320. def temporal_relation(self, map):
  321. """Returns the temporal relation between relative time temporal objects
  322. """
  323. if self.equivalent(map):
  324. return "equivalent"
  325. if self.after(map):
  326. return "after"
  327. if self.before(map):
  328. return "before"
  329. return None
  330. def set_id(self, ident):
  331. """Convenient method to set the unique identifier (primary key)"""
  332. self.ident = ident
  333. self.D["id"] = ident
  334. def set_interval(self, interval):
  335. """Set the valid interval time of the map, this should be of type datetime"""
  336. self.D["interval"] = interval
  337. def get_id(self):
  338. """Convenient method to get the unique identifier (primary key)
  339. @return None if not found
  340. """
  341. if self.D.has_key("id"):
  342. return self.D["id"]
  343. else:
  344. return None
  345. def get_interval(self):
  346. """Get the valid interval time of the map
  347. @return None if not found"""
  348. if self.D.has_key("interval"):
  349. return self.D["interval"]
  350. else:
  351. return None
  352. def print_info(self):
  353. """Print information about this class in human readable style"""
  354. # 0123456789012345678901234567890
  355. print " Interval:................... " + str(self.get_interval())
  356. def print_shell_info(self):
  357. """Print information about this class in shell style"""
  358. print "interval=" + str(self.get_interval())
  359. ###############################################################################
  360. class raster_relative_time(relative_temporal_extent):
  361. def __init__(self, ident=None, interval=None):
  362. relative_temporal_extent.__init__(self, "raster_relative_time", ident, interval)
  363. class raster3d_relative_time(relative_temporal_extent):
  364. def __init__(self, ident=None, interval=None):
  365. relative_temporal_extent.__init__(self, "raster3d_relative_time", ident, interval)
  366. class vector_relative_time(relative_temporal_extent):
  367. def __init__(self, ident=None, interval=None):
  368. relative_temporal_extent.__init__(self, "vector_relative_time", ident, interval)
  369. ###############################################################################
  370. class stds_relative_time(relative_temporal_extent):
  371. def __init__(self, table=None, ident=None, interval=None, granularity=None):
  372. relative_temporal_extent.__init__(self, table, ident, interval)
  373. self.set_granularity(granularity)
  374. def set_granularity(self, granularity):
  375. """Set the granularity of the space time dataset"""
  376. self.D["granularity"] = granularity
  377. def get_granularity(self):
  378. """Get the granularity of the space time dataset
  379. @return None if not found"""
  380. if self.D.has_key("granularity"):
  381. return self.D["granularity"]
  382. else:
  383. return None
  384. def print_info(self):
  385. """Print information about this class in human readable style"""
  386. relative_temporal_extent.print_info(self)
  387. # 0123456789012345678901234567890
  388. print " Granularity:................ " + str(self.get_granularity())
  389. def print_shell_info(self):
  390. """Print information about this class in shell style"""
  391. relative_temporal_extent.print_shell_info(self)
  392. print "granularity=" + str(self.get_granularity())
  393. ###############################################################################
  394. class strds_relative_time(stds_relative_time):
  395. def __init__(self, ident=None, interval=None, granularity=None):
  396. stds_relative_time.__init__(self, "strds_relative_time", ident, interval, granularity)
  397. class str3ds_relative_time(stds_relative_time):
  398. def __init__(self, ident=None, interval=None, granularity=None):
  399. stds_relative_time.__init__(self, "str3ds_relative_time", ident, interval, granularity)
  400. class stvds_relative_time(stds_relative_time):
  401. def __init__(self, ident=None, interval=None, granularity=None):
  402. stds_relative_time.__init__(self, "stvds_relative_time", ident, interval, granularity)