如何基于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
相关产品推荐
相关产品推荐

