es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Script para calcular la longitud total de carriles dentro de un polígono

    Este script de Python utiliza tres paquetes: traci, sumolib y shapely.geometry, y toma como entrada un objeto Polygon. Luego, calcula la longitud total de los carriles dentro del polígono.

    La declaración import al inicio del script importa los paquetes necesarios.

    import traci, sumolib
    from sumolib import checkBinary
    from shapely.geometry import Polygon, box
    

    El objeto Polygon se define de la siguiente manera:

    polygon = Polygon([(0, 10000), (10000, 10000), (10000, 0), (0,0)])
    

    La función start de traci 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.

    traci.start([checkBinary('sumo'), '-c', 'myLuST.sumocfg', "--start", "--quit-on-end", '-W', '-V', 'false', '--no-step-log', 'true'])
    

    La variable net se asigna a los resultados de leer el archivo lust.net.xml utilizando sumolib.

    net = sumolib.net.readNet(r'../../LuSTScenario/scenario/lust.net.xml')
    

    La variable de longitud total se inicializa en 0.

    totalLength = 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.

    for edge in traci.edge.getIDList():
      if edge[0] == ":":
        continue
    

    El borde actual se obtiene de net utilizando su ID.

      curEdge = net.getEdge(edge)
    

    Las coordenadas de la caja delimitadora del borde actual se obtienen, y se crea un objeto box geométricamente a partir de estas coordenadas.

      curEdgeBBCoords = curEdge.getBoundingBox()
      curEdgeBBox = box(*curEdgeBBCoords)
    

    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.

      if polygon.contains(curEdgeBBox):
        totalLength += curEdge.getLength() * len(curEdge.getLanes())
    

    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.

      elif (polygon.intersects(curEdgeBBox)):
        totalLength += curEdge.getLength() * len(curEdge.getLanes()) *  (polygon.intersection(curEdgeBBox).area / curEdgeBBox.area)
    

    Una vez que el bucle termina, se cierra la simulación de SUMO.

    traci.close()
    

    Finalmente, se imprime en la consola la longitud total de los carriles en el polígono dado.

    print ('la longitud total de los carriles en el rectángulo dado es {}' .format (totalLength))
    

Comments are closed.