Browse Source

Corrected overlaps/overlapped relations and added new tests to check the temporal topology builder.

git-svn-id: https://svn.osgeo.org/grass/grass/trunk@57485 15284696-431f-4ddb-bdfa-cd5b030d7da7
Soeren Gebbert 12 years ago
parent
commit
5f14551ece

+ 171 - 14
lib/python/temporal/spatio_temporal_relationships.py

@@ -72,10 +72,11 @@ class SpatioTemporalTopologyBuilder(object):
 
 
         >>> # Example with two lists of maps
         >>> # Example with two lists of maps
         >>> import grass.temporal as tgis
         >>> import grass.temporal as tgis
+        >>> import datetime
         >>> # Create two list of maps with equal time stamps
         >>> # Create two list of maps with equal time stamps
         >>> mapsA = []
         >>> mapsA = []
         >>> mapsB = []
         >>> mapsB = []
-        >>> for i in range(10):
+        >>> for i in range(4):
         ...     idA = "a%i@B"%(i)
         ...     idA = "a%i@B"%(i)
         ...     mapA = tgis.RasterDataset(idA)
         ...     mapA = tgis.RasterDataset(idA)
         ...     idB = "b%i@B"%(i)
         ...     idB = "b%i@B"%(i)
@@ -97,12 +98,6 @@ class SpatioTemporalTopologyBuilder(object):
         Map a1 has equal relation to map b1
         Map a1 has equal relation to map b1
         Map a2 has equal relation to map b2
         Map a2 has equal relation to map b2
         Map a3 has equal relation to map b3
         Map a3 has equal relation to map b3
-        Map a4 has equal relation to map b4
-        Map a5 has equal relation to map b5
-        Map a6 has equal relation to map b6
-        Map a7 has equal relation to map b7
-        Map a8 has equal relation to map b8
-        Map a9 has equal relation to map b9
         >>> # Check relations of mapsB
         >>> # Check relations of mapsB
         >>> for map in mapsB:
         >>> for map in mapsB:
         ...     if map.get_equal():
         ...     if map.get_equal():
@@ -113,12 +108,174 @@ class SpatioTemporalTopologyBuilder(object):
         Map b1 has equal relation to map a1
         Map b1 has equal relation to map a1
         Map b2 has equal relation to map a2
         Map b2 has equal relation to map a2
         Map b3 has equal relation to map a3
         Map b3 has equal relation to map a3
-        Map b4 has equal relation to map a4
-        Map b5 has equal relation to map a5
-        Map b6 has equal relation to map a6
-        Map b7 has equal relation to map a7
-        Map b8 has equal relation to map a8
-        Map b9 has equal relation to map a9
+
+
+        >>> mapsA = []
+        >>> mapsB = []
+        >>> for i in range(4):
+        ...     idA = "a%i@B"%(i)
+        ...     mapA = tgis.RasterDataset(idA)
+        ...     idB = "b%i@B"%(i)
+        ...     mapB = tgis.RasterDataset(idB)
+        ...     check = mapA.set_relative_time(i, i + 1, "months")
+        ...     check = mapB.set_relative_time(i + 1, i + 2, "months")
+        ...     mapsA.append(mapA)
+        ...     mapsB.append(mapB)
+        >>> # Build the topology between the two map lists
+        >>> tb = SpatioTemporalTopologyBuilder()
+        >>> tb.build(mapsA, mapsB, None)
+        >>> # Check relations of mapsA
+        >>> for map in mapsA:
+        ...     print(map.get_temporal_extent_as_tuple())
+        ...     m = map.get_temporal_relations()
+        ...     for key in m.keys():
+        ...         if key not in ["NEXT", "PREV"]:
+        ...             print(key, m[key][0].get_temporal_extent_as_tuple())
+        (0, 1)
+        ('PRECEDES', (1, 2))
+        (1, 2)
+        ('PRECEDES', (2, 3))
+        ('EQUAL', (1, 2))
+        (2, 3)
+        ('FOLLOWS', (1, 2))
+        ('PRECEDES', (3, 4))
+        ('EQUAL', (2, 3))
+        (3, 4)
+        ('FOLLOWS', (2, 3))
+        ('EQUAL', (3, 4))
+        ('PRECEDES', (4, 5))
+
+        >>> mapsA = []
+        >>> mapsB = []
+        >>> for i in range(4):
+        ...     idA = "a%i@B"%(i)
+        ...     mapA = tgis.RasterDataset(idA)
+        ...     idB = "b%i@B"%(i)
+        ...     mapB = tgis.RasterDataset(idB)
+        ...     start = datetime.datetime(2000 + i, 1, 1)
+        ...     end = datetime.datetime(2000 + i + 1, 1, 1)
+        ...     check = mapA.set_absolute_time(start, end)
+        ...     start = datetime.datetime(2000 + i + 1, 1, 1)
+        ...     end = datetime.datetime(2000 + i + 2, 1, 1)
+        ...     check = mapB.set_absolute_time(start, end)
+        ...     mapsA.append(mapA)
+        ...     mapsB.append(mapB)
+        >>> # Build the topology between the two map lists
+        >>> tb = SpatioTemporalTopologyBuilder()
+        >>> tb.build(mapsA, mapsB, None)
+        >>> # Check relations of mapsA
+        >>> for map in mapsA:
+        ...     print(map.get_temporal_extent_as_tuple())
+        ...     m = map.get_temporal_relations()
+        ...     for key in m.keys():
+        ...         if key not in ["NEXT", "PREV"]:
+        ...             print(key, m[key][0].get_temporal_extent_as_tuple())
+        (datetime.datetime(2000, 1, 1, 0, 0), datetime.datetime(2001, 1, 1, 0, 0))
+        ('PRECEDES', (datetime.datetime(2001, 1, 1, 0, 0), datetime.datetime(2002, 1, 1, 0, 0)))
+        (datetime.datetime(2001, 1, 1, 0, 0), datetime.datetime(2002, 1, 1, 0, 0))
+        ('PRECEDES', (datetime.datetime(2002, 1, 1, 0, 0), datetime.datetime(2003, 1, 1, 0, 0)))
+        ('EQUAL', (datetime.datetime(2001, 1, 1, 0, 0), datetime.datetime(2002, 1, 1, 0, 0)))
+        (datetime.datetime(2002, 1, 1, 0, 0), datetime.datetime(2003, 1, 1, 0, 0))
+        ('FOLLOWS', (datetime.datetime(2001, 1, 1, 0, 0), datetime.datetime(2002, 1, 1, 0, 0)))
+        ('PRECEDES', (datetime.datetime(2003, 1, 1, 0, 0), datetime.datetime(2004, 1, 1, 0, 0)))
+        ('EQUAL', (datetime.datetime(2002, 1, 1, 0, 0), datetime.datetime(2003, 1, 1, 0, 0)))
+        (datetime.datetime(2003, 1, 1, 0, 0), datetime.datetime(2004, 1, 1, 0, 0))
+        ('FOLLOWS', (datetime.datetime(2002, 1, 1, 0, 0), datetime.datetime(2003, 1, 1, 0, 0)))
+        ('EQUAL', (datetime.datetime(2003, 1, 1, 0, 0), datetime.datetime(2004, 1, 1, 0, 0)))
+        ('PRECEDES', (datetime.datetime(2004, 1, 1, 0, 0), datetime.datetime(2005, 1, 1, 0, 0)))
+
+        >>> mapsA = []
+        >>> mapsB = []
+        >>> for i in range(4):
+        ...     idA = "a%i@B"%(i)
+        ...     mapA = tgis.RasterDataset(idA)
+        ...     idB = "b%i@B"%(i)
+        ...     mapB = tgis.RasterDataset(idB)
+        ...     start = datetime.datetime(2000 + i, 1, 1)
+        ...     end = datetime.datetime(2000 + i + 1, 1, 1)
+        ...     check = mapA.set_absolute_time(start, end)
+        ...     start = datetime.datetime(2000 + i, 1, 1)
+        ...     end = datetime.datetime(2000 + i + 3, 1, 1)
+        ...     check = mapB.set_absolute_time(start, end)
+        ...     mapsA.append(mapA)
+        ...     mapsB.append(mapB)
+        >>> # Build the topology between the two map lists
+        >>> tb = SpatioTemporalTopologyBuilder()
+        >>> tb.build(mapsA, mapsB, None)
+        >>> # Check relations of mapsA
+        >>> for map in mapsA:
+        ...     print(map.get_temporal_extent_as_tuple())
+        ...     m = map.get_temporal_relations()
+        ...     for key in m.keys():
+        ...         if key not in ["NEXT", "PREV"]:
+        ...             print(key, m[key][0].get_temporal_extent_as_tuple())
+        (datetime.datetime(2000, 1, 1, 0, 0), datetime.datetime(2001, 1, 1, 0, 0))
+        ('DURING', (datetime.datetime(2000, 1, 1, 0, 0), datetime.datetime(2003, 1, 1, 0, 0)))
+        ('STARTS', (datetime.datetime(2000, 1, 1, 0, 0), datetime.datetime(2003, 1, 1, 0, 0)))
+        ('PRECEDES', (datetime.datetime(2001, 1, 1, 0, 0), datetime.datetime(2004, 1, 1, 0, 0)))
+        (datetime.datetime(2001, 1, 1, 0, 0), datetime.datetime(2002, 1, 1, 0, 0))
+        ('DURING', (datetime.datetime(2000, 1, 1, 0, 0), datetime.datetime(2003, 1, 1, 0, 0)))
+        ('STARTS', (datetime.datetime(2001, 1, 1, 0, 0), datetime.datetime(2004, 1, 1, 0, 0)))
+        ('PRECEDES', (datetime.datetime(2002, 1, 1, 0, 0), datetime.datetime(2005, 1, 1, 0, 0)))
+        (datetime.datetime(2002, 1, 1, 0, 0), datetime.datetime(2003, 1, 1, 0, 0))
+        ('PRECEDES', (datetime.datetime(2003, 1, 1, 0, 0), datetime.datetime(2006, 1, 1, 0, 0)))
+        ('FINISHES', (datetime.datetime(2000, 1, 1, 0, 0), datetime.datetime(2003, 1, 1, 0, 0)))
+        ('DURING', (datetime.datetime(2000, 1, 1, 0, 0), datetime.datetime(2003, 1, 1, 0, 0)))
+        ('STARTS', (datetime.datetime(2002, 1, 1, 0, 0), datetime.datetime(2005, 1, 1, 0, 0)))
+        (datetime.datetime(2003, 1, 1, 0, 0), datetime.datetime(2004, 1, 1, 0, 0))
+        ('FOLLOWS', (datetime.datetime(2000, 1, 1, 0, 0), datetime.datetime(2003, 1, 1, 0, 0)))
+        ('DURING', (datetime.datetime(2001, 1, 1, 0, 0), datetime.datetime(2004, 1, 1, 0, 0)))
+        ('FINISHES', (datetime.datetime(2001, 1, 1, 0, 0), datetime.datetime(2004, 1, 1, 0, 0)))
+        ('STARTS', (datetime.datetime(2003, 1, 1, 0, 0), datetime.datetime(2006, 1, 1, 0, 0)))
+
+        >>> mapsA = []
+        >>> mapsB = []
+        >>> for i in range(4):
+        ...     idA = "a%i@B"%(i)
+        ...     mapA = tgis.RasterDataset(idA)
+        ...     idB = "b%i@B"%(i)
+        ...     mapB = tgis.RasterDataset(idB)
+        ...     start = datetime.datetime(2000 + i, 1, 1)
+        ...     end = datetime.datetime(2000 + i + 2, 1, 1)
+        ...     check = mapA.set_absolute_time(start, end)
+        ...     start = datetime.datetime(2000 + i, 1, 1)
+        ...     end = datetime.datetime(2000 + i + 3, 1, 1)
+        ...     check = mapB.set_absolute_time(start, end)
+        ...     mapsA.append(mapA)
+        ...     mapsB.append(mapB)
+        >>> # Build the topology between the two map lists
+        >>> tb = SpatioTemporalTopologyBuilder()
+        >>> tb.build(mapsA, mapsB, None)
+        >>> # Check relations of mapsA
+        >>> for map in mapsA:
+        ...     print(map.get_temporal_extent_as_tuple())
+        ...     m = map.get_temporal_relations()
+        ...     for key in m.keys():
+        ...         if key not in ["NEXT", "PREV"]:
+        ...             print(key, m[key][0].get_temporal_extent_as_tuple())
+        (datetime.datetime(2000, 1, 1, 0, 0), datetime.datetime(2002, 1, 1, 0, 0))
+        ('OVERLAPS', (datetime.datetime(2001, 1, 1, 0, 0), datetime.datetime(2004, 1, 1, 0, 0)))
+        ('DURING', (datetime.datetime(2000, 1, 1, 0, 0), datetime.datetime(2003, 1, 1, 0, 0)))
+        ('STARTS', (datetime.datetime(2000, 1, 1, 0, 0), datetime.datetime(2003, 1, 1, 0, 0)))
+        ('PRECEDES', (datetime.datetime(2002, 1, 1, 0, 0), datetime.datetime(2005, 1, 1, 0, 0)))
+        (datetime.datetime(2001, 1, 1, 0, 0), datetime.datetime(2003, 1, 1, 0, 0))
+        ('OVERLAPS', (datetime.datetime(2002, 1, 1, 0, 0), datetime.datetime(2005, 1, 1, 0, 0)))
+        ('PRECEDES', (datetime.datetime(2003, 1, 1, 0, 0), datetime.datetime(2006, 1, 1, 0, 0)))
+        ('FINISHES', (datetime.datetime(2000, 1, 1, 0, 0), datetime.datetime(2003, 1, 1, 0, 0)))
+        ('DURING', (datetime.datetime(2000, 1, 1, 0, 0), datetime.datetime(2003, 1, 1, 0, 0)))
+        ('STARTS', (datetime.datetime(2001, 1, 1, 0, 0), datetime.datetime(2004, 1, 1, 0, 0)))
+        (datetime.datetime(2002, 1, 1, 0, 0), datetime.datetime(2004, 1, 1, 0, 0))
+        ('OVERLAPS', (datetime.datetime(2003, 1, 1, 0, 0), datetime.datetime(2006, 1, 1, 0, 0)))
+        ('OVERLAPPED', (datetime.datetime(2000, 1, 1, 0, 0), datetime.datetime(2003, 1, 1, 0, 0)))
+        ('FINISHES', (datetime.datetime(2001, 1, 1, 0, 0), datetime.datetime(2004, 1, 1, 0, 0)))
+        ('DURING', (datetime.datetime(2001, 1, 1, 0, 0), datetime.datetime(2004, 1, 1, 0, 0)))
+        ('STARTS', (datetime.datetime(2002, 1, 1, 0, 0), datetime.datetime(2005, 1, 1, 0, 0)))
+        (datetime.datetime(2003, 1, 1, 0, 0), datetime.datetime(2005, 1, 1, 0, 0))
+        ('OVERLAPPED', (datetime.datetime(2001, 1, 1, 0, 0), datetime.datetime(2004, 1, 1, 0, 0)))
+        ('DURING', (datetime.datetime(2002, 1, 1, 0, 0), datetime.datetime(2005, 1, 1, 0, 0)))
+        ('FINISHES', (datetime.datetime(2002, 1, 1, 0, 0), datetime.datetime(2005, 1, 1, 0, 0)))
+        ('STARTS', (datetime.datetime(2003, 1, 1, 0, 0), datetime.datetime(2006, 1, 1, 0, 0)))
+        ('FOLLOWS', (datetime.datetime(2000, 1, 1, 0, 0), datetime.datetime(2003, 1, 1, 0, 0)))
 
 
         @endcode
         @endcode
 
 
@@ -309,7 +466,7 @@ class SpatioTemporalTopologyBuilder(object):
 
 
             list_ = gis.ilist()
             list_ = gis.ilist()
             rect = self._map_to_rect(tree, mapsB[j], spatial)
             rect = self._map_to_rect(tree, mapsB[j], spatial)
-            num = vector.RTreeSearch2(tree, rect, byref(list_))
+            vector.RTreeSearch2(tree, rect, byref(list_))
             vector.RTreeFreeRect(rect)
             vector.RTreeFreeRect(rect)
 
 
             for k in xrange(list_.n_values):
             for k in xrange(list_.n_values):

+ 20 - 6
lib/python/temporal/temporal_extent.py

@@ -844,7 +844,7 @@ class AbstractTemporalExtent(SQLDatabaseInterface):
         else:
         else:
             return False
             return False
 
 
-    def overlapped(self, extent):
+    def overlaps(self, extent):
         """!Return True if this temporal extent (A) overlapped the provided
         """!Return True if this temporal extent (A) overlapped the provided
            temporal extent (B)
            temporal extent (B)
            @verbatim
            @verbatim
@@ -860,9 +860,16 @@ class AbstractTemporalExtent(SQLDatabaseInterface):
 
 
            >>> A = AbstractTemporalExtent(start_time=5, end_time=7 )
            >>> A = AbstractTemporalExtent(start_time=5, end_time=7 )
            >>> B = AbstractTemporalExtent(start_time=6, end_time=8 )
            >>> B = AbstractTemporalExtent(start_time=6, end_time=8 )
-           >>> A.overlapped(B)
+           >>> A.overlaps(B)
            True
            True
-           >>> B.overlapped(A)
+           >>> B.overlaps(A)
+           False
+
+           >>> A = AbstractTemporalExtent(start_time=5, end_time=6 )
+           >>> B = AbstractTemporalExtent(start_time=6, end_time=8 )
+           >>> A.overlaps(B)
+           False
+           >>> B.overlaps(A)
            False
            False
 
 
            @endcode
            @endcode
@@ -877,7 +884,7 @@ class AbstractTemporalExtent(SQLDatabaseInterface):
         else:
         else:
             return False
             return False
 
 
-    def overlaps(self, extent):
+    def overlapped(self, extent):
         """!Return True if this temporal extent (A) overlapps the provided
         """!Return True if this temporal extent (A) overlapps the provided
            temporal extent (B)
            temporal extent (B)
            @verbatim
            @verbatim
@@ -894,9 +901,16 @@ class AbstractTemporalExtent(SQLDatabaseInterface):
 
 
            >>> A = AbstractTemporalExtent(start_time=6, end_time=8 )
            >>> A = AbstractTemporalExtent(start_time=6, end_time=8 )
            >>> B = AbstractTemporalExtent(start_time=5, end_time=7 )
            >>> B = AbstractTemporalExtent(start_time=5, end_time=7 )
-           >>> A.overlaps(B)
+           >>> A.overlapped(B)
            True
            True
-           >>> B.overlaps(A)
+           >>> B.overlapped(A)
+           False
+
+           >>> A = AbstractTemporalExtent(start_time=6, end_time=8 )
+           >>> B = AbstractTemporalExtent(start_time=5, end_time=6 )
+           >>> A.overlapped(B)
+           False
+           >>> B.overlapped(A)
            False
            False
 
 
            @endcode
            @endcode