Mercurial > hg > nsaunier > traffic-intelligence
comparison trafficintelligence/iframework.py @ 1173:c1766bb5076c
udpated the iframework metadata to allow adding it to an existing database, and creating only a subset of tables for group/person attributes
| author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
|---|---|
| date | Mon, 18 Oct 2021 11:42:53 -0400 |
| parents | f9ab0cbb92da |
| children | 35725db5e83f |
comparison
equal
deleted
inserted
replaced
| 1172:f9ab0cbb92da | 1173:c1766bb5076c |
|---|---|
| 20 '''A mode is personal, because in a group (family), some might have a scooter or rollers''' | 20 '''A mode is personal, because in a group (family), some might have a scooter or rollers''' |
| 21 __tablename__ = 'modes' | 21 __tablename__ = 'modes' |
| 22 idx = Column(Integer, primary_key=True) | 22 idx = Column(Integer, primary_key=True) |
| 23 personIdx = Column(Integer, ForeignKey('persons.idx')) | 23 personIdx = Column(Integer, ForeignKey('persons.idx')) |
| 24 vehicleIdx = Column(Integer, ForeignKey('vehicles.idx')) | 24 vehicleIdx = Column(Integer, ForeignKey('vehicles.idx')) |
| 25 transport = Column(SQLEnum(ModeEnum), nullable=False) | 25 name = Column(SQLEnum(ModeEnum), nullable=False) |
| 26 startTime = Column(DateTime) # None first time if only one mode | 26 startTime = Column(DateTime) # None first time if only one mode |
| 27 pointIdx = Column(Integer, ForeignKey('points.idx')) | 27 pointIdx = Column(Integer, ForeignKey('points.idx')) |
| 28 | 28 |
| 29 person = relationship('Person', backref = backref('modes')) | 29 person = relationship('Person', backref = backref('modes')) |
| 30 vehicle = relationship('Vehicle') | 30 vehicle = relationship('Vehicle') |
| 31 point = relationship('Point') | 31 point = relationship('Point') |
| 32 | 32 |
| 33 def __init__(self, transport, person, vehicle = None, startTime = None, p = None): | 33 def __init__(self, name, person, vehicle = None, startTime = None, p = None): |
| 34 self.person = person | 34 self.person = person |
| 35 self.transport = transport | 35 self.name = name |
| 36 self.vehicle = vehicle | 36 self.vehicle = vehicle |
| 37 self.startTime = startTime | 37 self.startTime = startTime |
| 38 self.point = p | 38 self.point = p |
| 39 | 39 |
| 40 @staticmethod | 40 @staticmethod |
| 41 def initGroup(transport, group, vehicle = None, startTime = None): | 41 def initGroup(name, group, vehicle = None, startTime = None): |
| 42 return [Mode(transport, p, startTime) for p in group.getPersons()] | 42 return [Mode(name, p, startTime) for p in group.getPersons()] |
| 43 | 43 |
| 44 class Group(Base): | 44 class Group(Base): |
| 45 __tablename__ = 'groups' | 45 __tablename__ = 'groups' |
| 46 idx = Column(Integer, primary_key=True) | 46 idx = Column(Integer, primary_key=True) |
| 47 | 47 |
| 164 | 164 |
| 165 def addPoint(self, x, y): | 165 def addPoint(self, x, y): |
| 166 self.points.append(Point(x, y)) | 166 self.points.append(Point(x, y)) |
| 167 | 167 |
| 168 class AbstractCrossing: | 168 class AbstractCrossing: |
| 169 def initPersonGroupCrossing(self, group, person, transport, vehicle): | 169 def initPersonGroupCrossing(self, group, person, modeName, vehicle): |
| 170 ''' initiates with the passing the group or person | 170 ''' initiates with the passing the group or person |
| 171 | 171 |
| 172 design question: what should be done about simple line counting, | 172 design question: what should be done about simple line counting, |
| 173 without information about persons''' | 173 without information about persons''' |
| 174 if person is None and group is not None: # create group | 174 if person is None and group is not None: # create group |
| 175 self.group = group | 175 self.group = group |
| 176 if transport is not None: | 176 if modeName is not None: |
| 177 Mode.initGroup(transport, group, vehicle) | 177 Mode.initGroup(modeName, group, vehicle) |
| 178 elif person is not None and group is None: # create person | 178 elif person is not None and group is None: # create person |
| 179 self.group = Group([person]) | 179 self.group = Group([person]) |
| 180 if transport is not None: | 180 if modeName is not None: |
| 181 Mode(transport, person, vehicle) | 181 Mode(modeName, person, vehicle) |
| 182 else: | 182 else: |
| 183 print('Warning: passing person and group or both None') | 183 print('Warning: passing person and group or both None') |
| 184 | 184 |
| 185 class LineCrossing(AbstractCrossing,Base): | 185 class LineCrossing(AbstractCrossing,Base): |
| 186 __tablename__ = 'linepassings' | 186 __tablename__ = 'linepassings' |
| 194 | 194 |
| 195 line = relationship('Line') | 195 line = relationship('Line') |
| 196 group = relationship('Group') | 196 group = relationship('Group') |
| 197 point = relationship('Point') | 197 point = relationship('Point') |
| 198 | 198 |
| 199 def __init__(self, line, instant, speed = None, wrongDirection = None, p = None, group = None, person = None, transport = None, vehicle = None): | 199 def __init__(self, line, instant, speed = None, wrongDirection = None, p = None, group = None, person = None, modeName = None, vehicle = None): |
| 200 # makes it possible to create person and mode for just counting | 200 # makes it possible to create person and mode for just counting |
| 201 # pass transport as string to instantiate after | 201 # pass modeName as string to instantiate after |
| 202 self.line = line | 202 self.line = line |
| 203 self.instant = instant | 203 self.instant = instant |
| 204 self.speed = speed | 204 self.speed = speed |
| 205 self.wrongDirection = wrongDirection | 205 self.wrongDirection = wrongDirection |
| 206 self.point = p | 206 self.point = p |
| 207 self.initPersonGroupCrossing(group, person, transport, vehicle) | 207 self.initPersonGroupCrossing(group, person, modeName, vehicle) |
| 208 | 208 |
| 209 class ZoneCrossing(AbstractCrossing,Base): | 209 class ZoneCrossing(AbstractCrossing,Base): |
| 210 __tablename__ = 'zonecrossings' | 210 __tablename__ = 'zonecrossings' |
| 211 idx = Column(Integer, primary_key=True) | 211 idx = Column(Integer, primary_key=True) |
| 212 zoneIdx = Column(Integer, ForeignKey('zones.idx')) | 212 zoneIdx = Column(Integer, ForeignKey('zones.idx')) |
| 217 | 217 |
| 218 zone = relationship('Zone') | 218 zone = relationship('Zone') |
| 219 group = relationship('Group') | 219 group = relationship('Group') |
| 220 point = relationship('Point') | 220 point = relationship('Point') |
| 221 | 221 |
| 222 def __init__(self, zone, instant, entering, p = None, group = None, person = None, transport = None, vehicle = None): | 222 def __init__(self, zone, instant, entering, p = None, group = None, person = None, modeName = None, vehicle = None): |
| 223 self.zone = zone | 223 self.zone = zone |
| 224 self.instant = instant | 224 self.instant = instant |
| 225 self.entering = entering | 225 self.entering = entering |
| 226 self.point = p | 226 self.point = p |
| 227 self.initPersonGroupCrossing(group, person, transport, vehicle) | 227 self.initPersonGroupCrossing(group, person, modeName, vehicle) |
| 228 | 228 |
| 229 class Activity(AbstractCrossing,Base): | 229 class Activity(AbstractCrossing,Base): |
| 230 __tablename__ = 'activities' | 230 __tablename__ = 'activities' |
| 231 idx = Column(Integer, primary_key=True) | 231 idx = Column(Integer, primary_key=True) |
| 232 activity = Column(String) # could be enum | 232 activity = Column(String) # could be enum |
| 239 | 239 |
| 240 group = relationship('Group') | 240 group = relationship('Group') |
| 241 zone = relationship('Zone') | 241 zone = relationship('Zone') |
| 242 point = relationship('Point') | 242 point = relationship('Point') |
| 243 | 243 |
| 244 def __init__(self, activity, startTime, endTime, zone, p = None, group = None, person = None, transport = None, vehicle = None): | 244 def __init__(self, activity, startTime, endTime, zone, p = None, group = None, person = None, modeName = None, vehicle = None): |
| 245 self.activity = activity | 245 self.activity = activity |
| 246 self.startTime = startTime | 246 self.startTime = startTime |
| 247 self.endTime = endTime | 247 self.endTime = endTime |
| 248 self.zone = zone | 248 self.zone = zone |
| 249 self.point = p | 249 self.point = p |
| 250 self.initPersonGroupCrossing(group, person, transport, vehicle) | 250 self.initPersonGroupCrossing(group, person, modeName, vehicle) |
| 251 | 251 |
| 252 def createDatabase(filename): | 252 def createDatabase(filename, insertInExisting = False, createOnlyGroupTables = False): |
| 253 'creates a session to query the filename' | 253 'creates a session to query the filename' |
| 254 if Path(filename).is_file(): | 254 if Path(filename).is_file() and not insertInExisting: |
| 255 print('The file '+filename+' exists') | 255 print('The file '+filename+' exists') |
| 256 return None | 256 return None |
| 257 else: | 257 else: |
| 258 engine = create_engine('sqlite:///'+filename) | 258 engine = create_engine('sqlite:///'+filename) |
| 259 Base.metadata.create_all(engine) | 259 if createOnlyGroupTables: |
| 260 Base.metadata.create_all(engine, tables = [Base.metadata.tables['modes'], Base.metadata.tables['groups'], Base.metadata.tables['groupbelongings'], Base.metadata.tables['persons'], Base.metadata.tables['vehicles'], Base.metadata.tables['points']]) | |
| 261 else: | |
| 262 Base.metadata.create_all(engine) | |
| 260 Session = sessionmaker(bind=engine) | 263 Session = sessionmaker(bind=engine) |
| 261 return Session() | 264 return Session() |
| 262 | 265 |
| 263 def connectDatabase(filename): | 266 def connectDatabase(filename): |
| 264 'creates a session to query the filename' | 267 'creates a session to query the filename' |
| 280 modes = [Mode('cardriver', p, veh1), Mode('walking', p, startTime = datetime(2020,7,7,11,20))] | 283 modes = [Mode('cardriver', p, veh1), Mode('walking', p, startTime = datetime(2020,7,7,11,20))] |
| 281 | 284 |
| 282 line = Line('line1', 0.,0.,0.,10.) | 285 line = Line('line1', 0.,0.,0.,10.) |
| 283 zone = Zone('zone1', [0., 0., 1., 1.], [0., 1., 1., 0.]) | 286 zone = Zone('zone1', [0., 0., 1., 1.], [0., 1., 1., 0.]) |
| 284 destination = Zone('destination1', [10., 10., 11., 11.], [10., 11., 11., 10.]) | 287 destination = Zone('destination1', [10., 10., 11., 11.], [10., 11., 11., 10.]) |
| 285 counts = [LineCrossing(line, datetime(2020,7,2,23,20+i), person = Person(20+i, 'female', disability = True), transport = 'walking') for i in range(5)] | 288 counts = [LineCrossing(line, datetime(2020,7,2,23,20+i), person = Person(20+i, 'female', disability = True), modeName = 'walking') for i in range(5)] |
| 286 group1 = Group([Person(13+i,'female', False, False, True, False) for i in range(3)]) | 289 group1 = Group([Person(13+i,'female', False, False, True, False) for i in range(3)]) |
| 287 groupMode1 = Mode.initGroup('walking', group1) | 290 groupMode1 = Mode.initGroup('walking', group1) |
| 288 activities = [Activity('walking', datetime(2020,7,2,23,0), datetime(2020,7,2,23,10), zone, person = Person(40, 'male', True, False, True, False)), | 291 activities = [Activity('walking', datetime(2020,7,2,23,0), datetime(2020,7,2,23,10), zone, person = Person(40, 'male', True, False, True, False)), |
| 289 Activity('eating', datetime(2020,7,2,23,10), datetime(2020,7,2,23,12), zone, person = Person(40, 'male', True, False, True, False)), | 292 Activity('eating', datetime(2020,7,2,23,10), datetime(2020,7,2,23,12), zone, person = Person(40, 'male', True, False, True, False)), |
| 290 Activity('playing', datetime(2020,7,2,22,0), datetime(2020,7,2,23,0), zone, group = group1)] | 293 Activity('playing', datetime(2020,7,2,22,0), datetime(2020,7,2,23,0), zone, group = group1)] |
| 291 counts.append(LineCrossing(line, datetime(2020,7,2,23,5), group = group1)) | 294 counts.append(LineCrossing(line, datetime(2020,7,2,23,5), group = group1)) |
| 292 counts.append(LineCrossing(line, datetime(2020,7,2,23,7), person = Person(23, 'unknown'), transport = 'cardriver', vehicle = Vehicle('car'))) | 295 counts.append(LineCrossing(line, datetime(2020,7,2,23,7), person = Person(23, 'unknown'), modeName = 'cardriver', vehicle = Vehicle('car'))) |
| 293 counts.append(LineCrossing(line, datetime(2020,7,2,23,9), person = Person('teen', 'unknown'), transport = 'scooter', vehicle = Vehicle('scooter'))) | 296 counts.append(LineCrossing(line, datetime(2020,7,2,23,9), person = Person('teen', 'unknown'), modeName = 'other', vehicle = Vehicle('scooter'))) |
| 294 counts.append(LineCrossing(line, datetime(2020,7,2,23,11), person = Person(12, 'female'), transport = 'bike')) | 297 counts.append(LineCrossing(line, datetime(2020,7,2,23,11), person = Person(12, 'female'), modeName = 'cycling')) |
| 295 counts.append(LineCrossing(line, datetime(2020,7,2,23,13), person = Person(), transport = 'cardriver')) # example of counting cars without knowing the driver and passenger's attributes | 298 counts.append(LineCrossing(line, datetime(2020,7,2,23,13), person = Person(), modeName = 'cardriver')) # example of counting cars without knowing the driver and passenger's attributes |
| 296 counts.append(LineCrossing(line, datetime(2020,7,2,23,15), group = Group([Person(34+i) for i in range(3)]), transport = 'carpassenger')) | 299 counts.append(LineCrossing(line, datetime(2020,7,2,23,15), group = Group([Person(34+i) for i in range(3)]), modeName = 'carpassenger')) |
| 297 | 300 |
| 298 | 301 |
| 299 counts.append(ZoneCrossing(zone, datetime(2020,7,7,9,5), True, person = Person(33, 'male', False, False, True, False))) | 302 counts.append(ZoneCrossing(zone, datetime(2020,7,7,9,5), True, person = Person(33, 'male', False, False, True, False))) |
| 300 | 303 |
| 301 session.add_all([line, p, zone, group1, destination]+modes+groupMode1+counts+activities) | 304 session.add_all([line, p, zone, group1, destination]+modes+groupMode1+counts+activities) |
