创建圈子网络的便捷方式

Convenient way for creating a circle network

我正在尝试在 SuMO 中创建一个圈子网络。由于需要试验半径、车道、车辆等参数,所以希望自动生成。

到目前为止,我编写了一个脚本,它利用 netgenerate 通过使用选项 --spider 生成这样一个循环网络(正如 SuMO 教程对 building a circular network and driving in circles 所建议的那样):

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'

执行这些命令后,我有以下网络:

但是,这种方法似乎是一个大 hack,因为我在我的脚本中手动计算要保留的边缘名称(在上述命令中使用)并且它缺少一些功能(例如移除相反方向的道路, 圆中每个 road/ring 只有一条边)用 netgenerate.

无法实现

有没有其他方便的生成圆网的方法?

对我来说,这个圈子看起来还不错 :-)。如果你唯一缺少的是删除相反方向的可能性,你可以在将它放回 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)

节点文件的内容留作reader的练习。

还有两个注意事项:

  • 单边无法做到这一点。 SUMO 不允许自循环。
  • 最好将形状的前半部分分配给第一条边,将后半部分分配给第二条边,以避免在非常短的连接边上进行奇怪的测量。