Mercurial > hg > nsaunier > traffic-intelligence
annotate trafficintelligence/iframework.py @ 1301:7e42f83aab1f
added utility to print recording durations from metadata
| author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
|---|---|
| date | Thu, 10 Jul 2025 16:15:55 -0400 |
| parents | 4dd446835e7d |
| children |
| rev | line source |
|---|---|
|
1172
f9ab0cbb92da
updates to iframework, to better reflect transport modes (suggestion)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1164
diff
changeset
|
1 ''' Framework to record data to measure the three street functions: access, transit and place ''' |
|
f9ab0cbb92da
updates to iframework, to better reflect transport modes (suggestion)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1164
diff
changeset
|
2 |
|
1162
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
3 from enum import Enum |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
4 from pathlib import Path |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
5 from datetime import datetime |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
6 |
|
1248
c4c50678c856
clean api update in sqlalchemy
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1175
diff
changeset
|
7 from sqlalchemy.ext.declarative import declared_attr |
|
1162
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
8 from sqlalchemy import Table, Column, Integer, Boolean, String, Float, DateTime, Enum as SQLEnum, ForeignKey, CheckConstraint, create_engine |
|
1248
c4c50678c856
clean api update in sqlalchemy
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1175
diff
changeset
|
9 from sqlalchemy.orm import relationship, backref, sessionmaker, declarative_base |
|
1162
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
10 |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
11 Base = declarative_base() |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
12 |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
13 GenderEnum = Enum('GenderEnum', 'male female unknown') |
|
1293
4dd446835e7d
update closer to Studio iframework
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1248
diff
changeset
|
14 ModeEnum = Enum('ModeEnum', 'car_driver car_passenger 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 |
|
4dd446835e7d
update closer to Studio iframework
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1248
diff
changeset
|
15 VehicleEnum = Enum('VehicleEnum', 'car bike van truck bus taxi motorcycle scooter skate rollers mobility_scooter') |
|
4dd446835e7d
update closer to Studio iframework
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1248
diff
changeset
|
16 ActivityEnum = Enum('ActivityEnum', 'unknown strolling jogging shopping sitting talking resting eating playing doing_exercise smoking using_cellphone observing reading_writing performing selling playing_with_pet taking_pet_for_walk') |
|
4dd446835e7d
update closer to Studio iframework
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1248
diff
changeset
|
17 DisabilityEnum = Enum('DisabilityEnum', 'none wheelchair walker cane white_cane') |
|
4dd446835e7d
update closer to Studio iframework
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1248
diff
changeset
|
18 AgeEnum = Enum('AgeEnum', 'unknown infant toddler child teen young_adult adult senior') # 0-1, 1-4, 4-12, 12-18... |
|
1162
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
19 |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
20 # should there be a survey object for site info, observer, etc? |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
21 |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
22 class Mode(Base): |
|
1172
f9ab0cbb92da
updates to iframework, to better reflect transport modes (suggestion)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1164
diff
changeset
|
23 '''A mode is personal, because in a group (family), some might have a scooter or rollers''' |
|
1162
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
24 __tablename__ = 'modes' |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
25 idx = Column(Integer, primary_key=True) |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
26 personIdx = Column(Integer, ForeignKey('persons.idx')) |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
27 vehicleIdx = Column(Integer, ForeignKey('vehicles.idx')) |
|
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
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1172
diff
changeset
|
28 name = Column(SQLEnum(ModeEnum), nullable=False) |
|
1172
f9ab0cbb92da
updates to iframework, to better reflect transport modes (suggestion)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1164
diff
changeset
|
29 startTime = Column(DateTime) # None first time if only one mode |
|
1162
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
30 pointIdx = Column(Integer, ForeignKey('points.idx')) |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
31 |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
32 person = relationship('Person', backref = backref('modes')) |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
33 vehicle = relationship('Vehicle') |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
34 point = relationship('Point') |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
35 |
|
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
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1172
diff
changeset
|
36 def __init__(self, name, person, vehicle = None, startTime = None, p = None): |
|
1162
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
37 self.person = person |
|
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
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1172
diff
changeset
|
38 self.name = name |
|
1162
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
39 self.vehicle = vehicle |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
40 self.startTime = startTime |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
41 self.point = p |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
42 |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
43 @staticmethod |
|
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
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1172
diff
changeset
|
44 def initGroup(name, group, vehicle = None, startTime = None): |
|
c1766bb5076c
udpated the iframework metadata to allow adding it to an existing database, and creating only a subset of tables for group/person attributes
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1172
diff
changeset
|
45 return [Mode(name, p, startTime) for p in group.getPersons()] |
|
1162
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
46 |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
47 class Group(Base): |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
48 __tablename__ = 'groups' |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
49 idx = Column(Integer, primary_key=True) |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
50 |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
51 def __init__(self, persons): |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
52 for p in persons: |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
53 GroupBelonging(p, self) |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
54 |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
55 def getPersons(self): |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
56 return [gb.person for gb in self.groupBelongings] |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
57 |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
58 class GroupBelonging(Base): |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
59 __tablename__ = 'groupbelongings' |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
60 groupIdx = Column(Integer, ForeignKey('groups.idx'), primary_key=True) |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
61 personIdx = Column(Integer, ForeignKey('persons.idx'), primary_key=True) |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
62 pointIdx = Column(Integer, ForeignKey('points.idx')) |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
63 startTime = Column(DateTime) # None first time if only one group |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
64 |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
65 person = relationship('Person', backref = backref('groupBelongings')) |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
66 group = relationship('Group', backref = backref('groupBelongings')) |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
67 point = relationship('Point') |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
68 |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
69 def __init__(self, person, group, startTime = None, p = None): |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
70 self.person = person |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
71 self.group = group |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
72 self.startTime = startTime |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
73 self.point = p |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
74 |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
75 # in aggregated form, there is a total number of observations for a given time interval, a number for each binary variable and k-1 variables for a categorical variable with k categories |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
76 class Person(Base): |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
77 __tablename__ = 'persons' |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
78 idx = Column(Integer, primary_key=True) |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
79 #groupIdx = Column(Integer, ForeignKey('groups.idx')) |
|
1293
4dd446835e7d
update closer to Studio iframework
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1248
diff
changeset
|
80 age = Column(SQLEnum(AgeEnum), nullable=True) #Column(String) |
|
1162
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
81 gender = Column(SQLEnum(GenderEnum), nullable=False) |
|
1293
4dd446835e7d
update closer to Studio iframework
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1248
diff
changeset
|
82 disability = Column(String) #Column(SQLEnum(DisabilityEnum) #Boolean in Studio |
|
1162
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
83 stroller = Column(Boolean) # the booleans could be strings or enum to have more information |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
84 bag = Column(Boolean) |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
85 animal = Column(Boolean) |
|
1293
4dd446835e7d
update closer to Studio iframework
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1248
diff
changeset
|
86 # databaseFilename = Column(String) # refers to trajectory database, relative path |
|
4dd446835e7d
update closer to Studio iframework
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1248
diff
changeset
|
87 # objectIdx = Column(Integer) # refers to object id in trajectory database |
|
1162
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
88 |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
89 #group = relationship('Group', backref = backref('persons')) |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
90 |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
91 def __init__(self, age = 'unknown', gender = 'unknown', disability = False, stroller = False, bag = False, animal = False): |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
92 self.age = age |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
93 self.gender = gender |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
94 self.disability = disability |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
95 self.stroller = stroller |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
96 self.bag = bag |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
97 self.animal = animal |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
98 |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
99 def getAgeNum(self): |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
100 if str.isnumeric(self.age): |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
101 return int(self.age) |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
102 elif '.' in self.age: |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
103 try: |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
104 return float(self.age) |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
105 except ValueError: |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
106 pass |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
107 else: |
|
1293
4dd446835e7d
update closer to Studio iframework
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1248
diff
changeset
|
108 return self.age |
|
4dd446835e7d
update closer to Studio iframework
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1248
diff
changeset
|
109 |
|
1162
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
110 def getGroups(self): |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
111 if len(self.groupBelongings) > 0: |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
112 return [gb.group for gb in self.groupBelongings] |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
113 else: |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
114 return None |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
115 |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
116 class Vehicle(Base): |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
117 __tablename__ = 'vehicles' |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
118 idx = Column(Integer, primary_key=True) |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
119 category = Column(SQLEnum(VehicleEnum), nullable=False) |
|
1293
4dd446835e7d
update closer to Studio iframework
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1248
diff
changeset
|
120 trailer = Column(Boolean) |
|
4dd446835e7d
update closer to Studio iframework
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1248
diff
changeset
|
121 # databaseFilename = Column(String) # refers to trajectory database, relative path |
|
4dd446835e7d
update closer to Studio iframework
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1248
diff
changeset
|
122 # objectIdx = Column(Integer) # refers to object id in trajectory database |
|
1162
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
123 |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
124 def __init__(self, category, trailer = False): |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
125 self.category = category |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
126 self.trailer = trailer |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
127 |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
128 class Point(Base): |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
129 __tablename__ = 'points' |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
130 idx = Column(Integer, primary_key=True) |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
131 x = Column(Float) |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
132 y = Column(Float) |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
133 |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
134 def __init__(self, x, y): |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
135 self.x = x |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
136 self.y = y |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
137 |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
138 pointLineAssociation = Table('pointlines', Base.metadata, |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
139 Column('pointIdx', Integer, ForeignKey('points.idx')), |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
140 Column('lineIdx', Integer, ForeignKey('lines.idx'))) |
|
1293
4dd446835e7d
update closer to Studio iframework
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1248
diff
changeset
|
141 |
|
1162
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
142 class Line(Base): |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
143 __tablename__ = 'lines' |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
144 idx = Column(Integer, primary_key=True) |
|
1163
fa9c358789ac
bug correction
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1162
diff
changeset
|
145 name = Column(String) |
|
fa9c358789ac
bug correction
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1162
diff
changeset
|
146 # todo define lines for access counting: add type? - AccessLine? |
|
1162
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
147 |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
148 points = relationship('Point', secondary=pointLineAssociation) |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
149 |
|
1163
fa9c358789ac
bug correction
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1162
diff
changeset
|
150 def __init__(self, name, x1, y1, x2, y2): |
|
fa9c358789ac
bug correction
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1162
diff
changeset
|
151 self.name = name |
|
1162
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
152 self.points = [Point(x1, y1), Point(x2, y2)] |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
153 |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
154 pointZoneAssociation = Table('pointzones', Base.metadata, |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
155 Column('pointIdx', Integer, ForeignKey('points.idx')), |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
156 Column('zoneIdx', Integer, ForeignKey('zones.idx'))) |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
157 |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
158 class Zone(Base): |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
159 __tablename__ = 'zones' |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
160 idx = Column(Integer, primary_key=True) |
|
1163
fa9c358789ac
bug correction
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1162
diff
changeset
|
161 name = Column(String) |
|
1162
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
162 |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
163 points = relationship('Point', secondary=pointZoneAssociation) |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
164 |
|
1163
fa9c358789ac
bug correction
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1162
diff
changeset
|
165 def __init__(self, name, xs = None, ys = None): |
|
1162
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
166 'xs and ys are the list of x and y coordinates' |
|
1163
fa9c358789ac
bug correction
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1162
diff
changeset
|
167 self.name = name |
|
1162
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
168 if xs is not None and ys is not None: |
|
1293
4dd446835e7d
update closer to Studio iframework
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1248
diff
changeset
|
169 for x, y in zip(xs, ys): |
|
4dd446835e7d
update closer to Studio iframework
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1248
diff
changeset
|
170 self.addPoint(x, y) |
|
4dd446835e7d
update closer to Studio iframework
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1248
diff
changeset
|
171 |
|
1162
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
172 def addPoint(self, x, y): |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
173 self.points.append(Point(x, y)) |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
174 |
|
1172
f9ab0cbb92da
updates to iframework, to better reflect transport modes (suggestion)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1164
diff
changeset
|
175 class AbstractCrossing: |
|
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
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1172
diff
changeset
|
176 def initPersonGroupCrossing(self, group, person, modeName, vehicle): |
|
1175
35725db5e83f
naming changed for framework
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1173
diff
changeset
|
177 ''' initiates with the crossing the group or person |
|
1163
fa9c358789ac
bug correction
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1162
diff
changeset
|
178 |
|
fa9c358789ac
bug correction
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1162
diff
changeset
|
179 design question: what should be done about simple line counting, |
|
fa9c358789ac
bug correction
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1162
diff
changeset
|
180 without information about persons''' |
|
1162
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
181 if person is None and group is not None: # create group |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
182 self.group = group |
|
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
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1172
diff
changeset
|
183 if modeName is not None: |
|
c1766bb5076c
udpated the iframework metadata to allow adding it to an existing database, and creating only a subset of tables for group/person attributes
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1172
diff
changeset
|
184 Mode.initGroup(modeName, group, vehicle) |
|
1162
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
185 elif person is not None and group is None: # create person |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
186 self.group = Group([person]) |
|
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
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1172
diff
changeset
|
187 if modeName is not None: |
|
c1766bb5076c
udpated the iframework metadata to allow adding it to an existing database, and creating only a subset of tables for group/person attributes
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1172
diff
changeset
|
188 Mode(modeName, person, vehicle) |
|
1162
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
189 else: |
|
1175
35725db5e83f
naming changed for framework
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1173
diff
changeset
|
190 print('Warning: crossing person and group or both None') |
|
1162
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
191 |
|
1172
f9ab0cbb92da
updates to iframework, to better reflect transport modes (suggestion)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1164
diff
changeset
|
192 class LineCrossing(AbstractCrossing,Base): |
|
1175
35725db5e83f
naming changed for framework
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1173
diff
changeset
|
193 __tablename__ = 'linecrossings' # formerly 'linepassings' |
|
1162
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
194 idx = Column(Integer, primary_key=True) |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
195 lineIdx = Column(Integer, ForeignKey('lines.idx')) |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
196 groupIdx = Column(Integer, ForeignKey('groups.idx')) |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
197 pointIdx = Column(Integer, ForeignKey('points.idx')) |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
198 instant = Column(DateTime) |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
199 speed = Column(Float) |
|
1293
4dd446835e7d
update closer to Studio iframework
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1248
diff
changeset
|
200 # wrongDirection = Column(Boolean) |
|
4dd446835e7d
update closer to Studio iframework
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1248
diff
changeset
|
201 rightToLeft = Column(Boolean) |
|
1162
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
202 |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
203 line = relationship('Line') |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
204 group = relationship('Group') |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
205 point = relationship('Point') |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
206 |
|
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
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1172
diff
changeset
|
207 def __init__(self, line, instant, speed = None, wrongDirection = None, p = None, group = None, person = None, modeName = None, vehicle = None): |
|
1162
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
208 # makes it possible to create person and mode for just counting |
|
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
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1172
diff
changeset
|
209 # pass modeName as string to instantiate after |
|
1162
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
210 self.line = line |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
211 self.instant = instant |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
212 self.speed = speed |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
213 self.wrongDirection = wrongDirection |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
214 self.point = p |
|
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
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1172
diff
changeset
|
215 self.initPersonGroupCrossing(group, person, modeName, vehicle) |
|
1162
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
216 |
|
1172
f9ab0cbb92da
updates to iframework, to better reflect transport modes (suggestion)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1164
diff
changeset
|
217 class ZoneCrossing(AbstractCrossing,Base): |
|
1164
f1a33f458d7e
changing ZonePassing to ZoneCrossing
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1163
diff
changeset
|
218 __tablename__ = 'zonecrossings' |
|
1162
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
219 idx = Column(Integer, primary_key=True) |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
220 zoneIdx = Column(Integer, ForeignKey('zones.idx')) |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
221 groupIdx = Column(Integer, ForeignKey('groups.idx')) |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
222 pointIdx = Column(Integer, ForeignKey('points.idx')) |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
223 instant = Column(DateTime) |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
224 entering = Column(Boolean) |
|
1293
4dd446835e7d
update closer to Studio iframework
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1248
diff
changeset
|
225 speed = Column(Float) |
|
1162
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
226 |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
227 zone = relationship('Zone') |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
228 group = relationship('Group') |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
229 point = relationship('Point') |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
230 |
|
1293
4dd446835e7d
update closer to Studio iframework
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1248
diff
changeset
|
231 def __init__(self, zone, instant, entering, speed = None, p = None, group = None, person = None, modeName = None, vehicle = None): |
|
1162
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
232 self.zone = zone |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
233 self.instant = instant |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
234 self.entering = entering |
|
1293
4dd446835e7d
update closer to Studio iframework
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1248
diff
changeset
|
235 self.speed = speed |
|
1162
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
236 self.point = p |
|
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
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1172
diff
changeset
|
237 self.initPersonGroupCrossing(group, person, modeName, vehicle) |
|
1162
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
238 |
|
1172
f9ab0cbb92da
updates to iframework, to better reflect transport modes (suggestion)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1164
diff
changeset
|
239 class Activity(AbstractCrossing,Base): |
|
1162
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
240 __tablename__ = 'activities' |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
241 idx = Column(Integer, primary_key=True) |
|
1293
4dd446835e7d
update closer to Studio iframework
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1248
diff
changeset
|
242 activity = Column(SQLEnum(ActivityEnum), nullable=False) #Column(String) |
|
1162
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
243 groupIdx = Column(Integer, ForeignKey('groups.idx')) |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
244 # can an activity be done in a vehicle? Is it relevant? Can it be unambiguously identified? |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
245 startTime = Column(DateTime) |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
246 endTime = Column(DateTime) |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
247 zoneIdx = Column(Integer, ForeignKey('zones.idx')) |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
248 pointIdx = Column(Integer, ForeignKey('points.idx')) |
|
1293
4dd446835e7d
update closer to Studio iframework
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1248
diff
changeset
|
249 |
|
1162
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
250 group = relationship('Group') |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
251 zone = relationship('Zone') |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
252 point = relationship('Point') |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
253 |
|
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
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1172
diff
changeset
|
254 def __init__(self, activity, startTime, endTime, zone, p = None, group = None, person = None, modeName = None, vehicle = None): |
|
1162
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
255 self.activity = activity |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
256 self.startTime = startTime |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
257 self.endTime = endTime |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
258 self.zone = zone |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
259 self.point = p |
|
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
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1172
diff
changeset
|
260 self.initPersonGroupCrossing(group, person, modeName, vehicle) |
|
1162
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
261 |
|
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
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1172
diff
changeset
|
262 def createDatabase(filename, insertInExisting = False, createOnlyGroupTables = False): |
|
1162
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
263 'creates a session to query the filename' |
|
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
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1172
diff
changeset
|
264 if Path(filename).is_file() and not insertInExisting: |
|
1162
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
265 print('The file '+filename+' exists') |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
266 return None |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
267 else: |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
268 engine = create_engine('sqlite:///'+filename) |
|
1293
4dd446835e7d
update closer to Studio iframework
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1248
diff
changeset
|
269 if createOnlyGroupTables: |
|
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
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1172
diff
changeset
|
270 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']]) |
|
c1766bb5076c
udpated the iframework metadata to allow adding it to an existing database, and creating only a subset of tables for group/person attributes
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1172
diff
changeset
|
271 else: |
|
c1766bb5076c
udpated the iframework metadata to allow adding it to an existing database, and creating only a subset of tables for group/person attributes
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1172
diff
changeset
|
272 Base.metadata.create_all(engine) |
|
1162
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
273 Session = sessionmaker(bind=engine) |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
274 return Session() |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
275 |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
276 def connectDatabase(filename): |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
277 'creates a session to query the filename' |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
278 if Path(filename).is_file(): |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
279 engine = create_engine('sqlite:///'+filename) |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
280 Session = sessionmaker(bind=engine) |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
281 return Session() |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
282 else: |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
283 print('The file '+filename+' does not exist') |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
284 return None |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
285 |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
286 if __name__ == '__main__': # demo code |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
287 session = createDatabase('test.sqlite') |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
288 if session is None: |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
289 session = connectDatabase('test.sqlite') |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
290 # count example |
|
1293
4dd446835e7d
update closer to Studio iframework
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1248
diff
changeset
|
291 p = Person('infant', 'female', bag = True) |
|
1162
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
292 veh1 = Vehicle('car') |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
293 modes = [Mode('cardriver', p, veh1), Mode('walking', p, startTime = datetime(2020,7,7,11,20))] |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
294 |
|
1163
fa9c358789ac
bug correction
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1162
diff
changeset
|
295 line = Line('line1', 0.,0.,0.,10.) |
|
fa9c358789ac
bug correction
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1162
diff
changeset
|
296 zone = Zone('zone1', [0., 0., 1., 1.], [0., 1., 1., 0.]) |
|
fa9c358789ac
bug correction
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1162
diff
changeset
|
297 destination = Zone('destination1', [10., 10., 11., 11.], [10., 11., 11., 10.]) |
|
1293
4dd446835e7d
update closer to Studio iframework
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1248
diff
changeset
|
298 counts = [LineCrossing(line, datetime(2020,7,2,23,20+i), person = Person(AgeEnum(1+i), 'female', disability = True), modeName = 'walking') for i in range(5)] |
|
4dd446835e7d
update closer to Studio iframework
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1248
diff
changeset
|
299 group1 = Group([Person(AgeEnum(3+i),'female', False, False, True, False) for i in range(3)]) |
|
1162
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
300 groupMode1 = Mode.initGroup('walking', group1) |
|
1293
4dd446835e7d
update closer to Studio iframework
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1248
diff
changeset
|
301 activities = [Activity('strolling', datetime(2020,7,2,23,0), datetime(2020,7,2,23,10), zone, person = Person('adult', 'male', True, False, True, False)), |
|
4dd446835e7d
update closer to Studio iframework
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1248
diff
changeset
|
302 Activity('eating', datetime(2020,7,2,23,10), datetime(2020,7,2,23,12), zone, person = Person('senior', 'male', True, False, True, False)), |
|
1162
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
303 Activity('playing', datetime(2020,7,2,22,0), datetime(2020,7,2,23,0), zone, group = group1)] |
|
1172
f9ab0cbb92da
updates to iframework, to better reflect transport modes (suggestion)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1164
diff
changeset
|
304 counts.append(LineCrossing(line, datetime(2020,7,2,23,5), group = group1)) |
|
1293
4dd446835e7d
update closer to Studio iframework
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1248
diff
changeset
|
305 counts.append(LineCrossing(line, datetime(2020,7,2,23,7), person = Person('young_adult', 'unknown'), modeName = 'cardriver', vehicle = Vehicle('car'))) |
|
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
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1172
diff
changeset
|
306 counts.append(LineCrossing(line, datetime(2020,7,2,23,9), person = Person('teen', 'unknown'), modeName = 'other', vehicle = Vehicle('scooter'))) |
|
1293
4dd446835e7d
update closer to Studio iframework
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1248
diff
changeset
|
307 counts.append(LineCrossing(line, datetime(2020,7,2,23,11), person = Person('teen', 'female'), modeName = 'cycling')) |
|
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
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1172
diff
changeset
|
308 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 |
|
1293
4dd446835e7d
update closer to Studio iframework
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1248
diff
changeset
|
309 counts.append(LineCrossing(line, datetime(2020,7,2,23,15), group = Group([Person(AgeEnum(6+i)) for i in range(3)]), modeName = 'car_passenger')) |
|
1162
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
310 |
|
1293
4dd446835e7d
update closer to Studio iframework
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1248
diff
changeset
|
311 counts.append(ZoneCrossing(zone, datetime(2020,7,7,9,5), True, person = Person('adult', 'male', False, False, True, False))) |
|
1162
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
312 |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
313 session.add_all([line, p, zone, group1, destination]+modes+groupMode1+counts+activities) |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
314 |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
315 session.commit() |
|
efd52c55a72b
added indicator framework file
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
diff
changeset
|
316 session.close() |
