Mercurial Hosting > traffic-intelligence
changeset 880:000555430b28
adapted code from Paul St-Aubin and udpated MovingObject.setFeatures to truly find the right features in a list that may not start at 0
author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
---|---|
date | Tue, 14 Mar 2017 17:10:35 -0400 |
parents | f9ea5083588e |
children | 8ba82b371eea |
files | python/moving.py python/storage.py python/tests/storage.txt |
diffstat | 3 files changed, 72 insertions(+), 50 deletions(-) [+] |
line wrap: on
line diff
--- a/python/moving.py Tue Mar 14 14:22:14 2017 -0400 +++ b/python/moving.py Tue Mar 14 17:10:35 2017 -0400 @@ -1242,8 +1242,14 @@ def setUserType(self, userType): self.userType = userType - def setFeatures(self, features): - self.features = [features[i] for i in self.featureNumbers] + def setFeatures(self, features, featuresOrdered = False): + '''Sets the features in the features field based on featureNumbers + if not all features are loaded from 0, one needs to renumber in a dict''' + if featuresOrdered: + tmp = features + else: + tmp = {f.getNum():f for f in features} + self.features = [tmp[i] for i in self.featureNumbers] def getFeatures(self): return self.features
--- a/python/storage.py Tue Mar 14 14:22:14 2017 -0400 +++ b/python/storage.py Tue Mar 14 17:10:35 2017 -0400 @@ -333,72 +333,59 @@ Either feature positions (and velocities if they exist) or curvilinear positions will be saved at a time''' - ## Sanitation - if(type(objects) is not list or len(objects)==0): return False connection = sqlite3.connect(outputFilename) try: cursor = connection.cursor() - ## Extract features from objects - if(trajectoryType == 'object'): - features = [] - for obj in objects: - if(obj.hasFeatures()): - features += obj.getFeatures() - elif(trajectoryType == 'feature'): - features = objects - ## Setup feature queries + # Parse feature and/or object structure and commit to DB if(trajectoryType == 'feature' or trajectoryType == 'object'): + # Extract features from objects + if(trajectoryType == 'object'): + features = [] + for obj in objects: + if(obj.hasFeatures()): + features += obj.getFeatures() + elif(trajectoryType == 'feature'): + features = objects + # Setup feature queries createTrajectoryTable(cursor, "positions") createTrajectoryTable(cursor, "velocities") positionQuery = insertTrajectoryQuery("positions") velocityQuery = insertTrajectoryQuery("velocities") - ## Setup object queries - if(trajectoryType == 'object'): - createObjectsTable(cursor) - createObjectsFeaturesTable(cursor) - objectQuery = insertObjectQuery() - objectFeatureQuery = insertObjectFeatureQuery() - ## Parse feature and/or object structure and commit to DB - if(trajectoryType == 'feature' or trajectoryType == 'object'): - running_tally_of_unique_nums = [] + # Setup object queries + if(trajectoryType == 'object'): + createObjectsTable(cursor) + createObjectsFeaturesTable(cursor) + objectQuery = insertObjectQuery() + objectFeatureQuery = insertObjectFeatureQuery() for feature in features: num = feature.getNum() - if(num not in running_tally_of_unique_nums): - running_tally_of_unique_nums.append(num) - frame_number = feature.getFirstInstant() - for position in feature.getPositions(): - cursor.execute(positionQuery, (num, frame_number, position.x, position.y)) - frame_number += 1 - velocities = feature.getVelocities() - if velocities is not None: - frame_number = feature.getFirstInstant() - for i in xrange(velocities.length()-1): - v = velocities[i] - cursor.execute(velocityQuery, (num, frame_number, v.x, v.y)) - frame_number += 1 + frameNum = feature.getFirstInstant() + for position in feature.getPositions(): + cursor.execute(positionQuery, (num, frameNum, position.x, position.y)) + frameNum += 1 + velocities = feature.getVelocities() + if velocities is not None: + frameNum = feature.getFirstInstant() + for i in xrange(velocities.length()-1): + v = velocities[i] + cursor.execute(velocityQuery, (num, frameNum, v.x, v.y)) + frameNum += 1 if(trajectoryType == 'object'): - running_tally_of_unique_nums = [] for obj in objects: - if(obj.hasFeatures()): - n_objects = len(obj.getFeatures()) - for feature in obj.getFeatures(): - feature_num = feature.getNum() - if(feature_num not in running_tally_of_unique_nums): - running_tally_of_unique_nums.append(feature_num) - cursor.execute(objectFeatureQuery, (obj.getNum(), feature_num)) - else: - n_objects = 0 - cursor.execute(objectQuery, (obj.getNum(), obj.getUserType(), n_objects)) - ## Parse curvilinear position structure + for feature in obj.getFeatures(): + featureNum = feature.getNum() + cursor.execute(objectFeatureQuery, (obj.getNum(), featureNum)) + cursor.execute(objectQuery, (obj.getNum(), obj.getUserType(), 1)) + # Parse curvilinear position structure elif(trajectoryType == 'curvilinear'): createCurvilinearTrajectoryTable(cursor) curvilinearQuery = "insert into curvilinear_positions (trajectory_id, frame_number, s_coordinate, y_coordinate, lane) values (?,?,?,?,?)" for obj in objects: num = obj.getNum() - frame_number = obj.getFirstInstant() + frameNum = obj.getFirstInstant() for position in obj.getCurvilinearPositions(): - cursor.execute(curvilinearQuery, (num, frame_number, position[0], position[1], position[2])) - frame_number += 1 + cursor.execute(curvilinearQuery, (num, frameNum, position[0], position[1], position[2])) + frameNum += 1 else: print('Unknown trajectory type {}'.format(trajectoryType)) connection.commit()
--- a/python/tests/storage.txt Tue Mar 14 14:22:14 2017 -0400 +++ b/python/tests/storage.txt Tue Mar 14 17:10:35 2017 -0400 @@ -71,6 +71,35 @@ True >>> remove('test.sqlite') +>>> f1 = MovingObject.generate(Point(0.,0.), Point(1.,0.), TimeInterval(0,10)) +>>> f1.num = 3 +>>> f2 = MovingObject.generate(Point(1.,1.), Point(-0.5,-0.2), TimeInterval(0,9)) +>>> f2.num = 4 +>>> o1 = MovingObject(num = 1, userType = 1) +>>> o1.features = [f1, f2] +>>> saveTrajectoriesToSqlite('test.sqlite', [o1], 'object') +>>> objects = loadTrajectoriesFromSqlite('test.sqlite', 'object', withFeatures = True) +>>> len(objects) +1 +>>> reloaded1 = objects[0] +>>> reloaded1.getNum() == o1.getNum() +True +>>> reloaded1.getUserType() == o1.getUserType() +True +>>> len(reloaded1.featureNumbers) +2 +>>> len(reloaded1.features) +2 +>>> reloaded1.getPositionAt(0) == Point.midPoint(f1.getPositionAt(0), f2.getPositionAt(0)) +True +>>> reloaded1.getPositionAt(5) == Point.midPoint(f1.getPositionAt(5), f2.getPositionAt(5)) +True +>>> reloaded1.getPositionAt(10) == f1.getPositionAt(10) +True +>>> set(reloaded1.featureNumbers) == set([f1.num, f2.num]) +True +>>> remove('test.sqlite') + >>> strio = StringIO('# asdlfjasdlkj0\nsadlkfjsdlakjf') >>> readline(strio) 'sadlkfjsdlakjf'