changeset 1134:4b2a55d570c1

resolve issue for short features when merging objects manually
author Nicolas Saunier <nicolas.saunier@polymtl.ca>
date Thu, 05 Mar 2020 16:20:29 -0500
parents c4d9c270f999
children 342701cdac30
files setup.py trafficintelligence/moving.py trafficintelligence/tests/moving.txt
diffstat 3 files changed, 19 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/setup.py	Wed Feb 26 22:39:36 2020 -0500
+++ b/setup.py	Thu Mar 05 16:20:29 2020 -0500
@@ -5,7 +5,7 @@
     
 setuptools.setup(
     name='trafficintelligence',
-    version='0.2.4',
+    version='0.2.5',
     author='Nicolas Saunier',
     author_email='nicolas.saunier@polymtl.ca',
     url='https://bitbucket.org/Nicolas/trafficintelligence',
--- a/trafficintelligence/moving.py	Wed Feb 26 22:39:36 2020 -0500
+++ b/trafficintelligence/moving.py	Thu Mar 05 16:20:29 2020 -0500
@@ -1299,11 +1299,13 @@
         inter, self.positions, self.velocities = MovingObject.aggregateTrajectories(self.features, self.getTimeInterval())
 
     @staticmethod
-    def concatenate(obj1, obj2, num = None, newFeatureNum = None, computePositions = False):
+    def concatenate(obj1, obj2, num = None, newFeatureNum = None, minFeatureLength = 5):
         '''Concatenates two objects, whether overlapping temporally or not
 
-        Positions will be recomputed only if computePositions is True
-        Otherwise, only featureNumbers and/or features will be merged'''
+        Positions will be recomputed features are merged
+        Otherwise, only featureNumbers and/or features will be merged
+        minFeatureLength enforces a minimum length to avoid small features
+        (and smaller velocities that are not saved)'''
         if num is None:
             newNum = obj1.getNum()
         else:
@@ -1331,8 +1333,13 @@
             	featureVelocities.addPosition(v)
             	p=p+v
             for t in secondObject.getTimeInterval():
-            	positions.addPosition(secondObject.getPositionAtInstant(t))
-            	velocities.addPosition(secondObject.getVelocityAtInstant(t))
+                p = secondObject.getPositionAtInstant(t)
+                v = secondObject.getVelocityAtInstant(t)
+                positions.addPosition(p)
+                velocities.addPosition(v)
+                if featurePositions.length() < minFeatureLength:
+                    featurePositions.addPosition(p)
+                    featureVelocities.addPosition(v)
             newObject = MovingObject(newNum, TimeInterval(firstObject.getFirstInstant(), secondObject.getLastInstant()), positions, velocities, nObjects = 1)
             if hasattr(obj1, 'featureNumbers') and hasattr(obj2, 'featureNumbers'):
                 if newFeatureNum is not None:
@@ -1340,7 +1347,7 @@
                 else:
                     print('Issue, new created feature has no num id')
             if obj1.hasFeatures() and obj2.hasFeatures():
-                newObject.features = obj1.getFeatures()+obj2.getFeatures()+[MovingObject(newFeatureNum, TimeInterval(emptyInterval.first+1, emptyInterval.last-1), featurePositions, featureVelocities)]
+                newObject.features = obj1.getFeatures()+obj2.getFeatures()+[MovingObject(newFeatureNum, TimeInterval(emptyInterval.first+1, emptyInterval.first+featurePositions.length()), featurePositions, featureVelocities)]
                 newObject.updatePositions()
         else: # time intervals overlap
             newTimeInterval = TimeInterval.union(obj1.getTimeInterval(), obj2.getTimeInterval())
--- a/trafficintelligence/tests/moving.txt	Wed Feb 26 22:39:36 2020 -0500
+++ b/trafficintelligence/tests/moving.txt	Thu Mar 05 16:20:29 2020 -0500
@@ -278,7 +278,8 @@
 True
 >>> len(o13.getFeatures())
 2
->>> o12 = MovingObject.concatenate(o1, o2, 5)
+
+>>> o12 = MovingObject.concatenate(o1, o2, 5, minFeatureLength = 6)
 >>> o12.getTimeInterval() == TimeInterval(o1.getFirstInstant(), o2.getLastInstant())
 True
 >>> v = o12.getVelocityAtInstant(12)
@@ -288,6 +289,9 @@
 True
 >>> len(o12.getFeatures())
 3
+>>> f = o12.getFeatures()[-1]
+>>> f.length()
+6.0
 
 >>> o1 = MovingObject.generate(1, Point(0., 2.), Point(0., 1.), TimeInterval(0,2))
 >>> o1.classifyUserTypeSpeedMotorized(0.5, np.median)