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