Mercurial Hosting > traffic-intelligence
diff trafficintelligence/storage.py @ 1054:d13f9bfbf3ff
Retry
author | Wendlasida |
---|---|
date | Fri, 06 Jul 2018 18:42:58 -0400 |
parents | 60cc87e824c4 c9c03c97ed9f |
children | 9e4e80fc5943 67144f26609e |
line wrap: on
line diff
--- a/trafficintelligence/storage.py Thu Jul 05 22:24:31 2018 -0400 +++ b/trafficintelligence/storage.py Fri Jul 06 18:42:58 2018 -0400 @@ -7,7 +7,7 @@ from copy import copy import sqlite3, logging -from numpy import log, min as npmin, max as npmax, round as npround, array, sum as npsum, loadtxt, floor as npfloor, ceil as npceil, linalg +from numpy import log, min as npmin, max as npmax, round as npround, array, sum as npsum, loadtxt, floor as npfloor, ceil as npceil, linalg, int32, int64 from pandas import read_csv, merge from trafficintelligence import utils, moving, events, indicators @@ -22,6 +22,9 @@ 'object': 'objects', 'objectfeatures': 'positions'} +sqlite3.register_adapter(int64, lambda val: int(val)) +sqlite3.register_adapter(int32, lambda val: int(val)) + ######################### # Sqlite ######################### @@ -247,24 +250,18 @@ attributes[row[0]] = row[1] return attributes -def loadTrajectoriesFromSqlite(filename, trajectoryType, objectNumbers = None, withFeatures = False, timeStep = None, maxNObjectFeatures = 1): +def loadTrajectoriesFromSqlite(filename, trajectoryType, objectNumbers = None, withFeatures = False, timeStep = None, nLongestFeaturesPerObject = None): '''Loads the trajectories (in the general sense, - either features, objects (feature groups), longest features per object, or bounding box series) + either features, objects (feature groups), longest features per object, or bounding box series) + types are only feature or object + if object, features can be loaded with withFeatures or nLongestObjectFeatures used to select the n longest features The number loaded is either the first objectNumbers objects, or the indices in objectNumbers from the database''' objects = [] with sqlite3.connect(filename) as connection: - if trajectoryType == 'objectfeature': - objectFeatureNumbers = loadObjectFeatureFrameNumbers(filename, objectNumbers) - featureNumbers = [] - for numbers in objectFeatureNumbers.values(): - featureNumbers += numbers[:min(len(numbers), maxNObjectFeatures)] - objects = loadTrajectoriesFromTable(connection, 'positions', 'feature', featureNumbers, timeStep) - objectVelocities = loadTrajectoriesFromTable(connection, 'velocities', 'feature', featureNumbers, timeStep) - else: - objects = loadTrajectoriesFromTable(connection, 'positions', trajectoryType, objectNumbers, timeStep) - objectVelocities = loadTrajectoriesFromTable(connection, 'velocities', trajectoryType, objectNumbers, timeStep) + objects = loadTrajectoriesFromTable(connection, 'positions', trajectoryType, objectNumbers, timeStep) + objectVelocities = loadTrajectoriesFromTable(connection, 'velocities', trajectoryType, objectNumbers, timeStep) if len(objectVelocities) > 0: for o,v in zip(objects, objectVelocities): @@ -283,7 +280,7 @@ queryStatement += ' WHERE object_id '+getObjectCriteria(objectNumbers) queryStatement += ' ORDER BY object_id' # order is important to group all features per object logging.debug(queryStatement) - cursor.execute(queryStatement) + cursor.execute(queryStatement) featureNumbers = {} for row in cursor: @@ -303,13 +300,16 @@ obj.setUserType(userType) obj.setNObjects(nObjects) + # add features if withFeatures: - nFeatures = 0 for obj in objects: - nFeatures = max(nFeatures, max(obj.featureNumbers)) - features = loadTrajectoriesFromSqlite(filename, 'feature', nFeatures+1, timeStep = timeStep) + obj.features = loadTrajectoriesFromSqlite(filename, 'feature', obj.featureNumbers, timeStep = timeStep) + elif nLongestFeaturesPerObject is not None: for obj in objects: - obj.setFeatures(features) + queryStatement = 'SELECT trajectory_id, max(frame_number)-min(frame_number) AS length FROM positions WHERE trajectory_id '+getObjectCriteria(obj.featureNumbers)+' GROUP BY trajectory_id ORDER BY length DESC' + logging.debug(queryStatement) + cursor.execute(queryStatement) + obj.features = loadTrajectoriesFromSqlite(filename, 'feature', [row[0] for i,row in enumerate(cursor) if i<nLongestFeaturesPerObject], timeStep = timeStep) except sqlite3.OperationalError as error: printDBError(error) @@ -338,12 +338,6 @@ printDBError(error) return None -def loadObjectTrajectoriesFromSqlite(): - '''Loads object trajectories - either simply objects or features (defaults to loadTrajectoriesFromSqlite) - or the longest features for each object ''' - - def addCurvilinearTrajectoriesFromSqlite(filename, objects): '''Adds curvilinear positions (s_coordinate, y_coordinate, lane) from a database to an existing MovingObject dict (indexed by each objects's num)'''