我正在尝试在SuMO中创建一个圈子网络。由于我需要尝试半径,车道,车辆等参数,我希望它能够自动生成。
到目前为止,我编写了一个脚本,利用netgenerate
生成这样一个循环网络,使用--spider
选项(正如building a circular network和{{3}的SuMO教程所建议的那样建议):
netgenerate --spider --spider.arm-number=1024 --spider.circle-number=1 --spider.space-radius=100 --spider.omit-center --no-turnarounds --default.lanenumber 2 -o circle.net.xml --edges.join --no-internal-links --no-left-connections --junctions.corner-detail 1000
这已经给了我一个非常漂亮的圆圈,但是,我仍然需要手动合并所有这些边缘(在这种情况下是1024,这是在脚本中完成的):
netconvert -s circle.net.xml --plain-output-prefix circle
netconvert -n circle.nod.xml -e circle.edg.xml -x circle.con.xml -o circle.net.xml --geometry.remove --no-turnarounds --no-internal-links --geometry.remove.keep-edges.explicit '1/1to2/1,'512'/1to'513'/1'
netconvert -n circle.nod.xml -e circle.edg.xml -x circle.con.xml -o circle.net.xml --geometry.remove --no-turnarounds --no-internal-links --geometry.remove.keep-edges.explicit '1/1to'1024'/1'
在这些命令之后,我有以下网络:
然而,这种方法似乎是一个大黑客,因为我在我的脚本中手动计算要保留的边缘名称(在上面的命令中使用)并且它缺少一些功能(例如,移除相反方向的道路,具有只有{/ 1}}无法实现的每个道路/圆环中的一个边缘。
还有其他方便的方式来生成圈子网络吗?
答案 0 :(得分:1)
对我来说,这个圈看起来很好:-)。如果您唯一缺少的是删除相反方向的可能性,您可以将其从边缘文件中删除,然后再将其放回netconvert。当然你也可以用这样的python脚本生成边缘形状(x,y是中心,r是半径,c是角数)
with open("my.edg.xml", "w") as output:
angle = 2 * math.pi / c
shape = ["%.2f,%.2f" % (math.cos(i * angle) * r + x,
math.sin(i * angle) * r + y) for i in range(c)]
print('''
<edges>
<edge id="e1" from="n1" to="n2" shape="%s"/>
<edge id="e2" from="n2" to="n1"/>
</edges>''' % " ".join(shape), file=output)
节点文件的内容留给读者练习。
还有两个注释: