Prechádzať zdrojové kódy

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 11 rokov pred
rodič
commit
5f14551ece

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

@@ -72,10 +72,11 @@ class SpatioTemporalTopologyBuilder(object):
 
         >>> # Example with two lists of maps
         >>> import grass.temporal as tgis
+        >>> import datetime
         >>> # Create two list of maps with equal time stamps
         >>> mapsA = []
         >>> mapsB = []
-        >>> for i in range(10):
+        >>> for i in range(4):
         ...     idA = "a%i@B"%(i)
         ...     mapA = tgis.RasterDataset(idA)
         ...     idB = "b%i@B"%(i)
@@ -97,12 +98,6 @@ class SpatioTemporalTopologyBuilder(object):
         Map a1 has equal relation to map b1
         Map a2 has equal relation to map b2
         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
         >>> for map in mapsB:
         ...     if map.get_equal():
@@ -113,12 +108,174 @@ class SpatioTemporalTopologyBuilder(object):
         Map b1 has equal relation to map a1
         Map b2 has equal relation to map a2
         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
 
@@ -309,7 +466,7 @@ class SpatioTemporalTopologyBuilder(object):
 
             list_ = gis.ilist()
             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)
 
             for k in xrange(list_.n_values):

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

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