Mercurial > hg > nsaunier > traffic-intelligence
comparison trafficintelligence/storage.py @ 1044:75a6ad604cc5
work on motion patterns
| author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
|---|---|
| date | Thu, 05 Jul 2018 17:06:40 -0400 |
| parents | fc7c0f38e8a6 |
| children | c9c03c97ed9f |
comparison
equal
deleted
inserted
replaced
| 1043:b735895c8815 | 1044:75a6ad604cc5 |
|---|---|
| 245 else: | 245 else: |
| 246 for row in cursor: | 246 for row in cursor: |
| 247 attributes[row[0]] = row[1] | 247 attributes[row[0]] = row[1] |
| 248 return attributes | 248 return attributes |
| 249 | 249 |
| 250 def loadTrajectoriesFromSqlite(filename, trajectoryType, objectNumbers = None, withFeatures = False, timeStep = None, maxNObjectFeatures = 1): | 250 def loadTrajectoriesFromSqlite(filename, trajectoryType, objectNumbers = None, withFeatures = False, timeStep = None, nLongestFeaturesPerObject = None): |
| 251 '''Loads the trajectories (in the general sense, | 251 '''Loads the trajectories (in the general sense, |
| 252 either features, objects (feature groups), longest features per object, or bounding box series) | 252 either features, objects (feature groups), longest features per object, or bounding box series) |
| 253 types are only feature or object | |
| 254 if object, features can be loaded with withFeatures or nLongestObjectFeatures used to select the n longest features | |
| 253 | 255 |
| 254 The number loaded is either the first objectNumbers objects, | 256 The number loaded is either the first objectNumbers objects, |
| 255 or the indices in objectNumbers from the database''' | 257 or the indices in objectNumbers from the database''' |
| 256 objects = [] | 258 objects = [] |
| 257 with sqlite3.connect(filename) as connection: | 259 with sqlite3.connect(filename) as connection: |
| 258 if trajectoryType == 'objectfeature': | 260 objects = loadTrajectoriesFromTable(connection, 'positions', trajectoryType, objectNumbers, timeStep) |
| 259 objectFeatureNumbers = loadObjectFeatureFrameNumbers(filename, objectNumbers) | 261 objectVelocities = loadTrajectoriesFromTable(connection, 'velocities', trajectoryType, objectNumbers, timeStep) |
| 260 featureNumbers = [] | |
| 261 for numbers in objectFeatureNumbers.values(): | |
| 262 featureNumbers += numbers[:min(len(numbers), maxNObjectFeatures)] | |
| 263 objects = loadTrajectoriesFromTable(connection, 'positions', 'feature', featureNumbers, timeStep) | |
| 264 objectVelocities = loadTrajectoriesFromTable(connection, 'velocities', 'feature', featureNumbers, timeStep) | |
| 265 else: | |
| 266 objects = loadTrajectoriesFromTable(connection, 'positions', trajectoryType, objectNumbers, timeStep) | |
| 267 objectVelocities = loadTrajectoriesFromTable(connection, 'velocities', trajectoryType, objectNumbers, timeStep) | |
| 268 | 262 |
| 269 if len(objectVelocities) > 0: | 263 if len(objectVelocities) > 0: |
| 270 for o,v in zip(objects, objectVelocities): | 264 for o,v in zip(objects, objectVelocities): |
| 271 if o.getNum() == v.getNum(): | 265 if o.getNum() == v.getNum(): |
| 272 o.velocities = v.positions | 266 o.velocities = v.positions |
| 281 queryStatement = 'SELECT trajectory_id, object_id FROM objects_features' | 275 queryStatement = 'SELECT trajectory_id, object_id FROM objects_features' |
| 282 if objectNumbers is not None: | 276 if objectNumbers is not None: |
| 283 queryStatement += ' WHERE object_id '+getObjectCriteria(objectNumbers) | 277 queryStatement += ' WHERE object_id '+getObjectCriteria(objectNumbers) |
| 284 queryStatement += ' ORDER BY object_id' # order is important to group all features per object | 278 queryStatement += ' ORDER BY object_id' # order is important to group all features per object |
| 285 logging.debug(queryStatement) | 279 logging.debug(queryStatement) |
| 286 cursor.execute(queryStatement) | 280 cursor.execute(queryStatement) |
| 287 | 281 |
| 288 featureNumbers = {} | 282 featureNumbers = {} |
| 289 for row in cursor: | 283 for row in cursor: |
| 290 objId = row[1] | 284 objId = row[1] |
| 291 if objId not in featureNumbers: | 285 if objId not in featureNumbers: |
| 301 for obj in objects: | 295 for obj in objects: |
| 302 userType, nObjects = attributes[obj.getNum()] | 296 userType, nObjects = attributes[obj.getNum()] |
| 303 obj.setUserType(userType) | 297 obj.setUserType(userType) |
| 304 obj.setNObjects(nObjects) | 298 obj.setNObjects(nObjects) |
| 305 | 299 |
| 300 # add features | |
| 306 if withFeatures: | 301 if withFeatures: |
| 307 nFeatures = 0 | |
| 308 for obj in objects: | 302 for obj in objects: |
| 309 nFeatures = max(nFeatures, max(obj.featureNumbers)) | 303 obj.features = loadTrajectoriesFromSqlite(filename, 'feature', obj.featureNumbers, timeStep = timeStep) |
| 310 features = loadTrajectoriesFromSqlite(filename, 'feature', nFeatures+1, timeStep = timeStep) | 304 elif nLongestFeaturesPerObject is not None: |
| 311 for obj in objects: | 305 for obj in objects: |
| 312 obj.setFeatures(features) | 306 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' |
| 307 logging.debug(queryStatement) | |
| 308 cursor.execute(queryStatement) | |
| 309 obj.features = loadTrajectoriesFromSqlite(filename, 'feature', [row[0] for i,row in enumerate(cursor) if i<nLongestFeaturesPerObject], timeStep = timeStep) | |
| 313 | 310 |
| 314 except sqlite3.OperationalError as error: | 311 except sqlite3.OperationalError as error: |
| 315 printDBError(error) | 312 printDBError(error) |
| 316 return objects | 313 return objects |
| 317 | 314 |
| 335 objectFeatureNumbers[objId] = [row[1]] | 332 objectFeatureNumbers[objId] = [row[1]] |
| 336 return objectFeatureNumbers | 333 return objectFeatureNumbers |
| 337 except sqlite3.OperationalError as error: | 334 except sqlite3.OperationalError as error: |
| 338 printDBError(error) | 335 printDBError(error) |
| 339 return None | 336 return None |
| 340 | |
| 341 def loadObjectTrajectoriesFromSqlite(): | |
| 342 '''Loads object trajectories | |
| 343 either simply objects or features (defaults to loadTrajectoriesFromSqlite) | |
| 344 or the longest features for each object ''' | |
| 345 | |
| 346 | 337 |
| 347 def addCurvilinearTrajectoriesFromSqlite(filename, objects): | 338 def addCurvilinearTrajectoriesFromSqlite(filename, objects): |
| 348 '''Adds curvilinear positions (s_coordinate, y_coordinate, lane) | 339 '''Adds curvilinear positions (s_coordinate, y_coordinate, lane) |
| 349 from a database to an existing MovingObject dict (indexed by each objects's num)''' | 340 from a database to an existing MovingObject dict (indexed by each objects's num)''' |
| 350 with sqlite3.connect(filename) as connection: | 341 with sqlite3.connect(filename) as connection: |
