You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于SUMO计算指定矩形范围内的所有车道总长度

SUMO 计算指定矩形范围内车道总长度实现脚本

我之前想要提问如何在SUMO中计算给定矩形范围内的车道总长度,自行找到解决方案后,为方便社区其他开发者参考,在此分享对应实现方案:

实现思路

  • 依赖traci、sumolib、shapely库完成路网读取、几何判断逻辑
  • 自动跳过ID以:开头的路口内部边缘,不统计路口内部无效车道长度
  • 若道路边缘的边界框完全落在目标矩形内,直接累加该边缘所有车道的总长度
  • 若道路边缘的边界框仅和目标矩形部分相交,按相交面积占边缘边界框总面积的比例折算车道长度,平衡统计效率与精度

实现代码

import traci, sumolib
from sumolib import checkBinary
from shapely.geometry import Polygon, box
# 定义目标矩形范围,可根据需求修改坐标点
polygon = Polygon([(0, 10000), (10000, 10000), (10000, 0), (0,0)])
# 启动SUMO实例,需替换为自己的sumocfg配置文件路径
traci.start([checkBinary('sumo'), '-c', 'myLuST.sumocfg', "--start", "--quit-on-end", '-W', '-V', 'false', '--no-step-log', 'true'])
# 读取路网文件,需替换为自己的net.xml路径
net = sumolib.net.readNet(r'../../LuSTScenario/scenario/lust.net.xml')

totalLength = 0 # 存储矩形范围内的车道总长度

for edge in traci.edge.getIDList():
    # 根据SUMO官方说明,ID以:开头的是路口内部边缘,直接跳过
    if edge[0] == ":":
        continue

    curEdge = net.getEdge(edge)
    # 获取当前边缘的边界框坐标,生成几何对象
    curEdgeBBCoords = curEdge.getBoundingBox()
    curEdgeBBox = box(*curEdgeBBCoords)

    # 边缘完全在目标矩形内,全量累加车道总长度
    if polygon.contains(curEdgeBBox):
        totalLength += curEdge.getLength() * len(curEdge.getLanes())
    # 边缘与目标矩形相交,按相交比例折算长度累加
    elif polygon.intersects(curEdgeBBox):
        intersect_ratio = polygon.intersection(curEdgeBBox).area / curEdgeBBox.area
        totalLength += curEdge.getLength() * len(curEdge.getLanes()) * intersect_ratio

traci.close()
print('给定矩形内的车道总长度为:{}' .format(totalLength))

内容的提问来源于stack exchange,提问作者Itamar cohen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 21:36:01