2
Temporal extent classes
8
>>> import grass.temporal as tgis
9
>>> from datetime import datetime
11
>>> t = tgis.RasterRelativeTime()
12
>>> t = tgis.RasterAbsoluteTime()
15
(C) 2012-2013 by the GRASS Development Team
16
This program is free software under the GNU General Public
17
License (>=v2). Read the file COPYING that comes with GRASS
20
:authors: Soeren Gebbert
24
###############################################################################
27
class TemporalExtent(SQLDatabaseInterface):
28
"""This is the abstract time base class for relative and absolute time
31
It abstract class implements the interface to absolute and relative time.
32
Absolute time is represented by datetime time stamps,
33
relative time is represented by a unit an integer value.
35
This class implements temporal topology relationships computation
36
after [Allen and Ferguson 1994 Actions and Events in Interval Temporal Logic].
40
.. code-block:: python
43
>>> A = TemporalExtent(table="raster_absolute_time",
44
... ident="soil@PERMANENT", start_time=datetime(2001, 01, 01),
45
... end_time=datetime(2005,01,01) )
49
datetime.datetime(2001, 1, 1, 0, 0)
51
datetime.datetime(2005, 1, 1, 0, 0)
53
| Start time:................. 2001-01-01 00:00:00
54
| End time:................... 2005-01-01 00:00:00
55
>>> A.print_shell_info()
56
start_time=2001-01-01 00:00:00
57
end_time=2005-01-01 00:00:00
59
>>> A = TemporalExtent(table="raster_absolute_time",
60
... ident="soil@PERMANENT", start_time=0, end_time=1 )
68
| Start time:................. 0
69
| End time:................... 1
70
>>> A.print_shell_info()
75
def __init__(self, table=None, ident=None, start_time=None, end_time=None):
77
SQLDatabaseInterface.__init__(self, table, ident)
80
self.set_start_time(start_time)
81
self.set_end_time(end_time)
83
def intersect(self, extent):
84
"""Intersect this temporal extent with the provided temporal extent and
85
return a new temporal extent with the new start and end time
87
:param extent: The temporal extent to intersect with
88
:return: The new temporal extent with start and end time,
89
or None in case of no intersection
93
.. code-block:: python
95
>>> A = TemporalExtent(start_time=5, end_time=6 )
96
>>> inter = A.intersect(A)
97
>>> inter.print_info()
98
| Start time:................. 5
99
| End time:................... 6
101
>>> A = TemporalExtent(start_time=5, end_time=6 )
102
>>> B = TemporalExtent(start_time=5, end_time=7 )
103
>>> inter = A.intersect(B)
104
>>> inter.print_info()
105
| Start time:................. 5
106
| End time:................... 6
107
>>> inter = B.intersect(A)
108
>>> inter.print_info()
109
| Start time:................. 5
110
| End time:................... 6
112
>>> A = TemporalExtent(start_time=3, end_time=6 )
113
>>> B = TemporalExtent(start_time=5, end_time=7 )
114
>>> inter = A.intersect(B)
115
>>> inter.print_info()
116
| Start time:................. 5
117
| End time:................... 6
118
>>> inter = B.intersect(A)
119
>>> inter.print_info()
120
| Start time:................. 5
121
| End time:................... 6
123
>>> A = TemporalExtent(start_time=3, end_time=8 )
124
>>> B = TemporalExtent(start_time=5, end_time=6 )
125
>>> inter = A.intersect(B)
126
>>> inter.print_info()
127
| Start time:................. 5
128
| End time:................... 6
129
>>> inter = B.intersect(A)
130
>>> inter.print_info()
131
| Start time:................. 5
132
| End time:................... 6
134
>>> A = TemporalExtent(start_time=5, end_time=8 )
135
>>> B = TemporalExtent(start_time=3, end_time=6 )
136
>>> inter = A.intersect(B)
137
>>> inter.print_info()
138
| Start time:................. 5
139
| End time:................... 6
140
>>> inter = B.intersect(A)
141
>>> inter.print_info()
142
| Start time:................. 5
143
| End time:................... 6
145
>>> A = TemporalExtent(start_time=5, end_time=None )
146
>>> B = TemporalExtent(start_time=3, end_time=6 )
147
>>> inter = A.intersect(B)
148
>>> inter.print_info()
149
| Start time:................. 5
150
| End time:................... None
151
>>> inter = B.intersect(A)
152
>>> inter.print_info()
153
| Start time:................. 5
154
| End time:................... None
156
>>> A = TemporalExtent(start_time=5, end_time=8 )
157
>>> B = TemporalExtent(start_time=3, end_time=4 )
158
>>> inter = A.intersect(B)
162
>>> A = TemporalExtent(start_time=5, end_time=8 )
163
>>> B = TemporalExtent(start_time=3, end_time=None )
164
>>> inter = A.intersect(B)
169
relation = self.temporal_relation(extent)
171
if relation == "after" or relation == "before":
174
if self.D["end_time"] is None:
175
return TemporalExtent(start_time=self.D["start_time"])
177
if extent.D["end_time"] is None:
178
return TemporalExtent(start_time=extent.D["start_time"])
183
if self.D["start_time"] > extent.D["start_time"]:
184
start = self.D["start_time"]
186
start = extent.D["start_time"]
188
if self.D["end_time"] > extent.D["end_time"]:
189
end = extent.D["end_time"]
191
end = self.D["end_time"]
193
if issubclass(type(self), RelativeTemporalExtent):
194
return RelativeTemporalExtent(start_time=start, end_time=end,
195
unit=self.get_unit())
196
elif issubclass(type(self), AbsoluteTemporalExtent):
197
return AbsoluteTemporalExtent(start_time=start, end_time=end)
198
elif issubclass(type(self), TemporalExtent):
199
return TemporalExtent(start_time=start, end_time=end)
201
def disjoint_union(self, extent):
202
"""Creates a disjoint union with this temporal extent and the provided one.
203
Return a new temporal extent with the new start and end time.
205
:param extent: The temporal extent to create a union with
206
:return: The new temporal extent with start and end time
210
.. code-block:: python
212
>>> A = TemporalExtent(start_time=5, end_time=6 )
213
>>> inter = A.intersect(A)
214
>>> inter.print_info()
215
| Start time:................. 5
216
| End time:................... 6
218
>>> A = TemporalExtent(start_time=5, end_time=6 )
219
>>> B = TemporalExtent(start_time=5, end_time=7 )
220
>>> inter = A.disjoint_union(B)
221
>>> inter.print_info()
222
| Start time:................. 5
223
| End time:................... 7
224
>>> inter = B.disjoint_union(A)
225
>>> inter.print_info()
226
| Start time:................. 5
227
| End time:................... 7
229
>>> A = TemporalExtent(start_time=3, end_time=6 )
230
>>> B = TemporalExtent(start_time=5, end_time=7 )
231
>>> inter = A.disjoint_union(B)
232
>>> inter.print_info()
233
| Start time:................. 3
234
| End time:................... 7
235
>>> inter = B.disjoint_union(A)
236
>>> inter.print_info()
237
| Start time:................. 3
238
| End time:................... 7
240
>>> A = TemporalExtent(start_time=3, end_time=8 )
241
>>> B = TemporalExtent(start_time=5, end_time=6 )
242
>>> inter = A.disjoint_union(B)
243
>>> inter.print_info()
244
| Start time:................. 3
245
| End time:................... 8
246
>>> inter = B.disjoint_union(A)
247
>>> inter.print_info()
248
| Start time:................. 3
249
| End time:................... 8
251
>>> A = TemporalExtent(start_time=5, end_time=8 )
252
>>> B = TemporalExtent(start_time=3, end_time=6 )
253
>>> inter = A.disjoint_union(B)
254
>>> inter.print_info()
255
| Start time:................. 3
256
| End time:................... 8
257
>>> inter = B.disjoint_union(A)
258
>>> inter.print_info()
259
| Start time:................. 3
260
| End time:................... 8
262
>>> A = TemporalExtent(start_time=5, end_time=None )
263
>>> B = TemporalExtent(start_time=3, end_time=6 )
264
>>> inter = A.disjoint_union(B)
265
>>> inter.print_info()
266
| Start time:................. 3
267
| End time:................... 6
268
>>> inter = B.disjoint_union(A)
269
>>> inter.print_info()
270
| Start time:................. 3
271
| End time:................... 6
273
>>> A = TemporalExtent(start_time=5, end_time=8 )
274
>>> B = TemporalExtent(start_time=3, end_time=4 )
275
>>> inter = A.disjoint_union(B)
276
>>> inter.print_info()
277
| Start time:................. 3
278
| End time:................... 8
279
>>> inter = B.disjoint_union(A)
280
>>> inter.print_info()
281
| Start time:................. 3
282
| End time:................... 8
283
>>> A = TemporalExtent(start_time=5, end_time=8 )
284
>>> B = TemporalExtent(start_time=3, end_time=None )
285
>>> inter = A.disjoint_union(B)
286
>>> inter.print_info()
287
| Start time:................. 3
288
| End time:................... 8
289
>>> inter = B.disjoint_union(A)
290
>>> inter.print_info()
291
| Start time:................. 3
292
| End time:................... 8
293
>>> A = TemporalExtent(start_time=5, end_time=None )
294
>>> B = TemporalExtent(start_time=3, end_time=8 )
295
>>> inter = A.disjoint_union(B)
296
>>> inter.print_info()
297
| Start time:................. 3
298
| End time:................... 8
299
>>> inter = B.disjoint_union(A)
300
>>> inter.print_info()
301
| Start time:................. 3
302
| End time:................... 8
303
>>> A = TemporalExtent(start_time=5, end_time=None )
304
>>> B = TemporalExtent(start_time=3, end_time=None )
305
>>> inter = A.disjoint_union(B)
306
>>> inter.print_info()
307
| Start time:................. 3
308
| End time:................... 5
309
>>> inter = B.disjoint_union(A)
310
>>> inter.print_info()
311
| Start time:................. 3
312
| End time:................... 5
314
>>> A = RelativeTemporalExtent(start_time=5, end_time=None, unit="years" )
315
>>> B = RelativeTemporalExtent(start_time=3, end_time=None, unit="years" )
316
>>> inter = A.disjoint_union(B)
317
>>> inter.print_info()
318
+-------------------- Relative time -----------------------------------------+
319
| Start time:................. 3
320
| End time:................... 5
321
| Relative time unit:......... years
323
>>> inter = B.disjoint_union(A)
324
>>> inter.print_info()
325
+-------------------- Relative time -----------------------------------------+
326
| Start time:................. 3
327
| End time:................... 5
328
| Relative time unit:......... years
331
>>> from datetime import datetime as dt
332
>>> A = AbsoluteTemporalExtent(start_time=dt(2001,1,10), end_time=dt(2003,1,1))
333
>>> B = AbsoluteTemporalExtent(start_time=dt(2005,1,10), end_time=dt(2008,1,1))
334
>>> inter = A.disjoint_union(B)
335
>>> inter.print_info()
336
+-------------------- Absolute time -----------------------------------------+
337
| Start time:................. 2001-01-10 00:00:00
338
| End time:................... 2008-01-01 00:00:00
340
>>> inter = B.disjoint_union(A)
341
>>> inter.print_info()
342
+-------------------- Absolute time -----------------------------------------+
343
| Start time:................. 2001-01-10 00:00:00
344
| End time:................... 2008-01-01 00:00:00
351
if self.D["start_time"] < extent.D["start_time"]:
352
start = self.D["start_time"]
354
start = extent.D["start_time"]
357
if self.D["end_time"] is None and extent.D["end_time"] is None:
358
if self.D["start_time"] > extent.D["start_time"]:
359
end = self.D["start_time"]
361
end = extent.D["start_time"]
362
elif self.D["end_time"] is None:
363
if self.D["start_time"] > extent.D["end_time"]:
364
end = self.D["start_time"]
366
end = extent.D["end_time"]
367
elif extent.D["end_time"] is None:
368
if self.D["end_time"] > extent.D["start_time"]:
369
end = self.D["end_time"]
371
end = extent.D["start_time"]
372
elif self.D["end_time"] < extent.D["end_time"]:
373
end = extent.D["end_time"]
375
end = self.D["end_time"]
377
if issubclass(type(self), RelativeTemporalExtent):
378
return RelativeTemporalExtent(start_time=start, end_time=end,
379
unit=self.get_unit())
380
elif issubclass(type(self), AbsoluteTemporalExtent):
381
return AbsoluteTemporalExtent(start_time=start, end_time=end)
382
elif issubclass(type(self), TemporalExtent):
383
return TemporalExtent(start_time=start, end_time=end)
385
def union(self, extent):
386
"""Creates a union with this temporal extent and the provided one.
387
Return a new temporal extent with the new start and end time.
389
:param extent: The temporal extent to create a union with
390
:return: The new temporal extent with start and end time,
391
or None in case the temporal extents are unrelated
394
.. code-block:: python
396
>>> A = TemporalExtent(start_time=5, end_time=8 )
397
>>> B = TemporalExtent(start_time=3, end_time=4 )
398
>>> inter = A.intersect(B)
402
>>> A = TemporalExtent(start_time=5, end_time=8 )
403
>>> B = TemporalExtent(start_time=3, end_time=None )
404
>>> inter = A.intersect(B)
410
relation = self.temporal_relation(extent)
412
if relation == "after" or relation == "before":
415
return self.disjoint_union(extent)
417
def starts(self, extent):
418
"""Return True if this temporal extent (A) starts at the start of the
419
provided temporal extent (B) and finishes within it
426
:param extent: The temporal extent object with which this extent
431
.. code-block:: python
433
>>> A = TemporalExtent(start_time=5, end_time=6 )
434
>>> B = TemporalExtent(start_time=5, end_time=7 )
441
if self.D["end_time"] is None or extent.D["end_time"] is None:
444
if self.D["start_time"] == extent.D["start_time"] and \
445
self.D["end_time"] < extent.D["end_time"]:
450
def started(self, extent):
451
"""Return True if this temporal extent (A) started at the start of the
452
provided temporal extent (B) and finishes after it
458
:param extent: The temporal extent object with which this extent
463
.. code-block:: python
465
>>> A = TemporalExtent(start_time=5, end_time=7 )
466
>>> B = TemporalExtent(start_time=5, end_time=6 )
473
if self.D["end_time"] is None or extent.D["end_time"] is None:
476
if self.D["start_time"] == extent.D["start_time"] and \
477
self.D["end_time"] > extent.D["end_time"]:
482
def finishes(self, extent):
483
"""Return True if this temporal extent (A) starts after the start of
484
the provided temporal extent (B) and finishes with it
490
:param extent: The temporal extent object with which this extent
495
.. code-block:: python
497
>>> A = TemporalExtent(start_time=6, end_time=7 )
498
>>> B = TemporalExtent(start_time=5, end_time=7 )
505
if self.D["end_time"] is None or extent.D["end_time"] is None:
508
if self.D["end_time"] == extent.D["end_time"] and \
509
self.D["start_time"] > extent.D["start_time"]:
514
def finished(self, extent):
515
"""Return True if this temporal extent (A) starts before the start of
516
the provided temporal extent (B) and finishes with it
522
:param extent: The temporal extent object with which this extent
527
.. code-block:: python
529
>>> A = TemporalExtent(start_time=5, end_time=7 )
530
>>> B = TemporalExtent(start_time=6, end_time=7 )
537
if self.D["end_time"] is None or extent.D["end_time"] is None:
540
if self.D["end_time"] == extent.D["end_time"] and \
541
self.D["start_time"] < extent.D["start_time"]:
546
def after(self, extent):
547
"""Return True if this temporal extent (A) is located after the
548
provided temporal extent (B)
554
:param extent: The temporal extent object that is located before
559
.. code-block:: python
561
>>> A = TemporalExtent(start_time=8, end_time=9 )
562
>>> B = TemporalExtent(start_time=6, end_time=7 )
569
if extent.D["end_time"] is None:
570
if self.D["start_time"] > extent.D["start_time"]:
575
if self.D["start_time"] > extent.D["end_time"]:
580
def before(self, extent):
581
"""Return True if this temporal extent (A) is located before the
582
provided temporal extent (B)
588
:param extent: The temporal extent object that is located after
593
.. code-block:: python
595
>>> A = TemporalExtent(start_time=6, end_time=7 )
596
>>> B = TemporalExtent(start_time=8, end_time=9 )
603
if self.D["end_time"] is None:
604
if self.D["start_time"] < extent.D["start_time"]:
609
if self.D["end_time"] < extent.D["start_time"]:
614
def adjacent(self, extent):
615
"""Return True if this temporal extent (A) is a meeting neighbor the
616
provided temporal extent (B)
624
:param extent: The temporal extent object that is a meeting neighbor
629
.. code-block:: python
631
>>> A = TemporalExtent(start_time=5, end_time=7 )
632
>>> B = TemporalExtent(start_time=7, end_time=9 )
637
>>> A = TemporalExtent(start_time=5, end_time=7 )
638
>>> B = TemporalExtent(start_time=3, end_time=5 )
645
if self.D["end_time"] is None and extent.D["end_time"] is None:
648
if (self.D["start_time"] == extent.D["end_time"]) or \
649
(self.D["end_time"] == extent.D["start_time"]):
654
def follows(self, extent):
655
"""Return True if this temporal extent (A) follows the
656
provided temporal extent (B)
662
:param extent: The temporal extent object that is the predecessor
667
.. code-block:: python
669
>>> A = TemporalExtent(start_time=5, end_time=7 )
670
>>> B = TemporalExtent(start_time=3, end_time=5 )
677
if extent.D["end_time"] is None:
680
if self.D["start_time"] == extent.D["end_time"]:
685
def precedes(self, extent):
686
"""Return True if this temporal extent (A) precedes the provided
694
:param extent: The temporal extent object that is the successor
699
.. code-block:: python
701
>>> A = TemporalExtent(start_time=5, end_time=7 )
702
>>> B = TemporalExtent(start_time=7, end_time=9 )
710
if self.D["end_time"] is None:
713
if self.D["end_time"] == extent.D["start_time"]:
718
def during(self, extent):
719
"""Return True if this temporal extent (A) is located during the provided
726
:param extent: The temporal extent object that contains this extent
730
.. code-block:: python
732
>>> A = TemporalExtent(start_time=5, end_time=7 )
733
>>> B = TemporalExtent(start_time=4, end_time=9 )
740
# Check single point of time in interval
741
if extent.D["end_time"] is None:
744
# Check single point of time in interval
745
if self.D["end_time"] is None:
746
if self.D["start_time"] >= extent.D["start_time"] and \
747
self.D["start_time"] < extent.D["end_time"]:
752
if self.D["start_time"] > extent.D["start_time"] and \
753
self.D["end_time"] < extent.D["end_time"]:
758
def contains(self, extent):
759
"""Return True if this temporal extent (A) contains the provided
766
:param extent: The temporal extent object that is located
771
.. code-block:: python
773
>>> A = TemporalExtent(start_time=4, end_time=9 )
774
>>> B = TemporalExtent(start_time=5, end_time=8 )
781
# Check single point of time in interval
782
if self.D["end_time"] is None:
785
# Check single point of time in interval
786
if extent.D["end_time"] is None:
787
if self.D["start_time"] <= extent.D["start_time"] and \
788
self.D["end_time"] > extent.D["start_time"]:
793
if self.D["start_time"] < extent.D["start_time"] and \
794
self.D["end_time"] > extent.D["end_time"]:
799
def equal(self, extent):
800
"""Return True if this temporal extent (A) is equal to the provided
807
:param extent: The temporal extent object that is equal
812
.. code-block:: python
814
>>> A = TemporalExtent(start_time=5, end_time=6 )
815
>>> B = TemporalExtent(start_time=5, end_time=6 )
822
if self.D["end_time"] is None and extent.D["end_time"] is None:
823
if self.D["start_time"] == extent.D["start_time"]:
828
if self.D["end_time"] is None or extent.D["end_time"] is None:
831
if self.D["start_time"] == extent.D["start_time"] and \
832
self.D["end_time"] == extent.D["end_time"]:
837
def overlaps(self, extent):
838
"""Return True if this temporal extent (A) overlapped the provided
845
:param extent: The temporal extent object that is overlaps
850
.. code-block:: python
852
>>> A = TemporalExtent(start_time=5, end_time=7 )
853
>>> B = TemporalExtent(start_time=6, end_time=8 )
859
>>> A = TemporalExtent(start_time=5, end_time=6 )
860
>>> B = TemporalExtent(start_time=6, end_time=8 )
867
if self.D["end_time"] is None or extent.D["end_time"] is None:
870
if self.D["start_time"] < extent.D["start_time"] and \
871
self.D["end_time"] < extent.D["end_time"] and \
872
self.D["end_time"] > extent.D["start_time"]:
877
def overlapped(self, extent):
878
"""Return True if this temporal extent (A) overlapps the provided
886
:param extent: The temporal extent object that is overlapped
891
.. code-block:: python
893
>>> A = TemporalExtent(start_time=6, end_time=8 )
894
>>> B = TemporalExtent(start_time=5, end_time=7 )
900
>>> A = TemporalExtent(start_time=6, end_time=8 )
901
>>> B = TemporalExtent(start_time=5, end_time=6 )
908
if self.D["end_time"] is None or extent.D["end_time"] is None:
911
if self.D["start_time"] > extent.D["start_time"] and \
912
self.D["end_time"] > extent.D["end_time"] and \
913
self.D["start_time"] < extent.D["end_time"]:
918
def temporal_relation(self, extent):
919
"""Returns the temporal relation between temporal objects
920
Temporal relationships are implemented after
921
[Allen and Ferguson 1994 Actions and Events in Interval Temporal Logic]
923
The following temporal relationships are supported:
939
:param extent: The temporal extent
940
:return: The name of the temporal relation or None if no relation
944
# First check for correct time
945
if "start_time" not in self.D:
947
if "end_time" not in self.D:
949
if "start_time" not in extent.D:
951
if "end_time" not in extent.D:
953
# Return None if the start_time is undefined
954
if self.D["start_time"] is None or extent.D["start_time"] is None:
957
if self.equal(extent):
959
if self.during(extent):
961
if self.contains(extent):
963
if self.overlaps(extent):
965
if self.overlapped(extent):
967
if self.after(extent):
969
if self.before(extent):
971
if self.starts(extent):
973
if self.finishes(extent):
975
if self.started(extent):
977
if self.finished(extent):
979
if self.follows(extent):
981
if self.precedes(extent):
985
def set_id(self, ident):
986
"""Convenient method to set the unique identifier (primary key)"""
990
def set_start_time(self, start_time):
991
"""Set the valid start time of the extent"""
992
self.D["start_time"] = start_time
994
def set_end_time(self, end_time):
995
"""Set the valid end time of the extent"""
996
self.D["end_time"] = end_time
999
"""Convenient method to get the unique identifier (primary key)
1000
:return: None if not found
1007
def get_start_time(self):
1008
"""Get the valid start time of the extent
1009
:return: None if not found"""
1010
if "start_time" in self.D:
1011
return self.D["start_time"]
1015
def get_end_time(self):
1016
"""Get the valid end time of the extent
1017
:return: None if not found"""
1018
if "end_time" in self.D:
1019
return self.D["end_time"]
1023
# Set the properties
1024
id = property(fget=get_id, fset=set_id)
1025
start_time = property(fget=get_start_time, fset=set_start_time)
1026
end_time = property(fget=get_end_time, fset=set_end_time)
1028
def print_info(self):
1029
"""Print information about this class in human readable style"""
1030
# 0123456789012345678901234567890
1031
print " | Start time:................. " + str(self.get_start_time())
1032
print " | End time:................... " + str(self.get_end_time())
1034
def print_shell_info(self):
1035
"""Print information about this class in shell style"""
1036
print "start_time=" + str(self.get_start_time())
1037
print "end_time=" + str(self.get_end_time())
1039
###############################################################################
1042
class AbsoluteTemporalExtent(TemporalExtent):
1043
"""This is the absolute time class for all maps and spacetime datasets
1045
start_time and end_time must be of type datetime
1047
def __init__(self, table=None, ident=None, start_time=None, end_time=None):
1049
TemporalExtent.__init__(
1050
self, table, ident, start_time, end_time)
1052
def print_info(self):
1053
"""Print information about this class in human readable style"""
1054
# 0123456789012345678901234567890
1055
print " +-------------------- Absolute time -----------------------------------------+"
1056
TemporalExtent.print_info(self)
1058
def print_shell_info(self):
1059
"""Print information about this class in shell style"""
1060
TemporalExtent.print_shell_info(self)
1062
###############################################################################
1065
class RasterAbsoluteTime(AbsoluteTemporalExtent):
1066
def __init__(self, ident=None, start_time=None, end_time=None):
1067
AbsoluteTemporalExtent.__init__(self, "raster_absolute_time",
1068
ident, start_time, end_time)
1071
class Raster3DAbsoluteTime(AbsoluteTemporalExtent):
1072
def __init__(self, ident=None, start_time=None, end_time=None):
1073
AbsoluteTemporalExtent.__init__(self, "raster3d_absolute_time",
1074
ident, start_time, end_time)
1077
class VectorAbsoluteTime(AbsoluteTemporalExtent):
1078
def __init__(self, ident=None, start_time=None, end_time=None):
1079
AbsoluteTemporalExtent.__init__(self, "vector_absolute_time",
1080
ident, start_time, end_time)
1082
###############################################################################
1085
class STDSAbsoluteTime(AbsoluteTemporalExtent):
1086
"""This class implements the absolute time extent for space time dataset
1088
In addition to the existing functionality the granularity and the
1093
.. code-block:: python
1096
>>> A = STDSAbsoluteTime(table="strds_absolute_time",
1097
... ident="strds@PERMANENT", start_time=datetime(2001, 01, 01),
1098
... end_time=datetime(2005,01,01), granularity="1 days",
1099
... map_time="interval")
1103
datetime.datetime(2001, 1, 1, 0, 0)
1105
datetime.datetime(2005, 1, 1, 0, 0)
1111
+-------------------- Absolute time -----------------------------------------+
1112
| Start time:................. 2001-01-01 00:00:00
1113
| End time:................... 2005-01-01 00:00:00
1114
| Granularity:................ 1 days
1115
| Temporal type of maps:...... interval
1116
>>> A.print_shell_info()
1117
start_time=2001-01-01 00:00:00
1118
end_time=2005-01-01 00:00:00
1123
def __init__(self, table=None, ident=None, start_time=None, end_time=None,
1124
granularity=None, map_time=None):
1125
AbsoluteTemporalExtent.__init__(
1126
self, table, ident, start_time, end_time)
1128
self.set_granularity(granularity)
1129
self.set_map_time(map_time)
1131
def set_granularity(self, granularity):
1132
"""Set the granularity of the space time dataset"""
1133
self.D["granularity"] = granularity
1135
def set_map_time(self, map_time):
1136
"""Set the type of the map time
1138
Registered maps may have different types of time:
1140
- Single point of time "point"
1141
- Time intervals "interval"
1142
- Single point and interval time "mixed"
1144
This variable will be set automatically when maps are registered.
1146
self.D["map_time"] = map_time
1148
def get_granularity(self):
1149
"""Get the granularity of the space time dataset
1150
:return: None if not found"""
1151
if "granularity" in self.D:
1152
return self.D["granularity"]
1156
def get_map_time(self):
1157
"""Get the type of the map time
1159
Registered maps may have different types of time:
1161
- Single point of time "point"
1162
- Time intervals "interval"
1163
- Single point and interval time "mixed"
1165
This variable will be set automatically when maps are registered.
1167
if "map_time" in self.D:
1168
return self.D["map_time"]
1173
granularity = property(fget=get_granularity, fset=set_granularity)
1174
map_time = property(fget=get_map_time, fset=set_map_time)
1176
def print_info(self):
1177
"""Print information about this class in human readable style"""
1178
AbsoluteTemporalExtent.print_info(self)
1179
# 0123456789012345678901234567890
1180
print " | Granularity:................ " + str(self.get_granularity())
1181
print " | Temporal type of maps:...... " + str(self.get_map_time())
1183
def print_shell_info(self):
1184
"""Print information about this class in shell style"""
1185
AbsoluteTemporalExtent.print_shell_info(self)
1186
print "granularity=" + str(self.get_granularity())
1187
print "map_time=" + str(self.get_map_time())
1189
###############################################################################
1192
class STRDSAbsoluteTime(STDSAbsoluteTime):
1193
def __init__(self, ident=None, start_time=None, end_time=None,
1195
STDSAbsoluteTime.__init__(self, "strds_absolute_time",
1196
ident, start_time, end_time, granularity)
1199
class STR3DSAbsoluteTime(STDSAbsoluteTime):
1200
def __init__(self, ident=None, start_time=None, end_time=None,
1202
STDSAbsoluteTime.__init__(self, "str3ds_absolute_time",
1203
ident, start_time, end_time, granularity)
1206
class STVDSAbsoluteTime(STDSAbsoluteTime):
1207
def __init__(self, ident=None, start_time=None, end_time=None,
1209
STDSAbsoluteTime.__init__(self, "stvds_absolute_time",
1210
ident, start_time, end_time, granularity)
1212
###############################################################################
1215
class RelativeTemporalExtent(TemporalExtent):
1216
"""This is the relative time class for all maps and space time datasets
1218
start_time and end_time must be of type integer
1222
.. code-block:: python
1225
>>> A = RelativeTemporalExtent(table="raster_relative_time",
1226
... ident="soil@PERMANENT", start_time=0, end_time=1, unit="years")
1236
+-------------------- Relative time -----------------------------------------+
1237
| Start time:................. 0
1238
| End time:................... 1
1239
| Relative time unit:......... years
1240
>>> A.print_shell_info()
1246
def __init__(self, table=None, ident=None, start_time=None, end_time=None,
1249
TemporalExtent.__init__(
1250
self, table, ident, start_time, end_time)
1253
def set_unit(self, unit):
1254
"""Set the unit of the relative time. Valid units are:
1263
self.D["unit"] = unit
1266
"""Get the unit of the relative time
1267
:return: None if not found"""
1268
if "unit" in self.D:
1269
return self.D["unit"]
1273
def temporal_relation(self, map):
1274
"""Returns the temporal relation between temporal objects
1275
Temporal relationships are implemented after
1276
[Allen and Ferguson 1994 Actions and Events in Interval Temporal Logic]
1279
# Check units for relative time
1280
if "unit" not in self.D:
1282
if "unit" not in map.D:
1285
# Units must be equal
1286
if self.D["unit"] != map.D["unit"]:
1289
return TemporalExtent.temporal_relation(self, map)
1292
unit = property(fget=get_unit, fset=set_unit)
1294
def print_info(self):
1295
"""Print information about this class in human readable style"""
1296
# 0123456789012345678901234567890
1297
print " +-------------------- Relative time -----------------------------------------+"
1298
TemporalExtent.print_info(self)
1299
print " | Relative time unit:......... " + str(self.get_unit())
1301
def print_shell_info(self):
1302
"""Print information about this class in shell style"""
1303
TemporalExtent.print_shell_info(self)
1304
print "unit=" + str(self.get_unit())
1306
###############################################################################
1309
class RasterRelativeTime(RelativeTemporalExtent):
1310
def __init__(self, ident=None, start_time=None, end_time=None,
1312
RelativeTemporalExtent.__init__(self, "raster_relative_time", ident,
1313
start_time, end_time, unit)
1316
class Raster3DRelativeTime(RelativeTemporalExtent):
1317
def __init__(self, ident=None, start_time=None, end_time=None,
1319
RelativeTemporalExtent.__init__(self, "raster3d_relative_time", ident,
1320
start_time, end_time, unit)
1323
class VectorRelativeTime(RelativeTemporalExtent):
1324
def __init__(self, ident=None, start_time=None, end_time=None,
1326
RelativeTemporalExtent.__init__(
1327
self, "vector_relative_time", ident, start_time, end_time, unit)
1329
###############################################################################
1332
class STDSRelativeTime(RelativeTemporalExtent):
1333
"""This is the relative time class for all maps and space time datasets
1335
start_time and end_time must be of type integer
1339
.. code-block:: python
1342
>>> A = STDSRelativeTime(table="strds_relative_time",
1343
... ident="strds@PERMANENT", start_time=0, end_time=1, unit="years",
1344
... granularity=5, map_time="interval")
1358
+-------------------- Relative time -----------------------------------------+
1359
| Start time:................. 0
1360
| End time:................... 1
1361
| Relative time unit:......... years
1362
| Granularity:................ 5
1363
| Temporal type of maps:...... interval
1364
>>> A.print_shell_info()
1372
def __init__(self, table=None, ident=None, start_time=None, end_time=None,
1373
unit=None, granularity=None, map_time=None):
1374
RelativeTemporalExtent.__init__(
1375
self, table, ident, start_time, end_time, unit)
1377
self.set_granularity(granularity)
1378
self.set_map_time(map_time)
1380
def set_granularity(self, granularity):
1381
"""Set the granularity of the space time dataset"""
1382
self.D["granularity"] = granularity
1384
def set_map_time(self, map_time):
1385
"""Set the type of the map time
1387
Registered maps may have different types of time:
1389
- Single point of time "point"
1390
- Time intervals "interval"
1391
- Single point and interval time "mixed"
1393
This variable will be set automatically when maps are registered.
1395
self.D["map_time"] = map_time
1397
def get_granularity(self):
1398
"""Get the granularity of the space time dataset
1399
:return: None if not found"""
1400
if "granularity" in self.D:
1401
return self.D["granularity"]
1405
def get_map_time(self):
1406
"""Get the type of the map time
1408
Registered maps may have different types of time:
1410
- Single point of time "point"
1411
- Time intervals "interval"
1412
- Single point and interval time "mixed"
1414
This variable will be set automatically when maps are registered.
1416
if "map_time" in self.D:
1417
return self.D["map_time"]
1422
granularity = property(fget=get_granularity, fset=set_granularity)
1423
map_time = property(fget=get_map_time, fset=set_map_time)
1425
def print_info(self):
1426
"""Print information about this class in human readable style"""
1427
RelativeTemporalExtent.print_info(self)
1428
# 0123456789012345678901234567890
1429
print " | Granularity:................ " + str(self.get_granularity())
1430
print " | Temporal type of maps:...... " + str(self.get_map_time())
1432
def print_shell_info(self):
1433
"""Print information about this class in shell style"""
1434
RelativeTemporalExtent.print_shell_info(self)
1435
print "granularity=" + str(self.get_granularity())
1436
print "map_time=" + str(self.get_map_time())
1438
###############################################################################
1441
class STRDSRelativeTime(STDSRelativeTime):
1442
def __init__(self, ident=None, start_time=None, end_time=None,
1443
unit=None, granularity=None, map_time=None):
1444
STDSRelativeTime.__init__(self, "strds_relative_time", ident,
1445
start_time, end_time, unit, granularity,
1449
class STR3DSRelativeTime(STDSRelativeTime):
1450
def __init__(self, ident=None, start_time=None, end_time=None,
1451
unit=None, granularity=None, map_time=None):
1452
STDSRelativeTime.__init__(self, "str3ds_relative_time", ident,
1453
start_time, end_time, unit, granularity,
1457
class STVDSRelativeTime(STDSRelativeTime):
1458
def __init__(self, ident=None, start_time=None, end_time=None,
1459
unit=None, granularity=None, map_time=None):
1460
STDSRelativeTime.__init__(self, "stvds_relative_time", ident,
1461
start_time, end_time, unit, granularity,
1464
###############################################################################
1466
if __name__ == "__main__":