Calculando la longitud total de los carriles dentro de un rectángulo dado en Sumo
Tenía intención de preguntarlo, pero mientras tanto encontré la respuesta. Así que, como un servicio a la comunidad, aquí hay un script simple que lo hace.
import traci, sumolib
from sumolib import checkBinary
from shapely.geometry import Polygon, box
polygon = Polygon([(0, 10000), (10000, 10000), (10000, 0), (0,0)])
traci.start([checkBinary(‘sumo’), ‘-c’, ‘myLuST.sumocfg’, “–start”, “–quit-on-end”, ‘-W’, ‘-V’, ‘false’, ‘–no-step-log’, ‘true’])
net = sumolib.net.readNet(r’../../LuSTScenario/scenario/lust.net.xml’) # archivo neto
totalLength = 0 # Mantendrá la longitud total de carriles dentro del polígono
for edge in traci.edge.getIDList():
# si la identificación del borde comienza con ‘:’ entonces es una intersección según los documentos de SUMO.
if edge[0] == “:”:
continue # descartar intersecciones
curEdge = net.getEdge(edge)
# obtener la caja delimitadora del borde
curEdgeBBCoords = curEdge.getBoundingBox()
curEdgeBBox = box(*curEdgeBBCoords) # crear la caja delimitadora geométricamente
if polygon.contains(curEdgeBBox): # El polígono dado contiene ese borde, así que agregue la longitud del borde, multiplicada por el número de carriles
totalLength += curEdge.getLength() * len(curEdge.getLanes())
# Si el polígono se intersecta con este borde, entonces, como una estimación aproximada de la longitud relevante para agregar, divida el área de intersección por el área total del borde
elif (polygon.intersects(curEdgeBBox)):
totalLength += curEdge.getLength() * len(curEdge.getLanes()) * (polygon.intersection(curEdgeBBox).area / curEdgeBBox.area)
traci.close()
print (‘la longitud total de carriles en el rectángulo dado es {}’ .format (totalLength))
davy.ai
Script para calcular la longitud total de carriles dentro de un polígono
Este script de Python utiliza tres paquetes:
traci
,sumolib
yshapely.geometry
, y toma como entrada un objetoPolygon
. Luego, calcula la longitud total de los carriles dentro del polígono.La declaración
import
al inicio del script importa los paquetes necesarios.El objeto
Polygon
se define de la siguiente manera:La función
start
detraci
se utiliza para iniciar la simulación de SUMO, pasándole varios argumentos incluyendo el binario de SUMO (sumo
), el archivo de configuración (myLuST.sumocfg
), y algunas opciones.La variable
net
se asigna a los resultados de leer el archivolust.net.xml
utilizandosumolib
.La variable de longitud total se inicializa en 0.
El bucle
for
itera sobre la lista de IDs de bordes. Si un ID de borde comienza con:
, es un cruce y se omite.El borde actual se obtiene de
net
utilizando su ID.Las coordenadas de la caja delimitadora del borde actual se obtienen, y se crea un objeto
box
geométricamente a partir de estas coordenadas.Si el polígono dado contiene la caja delimitadora del borde actual, se agrega la longitud del borde a
totalLength
, multiplicada por el número de carriles en el borde.Si el polígono dado interseca la caja delimitadora del borde actual, se calcula la longitud relevante estimada para agregar dividiendo el área de intersección por el área total del borde.
Una vez que el bucle termina, se cierra la simulación de SUMO.
Finalmente, se imprime en la consola la longitud total de los carriles en el polígono dado.