Mercurial Hosting > traffic-intelligence
changeset 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 | 2f89dc3d99e5 |
files | trafficintelligence/iframework.py |
diffstat | 1 files changed, 29 insertions(+), 26 deletions(-) [+] |
line wrap: on
line diff
--- a/trafficintelligence/iframework.py Tue Oct 12 16:34:43 2021 -0400 +++ b/trafficintelligence/iframework.py Mon Oct 18 11:42:53 2021 -0400 @@ -22,7 +22,7 @@ idx = Column(Integer, primary_key=True) personIdx = Column(Integer, ForeignKey('persons.idx')) vehicleIdx = Column(Integer, ForeignKey('vehicles.idx')) - transport = Column(SQLEnum(ModeEnum), nullable=False) + name = Column(SQLEnum(ModeEnum), nullable=False) startTime = Column(DateTime) # None first time if only one mode pointIdx = Column(Integer, ForeignKey('points.idx')) @@ -30,16 +30,16 @@ vehicle = relationship('Vehicle') point = relationship('Point') - def __init__(self, transport, person, vehicle = None, startTime = None, p = None): + def __init__(self, name, person, vehicle = None, startTime = None, p = None): self.person = person - self.transport = transport + self.name = name self.vehicle = vehicle self.startTime = startTime self.point = p @staticmethod - def initGroup(transport, group, vehicle = None, startTime = None): - return [Mode(transport, p, startTime) for p in group.getPersons()] + def initGroup(name, group, vehicle = None, startTime = None): + return [Mode(name, p, startTime) for p in group.getPersons()] class Group(Base): __tablename__ = 'groups' @@ -166,19 +166,19 @@ self.points.append(Point(x, y)) class AbstractCrossing: - def initPersonGroupCrossing(self, group, person, transport, vehicle): + def initPersonGroupCrossing(self, group, person, modeName, vehicle): ''' initiates with the passing the group or person design question: what should be done about simple line counting, without information about persons''' if person is None and group is not None: # create group self.group = group - if transport is not None: - Mode.initGroup(transport, group, vehicle) + if modeName is not None: + Mode.initGroup(modeName, group, vehicle) elif person is not None and group is None: # create person self.group = Group([person]) - if transport is not None: - Mode(transport, person, vehicle) + if modeName is not None: + Mode(modeName, person, vehicle) else: print('Warning: passing person and group or both None') @@ -196,15 +196,15 @@ group = relationship('Group') point = relationship('Point') - def __init__(self, line, instant, speed = None, wrongDirection = None, p = None, group = None, person = None, transport = None, vehicle = None): + def __init__(self, line, instant, speed = None, wrongDirection = None, p = None, group = None, person = None, modeName = None, vehicle = None): # makes it possible to create person and mode for just counting - # pass transport as string to instantiate after + # pass modeName as string to instantiate after self.line = line self.instant = instant self.speed = speed self.wrongDirection = wrongDirection self.point = p - self.initPersonGroupCrossing(group, person, transport, vehicle) + self.initPersonGroupCrossing(group, person, modeName, vehicle) class ZoneCrossing(AbstractCrossing,Base): __tablename__ = 'zonecrossings' @@ -219,12 +219,12 @@ group = relationship('Group') point = relationship('Point') - def __init__(self, zone, instant, entering, p = None, group = None, person = None, transport = None, vehicle = None): + def __init__(self, zone, instant, entering, p = None, group = None, person = None, modeName = None, vehicle = None): self.zone = zone self.instant = instant self.entering = entering self.point = p - self.initPersonGroupCrossing(group, person, transport, vehicle) + self.initPersonGroupCrossing(group, person, modeName, vehicle) class Activity(AbstractCrossing,Base): __tablename__ = 'activities' @@ -241,22 +241,25 @@ zone = relationship('Zone') point = relationship('Point') - def __init__(self, activity, startTime, endTime, zone, p = None, group = None, person = None, transport = None, vehicle = None): + def __init__(self, activity, startTime, endTime, zone, p = None, group = None, person = None, modeName = None, vehicle = None): self.activity = activity self.startTime = startTime self.endTime = endTime self.zone = zone self.point = p - self.initPersonGroupCrossing(group, person, transport, vehicle) + self.initPersonGroupCrossing(group, person, modeName, vehicle) -def createDatabase(filename): +def createDatabase(filename, insertInExisting = False, createOnlyGroupTables = False): 'creates a session to query the filename' - if Path(filename).is_file(): + if Path(filename).is_file() and not insertInExisting: print('The file '+filename+' exists') return None else: engine = create_engine('sqlite:///'+filename) - Base.metadata.create_all(engine) + if createOnlyGroupTables: + 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']]) + else: + Base.metadata.create_all(engine) Session = sessionmaker(bind=engine) return Session() @@ -282,18 +285,18 @@ line = Line('line1', 0.,0.,0.,10.) zone = Zone('zone1', [0., 0., 1., 1.], [0., 1., 1., 0.]) destination = Zone('destination1', [10., 10., 11., 11.], [10., 11., 11., 10.]) - counts = [LineCrossing(line, datetime(2020,7,2,23,20+i), person = Person(20+i, 'female', disability = True), transport = 'walking') for i in range(5)] + counts = [LineCrossing(line, datetime(2020,7,2,23,20+i), person = Person(20+i, 'female', disability = True), modeName = 'walking') for i in range(5)] group1 = Group([Person(13+i,'female', False, False, True, False) for i in range(3)]) groupMode1 = Mode.initGroup('walking', group1) activities = [Activity('walking', datetime(2020,7,2,23,0), datetime(2020,7,2,23,10), zone, person = Person(40, 'male', True, False, True, False)), Activity('eating', datetime(2020,7,2,23,10), datetime(2020,7,2,23,12), zone, person = Person(40, 'male', True, False, True, False)), Activity('playing', datetime(2020,7,2,22,0), datetime(2020,7,2,23,0), zone, group = group1)] counts.append(LineCrossing(line, datetime(2020,7,2,23,5), group = group1)) - counts.append(LineCrossing(line, datetime(2020,7,2,23,7), person = Person(23, 'unknown'), transport = 'cardriver', vehicle = Vehicle('car'))) - counts.append(LineCrossing(line, datetime(2020,7,2,23,9), person = Person('teen', 'unknown'), transport = 'scooter', vehicle = Vehicle('scooter'))) - counts.append(LineCrossing(line, datetime(2020,7,2,23,11), person = Person(12, 'female'), transport = 'bike')) - 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 - counts.append(LineCrossing(line, datetime(2020,7,2,23,15), group = Group([Person(34+i) for i in range(3)]), transport = 'carpassenger')) + counts.append(LineCrossing(line, datetime(2020,7,2,23,7), person = Person(23, 'unknown'), modeName = 'cardriver', vehicle = Vehicle('car'))) + counts.append(LineCrossing(line, datetime(2020,7,2,23,9), person = Person('teen', 'unknown'), modeName = 'other', vehicle = Vehicle('scooter'))) + counts.append(LineCrossing(line, datetime(2020,7,2,23,11), person = Person(12, 'female'), modeName = 'cycling')) + 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 + counts.append(LineCrossing(line, datetime(2020,7,2,23,15), group = Group([Person(34+i) for i in range(3)]), modeName = 'carpassenger')) counts.append(ZoneCrossing(zone, datetime(2020,7,7,9,5), True, person = Person(33, 'male', False, False, True, False)))