创建圆形网络的便捷方式

时间:2018-01-16 17:55:26

标签: sumo

我正在尝试在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'

在这些命令之后,我有以下网络:

driving in circles

然而,这种方法似乎是一个大黑客,因为我在我的脚本中手动计算要保留的边缘名称(在上面的命令中使用)并且它缺少一些功能(例如,移除相反方向的道路,具有只有{/ 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)

节点文件的内容留给读者练习。

还有两个注释:

  • 使用单个边缘无法执行此操作。 SUMO中不允许自循环。
  • 最好将形状的前半部分分配给第一条边,将后半部分分配给第二条边,以避免在非常短的连接边缘上进行奇怪的测量。