Mercurial Hosting > traffic-intelligence
changeset 1172:f9ab0cbb92da
updates to iframework, to better reflect transport modes (suggestion)
author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
---|---|
date | Tue, 12 Oct 2021 16:34:43 -0400 |
parents | afdbfba94fbc |
children | c1766bb5076c |
files | trafficintelligence/iframework.py |
diffstat | 1 files changed, 21 insertions(+), 23 deletions(-) [+] |
line wrap: on
line diff
--- a/trafficintelligence/iframework.py Mon Sep 27 14:09:23 2021 -0400 +++ b/trafficintelligence/iframework.py Tue Oct 12 16:34:43 2021 -0400 @@ -1,3 +1,5 @@ +''' Framework to record data to measure the three street functions: access, transit and place ''' + from enum import Enum from pathlib import Path from datetime import datetime @@ -6,26 +8,22 @@ from sqlalchemy import Table, Column, Integer, Boolean, String, Float, DateTime, Enum as SQLEnum, ForeignKey, CheckConstraint, create_engine from sqlalchemy.orm import relationship, backref, sessionmaker -""" - -""" - Base = declarative_base() GenderEnum = Enum('GenderEnum', 'male female unknown') -ModeEnum = Enum('ModeEnum', 'cardriver carpassenger transit bike walking scooter skating') -VehicleEnum = Enum('VehicleEnum', 'car SUV truck bus bike scooter skate rollers') +ModeEnum = Enum('ModeEnum', 'cardriver carpassenger transit taxi motorcycle cycling walking other') # the idea is that the mode could be sufficient to record all events (line and zone crossings), whether the actual, more precise vehicle, is +VehicleEnum = Enum('VehicleEnum', 'car suv van truck motorcycle bus bike scooter skate rollers') # should there be a survey object for site info, observer, etc? class Mode(Base): - 'personal, because in a group (family), some might have a scooter or rollers' + '''A mode is personal, because in a group (family), some might have a scooter or rollers''' __tablename__ = 'modes' idx = Column(Integer, primary_key=True) personIdx = Column(Integer, ForeignKey('persons.idx')) vehicleIdx = Column(Integer, ForeignKey('vehicles.idx')) transport = Column(SQLEnum(ModeEnum), nullable=False) - startTime = Column(DateTime) # None first time if only one group + startTime = Column(DateTime) # None first time if only one mode pointIdx = Column(Integer, ForeignKey('points.idx')) person = relationship('Person', backref = backref('modes')) @@ -167,8 +165,8 @@ def addPoint(self, x, y): self.points.append(Point(x, y)) -class AbstractPassing: - def initPersonGroupPassing(self, group, person, transport, vehicle): +class AbstractCrossing: + def initPersonGroupCrossing(self, group, person, transport, vehicle): ''' initiates with the passing the group or person design question: what should be done about simple line counting, @@ -184,7 +182,7 @@ else: print('Warning: passing person and group or both None') -class LinePassing(AbstractPassing,Base): +class LineCrossing(AbstractCrossing,Base): __tablename__ = 'linepassings' idx = Column(Integer, primary_key=True) lineIdx = Column(Integer, ForeignKey('lines.idx')) @@ -206,9 +204,9 @@ self.speed = speed self.wrongDirection = wrongDirection self.point = p - self.initPersonGroupPassing(group, person, transport, vehicle) + self.initPersonGroupCrossing(group, person, transport, vehicle) -class ZoneCrossing(AbstractPassing,Base): +class ZoneCrossing(AbstractCrossing,Base): __tablename__ = 'zonecrossings' idx = Column(Integer, primary_key=True) zoneIdx = Column(Integer, ForeignKey('zones.idx')) @@ -226,9 +224,9 @@ self.instant = instant self.entering = entering self.point = p - self.initPersonGroupPassing(group, person, transport, vehicle) + self.initPersonGroupCrossing(group, person, transport, vehicle) -class Activity(AbstractPassing,Base): +class Activity(AbstractCrossing,Base): __tablename__ = 'activities' idx = Column(Integer, primary_key=True) activity = Column(String) # could be enum @@ -249,7 +247,7 @@ self.endTime = endTime self.zone = zone self.point = p - self.initPersonGroupPassing(group, person, transport, vehicle) + self.initPersonGroupCrossing(group, person, transport, vehicle) def createDatabase(filename): 'creates a session to query the filename' @@ -284,18 +282,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 = [LinePassing(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), transport = '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(LinePassing(line, datetime(2020,7,2,23,5), group = group1)) - counts.append(LinePassing(line, datetime(2020,7,2,23,7), person = Person(23, 'unknown'), transport = 'cardriver', vehicle = Vehicle('car'))) - counts.append(LinePassing(line, datetime(2020,7,2,23,9), person = Person('teen', 'unknown'), transport = 'scooter', vehicle = Vehicle('scooter'))) - counts.append(LinePassing(line, datetime(2020,7,2,23,11), person = Person(12, 'female'), transport = 'bike')) - counts.append(LinePassing(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(LinePassing(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,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(ZoneCrossing(zone, datetime(2020,7,7,9,5), True, person = Person(33, 'male', False, False, True, False)))