Mercurial Hosting > 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) |