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)