Mercurial > hg > nsaunier > traffic-intelligence
comparison python/storage.py @ 879:f9ea5083588e
Initial commit of object DB storage update
| author | pstaub |
|---|---|
| date | Tue, 14 Mar 2017 14:22:14 -0400 |
| parents | c70adaeeddf5 |
| children | 000555430b28 |
comparison
equal
deleted
inserted
replaced
| 878:8e8ec4ece66e | 879:f9ea5083588e |
|---|---|
| 50 if tableName in ['positions', 'velocities']: | 50 if tableName in ['positions', 'velocities']: |
| 51 cursor.execute("CREATE TABLE IF NOT EXISTS "+tableName+" (trajectory_id INTEGER, frame_number INTEGER, x_coordinate REAL, y_coordinate REAL, PRIMARY KEY(trajectory_id, frame_number))") | 51 cursor.execute("CREATE TABLE IF NOT EXISTS "+tableName+" (trajectory_id INTEGER, frame_number INTEGER, x_coordinate REAL, y_coordinate REAL, PRIMARY KEY(trajectory_id, frame_number))") |
| 52 else: | 52 else: |
| 53 print('Unallowed name {} for trajectory table'.format(tableName)) | 53 print('Unallowed name {} for trajectory table'.format(tableName)) |
| 54 | 54 |
| 55 def createObjectsTable(cursor): | |
| 56 cursor.execute("CREATE TABLE IF NOT EXISTS objects (object_id INTEGER, road_user_type INTEGER, n_objects INTEGER, PRIMARY KEY(object_id))") | |
| 57 | |
| 58 def createObjectsFeaturesTable(cursor): | |
| 59 cursor.execute("CREATE TABLE IF NOT EXISTS objects_features (object_id INTEGER, trajectory_id INTEGER, PRIMARY KEY(trajectory_id))") | |
| 60 | |
| 61 | |
| 55 def createCurvilinearTrajectoryTable(cursor): | 62 def createCurvilinearTrajectoryTable(cursor): |
| 56 cursor.execute("CREATE TABLE IF NOT EXISTS curvilinear_positions (trajectory_id INTEGER, frame_number INTEGER, s_coordinate REAL, y_coordinate REAL, lane TEXT, PRIMARY KEY(trajectory_id, frame_number))") | 63 cursor.execute("CREATE TABLE IF NOT EXISTS curvilinear_positions (trajectory_id INTEGER, frame_number INTEGER, s_coordinate REAL, y_coordinate REAL, lane TEXT, PRIMARY KEY(trajectory_id, frame_number))") |
| 57 | 64 |
| 58 def createFeatureCorrespondenceTable(cursor): | 65 def createFeatureCorrespondenceTable(cursor): |
| 59 cursor.execute('CREATE TABLE IF NOT EXISTS feature_correspondences (trajectory_id INTEGER, source_dbname VARCHAR, db_trajectory_id INTEGER, PRIMARY KEY(trajectory_id))') | 66 cursor.execute('CREATE TABLE IF NOT EXISTS feature_correspondences (trajectory_id INTEGER, source_dbname VARCHAR, db_trajectory_id INTEGER, PRIMARY KEY(trajectory_id))') |
| 64 def createIndicatorTable(cursor): | 71 def createIndicatorTable(cursor): |
| 65 cursor.execute('CREATE TABLE IF NOT EXISTS indicators (interaction_id INTEGER, indicator_type INTEGER, frame_number INTEGER, value REAL, FOREIGN KEY(interaction_id) REFERENCES interactions(id), PRIMARY KEY(interaction_id, indicator_type, frame_number))') | 72 cursor.execute('CREATE TABLE IF NOT EXISTS indicators (interaction_id INTEGER, indicator_type INTEGER, frame_number INTEGER, value REAL, FOREIGN KEY(interaction_id) REFERENCES interactions(id), PRIMARY KEY(interaction_id, indicator_type, frame_number))') |
| 66 | 73 |
| 67 def insertTrajectoryQuery(tableName): | 74 def insertTrajectoryQuery(tableName): |
| 68 return "INSERT INTO "+tableName+" (trajectory_id, frame_number, x_coordinate, y_coordinate) VALUES (?,?,?,?)" | 75 return "INSERT INTO "+tableName+" (trajectory_id, frame_number, x_coordinate, y_coordinate) VALUES (?,?,?,?)" |
| 76 | |
| 77 def insertObjectQuery(): | |
| 78 return "INSERT INTO objects (object_id, road_user_type, n_objects) VALUES (?,?,?)" | |
| 79 | |
| 80 def insertObjectFeatureQuery(): | |
| 81 return "INSERT INTO objects_features (object_id, trajectory_id) VALUES (?,?)" | |
| 69 | 82 |
| 70 def createIndex(connection, tableName, columnName, unique = False): | 83 def createIndex(connection, tableName, columnName, unique = False): |
| 71 '''Creates an index for the column in the table | 84 '''Creates an index for the column in the table |
| 72 I will make querying with a condition on this column faster''' | 85 I will make querying with a condition on this column faster''' |
| 73 try: | 86 try: |
| 311 if objNum in objects: | 324 if objNum in objects: |
| 312 objects[objNum].curvilinearPositions.addPositionSYL(row[2],row[3],row[4]) | 325 objects[objNum].curvilinearPositions.addPositionSYL(row[2],row[3],row[4]) |
| 313 if len(missingObjectNumbers) > 0: | 326 if len(missingObjectNumbers) > 0: |
| 314 print('List of missing objects to attach corresponding curvilinear trajectories: {}'.format(missingObjectNumbers)) | 327 print('List of missing objects to attach corresponding curvilinear trajectories: {}'.format(missingObjectNumbers)) |
| 315 | 328 |
| 329 | |
| 316 def saveTrajectoriesToSqlite(outputFilename, objects, trajectoryType, withFeatures = False): | 330 def saveTrajectoriesToSqlite(outputFilename, objects, trajectoryType, withFeatures = False): |
| 317 '''Writes features, ie the trajectory positions (and velocities if exist) | 331 '''Writes features, ie the trajectory positions (and velocities if exist) |
| 318 with their instants to a specified sqlite file | 332 with their instants to a specified sqlite file |
| 319 Either feature positions (and velocities if they exist) | 333 Either feature positions (and velocities if they exist) |
| 320 or curvilinear positions will be saved at a time | 334 or curvilinear positions will be saved at a time''' |
| 321 | 335 |
| 322 TODO: Not implemented for trajectoryType MovingObject with features | 336 ## Sanitation |
| 323 For objects, with features will control whether the features | 337 if(type(objects) is not list or len(objects)==0): return False |
| 324 corresponding to the object are also saved''' | |
| 325 | |
| 326 connection = sqlite3.connect(outputFilename) | 338 connection = sqlite3.connect(outputFilename) |
| 327 try: | 339 try: |
| 328 cursor = connection.cursor() | 340 cursor = connection.cursor() |
| 329 | 341 ## Extract features from objects |
| 330 if trajectoryType == 'feature': | 342 if(trajectoryType == 'object'): |
| 343 features = [] | |
| 344 for obj in objects: | |
| 345 if(obj.hasFeatures()): | |
| 346 features += obj.getFeatures() | |
| 347 elif(trajectoryType == 'feature'): | |
| 348 features = objects | |
| 349 ## Setup feature queries | |
| 350 if(trajectoryType == 'feature' or trajectoryType == 'object'): | |
| 331 createTrajectoryTable(cursor, "positions") | 351 createTrajectoryTable(cursor, "positions") |
| 332 createTrajectoryTable(cursor, "velocities") | 352 createTrajectoryTable(cursor, "velocities") |
| 333 | |
| 334 positionQuery = insertTrajectoryQuery("positions") | 353 positionQuery = insertTrajectoryQuery("positions") |
| 335 velocityQuery = insertTrajectoryQuery("velocities") | 354 velocityQuery = insertTrajectoryQuery("velocities") |
| 336 for obj in objects: | 355 ## Setup object queries |
| 337 num = obj.getNum() | 356 if(trajectoryType == 'object'): |
| 338 frame_number = obj.getFirstInstant() | 357 createObjectsTable(cursor) |
| 339 for position in obj.getPositions(): | 358 createObjectsFeaturesTable(cursor) |
| 340 cursor.execute(positionQuery, (num, frame_number, position.x, position.y)) | 359 objectQuery = insertObjectQuery() |
| 341 frame_number += 1 | 360 objectFeatureQuery = insertObjectFeatureQuery() |
| 342 # velocities | 361 ## Parse feature and/or object structure and commit to DB |
| 343 velocities = obj.getVelocities() | 362 if(trajectoryType == 'feature' or trajectoryType == 'object'): |
| 344 if velocities is not None: | 363 running_tally_of_unique_nums = [] |
| 345 frame_number = obj.getFirstInstant() | 364 for feature in features: |
| 346 for i in xrange(velocities.length()-1): | 365 num = feature.getNum() |
| 347 v = velocities[i] | 366 if(num not in running_tally_of_unique_nums): |
| 348 cursor.execute(velocityQuery, (num, frame_number, v.x, v.y)) | 367 running_tally_of_unique_nums.append(num) |
| 368 frame_number = feature.getFirstInstant() | |
| 369 for position in feature.getPositions(): | |
| 370 cursor.execute(positionQuery, (num, frame_number, position.x, position.y)) | |
| 349 frame_number += 1 | 371 frame_number += 1 |
| 350 elif trajectoryType == 'curvilinear': | 372 velocities = feature.getVelocities() |
| 373 if velocities is not None: | |
| 374 frame_number = feature.getFirstInstant() | |
| 375 for i in xrange(velocities.length()-1): | |
| 376 v = velocities[i] | |
| 377 cursor.execute(velocityQuery, (num, frame_number, v.x, v.y)) | |
| 378 frame_number += 1 | |
| 379 if(trajectoryType == 'object'): | |
| 380 running_tally_of_unique_nums = [] | |
| 381 for obj in objects: | |
| 382 if(obj.hasFeatures()): | |
| 383 n_objects = len(obj.getFeatures()) | |
| 384 for feature in obj.getFeatures(): | |
| 385 feature_num = feature.getNum() | |
| 386 if(feature_num not in running_tally_of_unique_nums): | |
| 387 running_tally_of_unique_nums.append(feature_num) | |
| 388 cursor.execute(objectFeatureQuery, (obj.getNum(), feature_num)) | |
| 389 else: | |
| 390 n_objects = 0 | |
| 391 cursor.execute(objectQuery, (obj.getNum(), obj.getUserType(), n_objects)) | |
| 392 ## Parse curvilinear position structure | |
| 393 elif(trajectoryType == 'curvilinear'): | |
| 351 createCurvilinearTrajectoryTable(cursor) | 394 createCurvilinearTrajectoryTable(cursor) |
| 352 curvilinearQuery = "insert into curvilinear_positions (trajectory_id, frame_number, s_coordinate, y_coordinate, lane) values (?,?,?,?,?)" | 395 curvilinearQuery = "insert into curvilinear_positions (trajectory_id, frame_number, s_coordinate, y_coordinate, lane) values (?,?,?,?,?)" |
| 353 for obj in objects: | 396 for obj in objects: |
| 354 num = obj.getNum() | 397 num = obj.getNum() |
| 355 frame_number = obj.getFirstInstant() | 398 frame_number = obj.getFirstInstant() |
| 356 for position in obj.getCurvilinearPositions(): | 399 for position in obj.getCurvilinearPositions(): |
| 357 cursor.execute(curvilinearQuery, (num, frame_number, position[0], position[1], position[2])) | 400 cursor.execute(curvilinearQuery, (num, frame_number, position[0], position[1], position[2])) |
| 358 frame_number += 1 | 401 frame_number += 1 |
| 359 #elif trajectoryType == 'object': | |
| 360 else: | 402 else: |
| 361 print('Unknown trajectory type {}'.format(trajectoryType)) | 403 print('Unknown trajectory type {}'.format(trajectoryType)) |
| 362 connection.commit() | 404 connection.commit() |
| 363 except sqlite3.OperationalError as error: | 405 except sqlite3.OperationalError as error: |
| 364 printDBError(error) | 406 printDBError(error) |
