1
0
mirror of https://github.com/Ahp06/SUMO_Emissions.git synced 2024-11-22 03:26:30 +00:00

Add area data model

This commit is contained in:
Thibaud Gasser 2018-11-14 14:40:05 +01:00
parent 572812c5fe
commit 5a79858d04
3 changed files with 28 additions and 113 deletions

View File

@ -1,17 +0,0 @@
'''
Created on 6 nov. 2018
@author: Admin
'''
class Area:
locked = False
def __init__(self, coords):
self.coords = coords
def getCoords(self):
return self.coords

View File

@ -1,96 +0,0 @@
import os, sys
from sumo_project.SUMOFactory import SUMOFactory
# Traci launch
if 'SUMO_HOME' in os.environ:
tools = os.path.join(os.environ['SUMO_HOME'], 'tools')
sys.path.append(os.path.join(os.environ['SUMO_HOME'], tools))
sumoBinary = os.path.join(os.environ['SUMO_HOME'], 'bin', 'sumo-gui')
sumoCmd = [sumoBinary, "-c", "mulhouse_simulation/osm.sumocfg"]
else:
sys.exit("please declare environment variable 'SUMO_HOME'")
import traci
from traci import polygon
# creating multiple zones of equal sizes
def init_grid():
default_color = (0, 255, 0)
for i in range(cells_step):
for j in range(cells_step):
area = ((i * width, j * height), (i * width, (j + 1) * height),
((i + 1) * width, (j + 1) * height), ((i + 1) * width, j * height))
areas[i][j] = area
polygon.add("area " + str(i) + "," + str(j), area, default_color, False, "rectangle")
# Emissions recovery by area
def getEmissionsByArea(i, j):
vehicles = []
# Vehicle IDs retrieving into this area
for veh_id in traci.vehicle.getIDList():
pos = traci.vehicle.getPosition(veh_id)
if((i * width < pos[0] and (i + 1) * width > pos[0])
and (j * height < pos[1] and (j + 1) * height > pos[1])):
vehicles.append(veh_id)
# Sum all emissions
emissions = 0.0
for veh_id in vehicles:
emission = traci.vehicle.getCO2Emission(veh_id)
emissions += emission
# Change area color if emisssions exceeds the threshold
emissionsArea[i][j] += emissions
if(emissionsArea[i][j] >= CO2_threshold):
red = (255, 0, 0)
factory.lock_area(areas[i][j])
polygon.setColor("area " + str(i) + "," + str(j), red)
polygon.setFilled("area " + str(i) + "," + str(j), True)
# Recover emissions from all areas
def getAllEmissions():
for i in range(cells_step):
for j in range(cells_step):
getEmissionsByArea(i, j)
# Display emissions information
def showEmissions():
for i in range(cells_step):
for j in range(cells_step):
print("Total CO2 emissions into Area " + str(i) + "," + str(j)
+" = " , str(emissionsArea[i][j]) + " mg")
if __name__ == "__main__":
# Simulation launch
traci.start(sumoCmd)
# Variables and constants declaration
cells_step = 10
boundary = traci.simulation.getNetBoundary()
areas = [[0] * cells_step for _ in range(cells_step)]
emissionsArea = [[0] * cells_step for _ in range(cells_step)]
width = boundary[1][0] / cells_step # width/step
height = boundary[1][1] / cells_step # height/step
CO2_threshold = 500000
step = 0
init_grid()
factory = SUMOFactory()
#factory.lock_area(areas[5][5])
while traci.simulation.getMinExpectedNumber() > 0:
traci.simulationStep()
getAllEmissions()
step += 1
# Display emissions information and close simulation
showEmissions()
traci.close()
sys.stdout.flush()

28
sumo_project/area.py Normal file
View File

@ -0,0 +1,28 @@
from shapely.geometry import Polygon
from shapely.geometry import Point
class Area:
def __init__(self, coords, name=''):
self.rectangle = Polygon(coords)
self.name = name
self.emissions = 0.0
def __eq__(self, other):
return self.rectangle.__eq__(other)
@property
def bounds(self):
return self.rectangle.bounds
def contains(self, other):
return self.rectangle.contains(Point(other))
@classmethod
def from_bounds(cls, xmin, ymin, xmax, ymax):
return cls((
(xmin, ymin),
(xmin, ymax),
(xmax, ymax),
(xmax, ymin)))