声明:该文章为博主转载自知乎用户:侘寂升平,侵删!
非常感谢知乎朋友无私分享的sumo系列文章,给了我很多的指导!欢迎读者关注该博主!
以下为转载正文:
一、 概述
SUMO的路网文件模拟车辆通过的道路和交叉口,通常“edges”代表道路,“junctions”代表交叉口,文件名的后缀为“net.xml”。SUMO中路网文件的编写可以手动编写,也可以用netconvert命令转换第三方来源中的复杂路网。总体包括道路、交叉口的id和位置信息、车道信息(数量、长度、最大速度、形状、功能等)、优先权信息、交通信号信息、交叉口信息等。这次总共介绍了七种生成SUMO路网文件的方法,分别是:netconvert转换、运用网页浏览器下载城市地图、利用OSMWebWizard.py截取路网、openstreetmap官网中截取地图为osm文件、netedit画图、直接写路网文件、抽象路网netgenerate。
二、netconvert转换
1、通过在命令提示符(cmd)中输入netconvert指令,能够将多种第三方的路网文件转化为SUMO可读的文件,具体可转化的第三方来源有:
OpenStreetMap(一种开源的地图引擎)
PTV Vissim
OpenDrive
MATsim
ArcView
Elmar Brockfelds unsplitted and splitted NavTeq-data
RoboCup Rescue League folders
2、示例
运用netconvert时,注意要指定输入输出的文件名,输入为路网文件,输出为SUMO-道路文件。
- 将Vissim格式的路网转化为SUMO可读格式:
netconvert—visum=VisumNet.inp—output-file=SUMONet.net.xml
- 将osm文件转化为SUMO可读格式:
netconvert—osm-files map.osm -o map.net.xml(注意“-o”为“-output-files”的简写)
(三、四、五本质都是得到osm文件,再用netconvert进行转换)
三、运用网页浏览器下载城市地图
1、访问OSM Overpass API query page
(http://www.overpass-api.de/query_form.html),在“Overpass API Query Form”框中输入下方所示代码(在代码name处改城市名称):
<query type="relation">
<has-kv k="boundary" v = "administrative"/>
<has-kv k="name" v = "上海市"/>
</query>
<print mode="body"/>
2、点击框旁“Query”,下载文件,文件以记事本方式打开,在文件中找到城市id号,如图中,上海市的id号为“913067”
3、为了得到城市的地图,在id号的基础上加3,600,000,000,得到id结果为3600913067
4、再次返回第1步中的网页界面,在“Overpass API Query Form”框中输入下方所示代码,其中area-query ref改为第3步中的"3600913067":
<osm-script timeout="1800" element-limit="100000000">
<union>
<area-query ref="3600913067"/>
<recurse type="node-relation" into="rels"/>
<recurse type="node-way"/>
<recurse type="way-relation"/>
</union>
<union>
<item/>
<recurse type="way-node"/>
</union>
<print mode = "body"/>
</osm-script>
5、再次点击“Query”,保存文件,手动增加文件后缀“.osm”
6、利用netconvert转换osm文件
缺点:下载速度缓慢,文件比较大
四、利用OSMWebWizard.py截取路网
1、OSMWebWizard.py是SUMO自带的程序,具体在“tools-OSMWebWizard.py”,直接运行可打开如下网页,点击“Select Area”即可选取所需路网
2、点击汽车图标,相当于交通需求的输入,可选取该路网中产生的车辆数、行人数等
3、点击上图中“Generate Scenario”,等待文件下载
4、文件下载后自动打开sumo-gui,点击开始就可仿真
缺点:Generate Scenario后文件下载速度慢了点
五、openstreetmap官网中截取地图为osm文件
osm官网:https://www.openstreetmap.org/export#map=16/32.0552/118.7941
六、netedit画图
1、在 SUMO学习入门 (一)SUMO介绍 中我们讲过NETEDIT,打开netedit,在Network中可以绘制路网文件
2、netedit是非常有用的,之后会在一期中细讲其创建路网的步骤,在SUMO官网中有很多案例,网上也有关于案例的中文版翻译,在初期学习的时候可以先跟着案例走。
七、直接写路网文件
1、编写network文件需要定义node节点文件以及edge边文件,相当于用点和边绘制路网。除此之外。Edge还可写两类文件:Type属性文件以及connection文件,但非必要。
2、node文件
node节点文件就是节点的信息,创建如下node file,命名为 my_nod.nod.xml:
<nodes>
<node id="n1" x="-500" y="0" type="priority"/>
<node id="n2" x="-250" y="0" type="traffic_light"/>
<node id="n3" x="-150" y="200" type="traffic_light"/>
<node id="n4" x="0" y="0"/>
<node id="n5" x="150" y="200"/>
</nodes>
可以看到node文件中包括基础的id信息、x、y代表位置信息,type是有关节点的属性,这四个是比较基础的属性。其他属性如下图,官网中有较为详细的解释:
3、edge文件
edge就是边的信息,每条边都是单向边,关于边的属性常用的有开始、结束的节点名、车道数、最大速度等,官网中罗列的属性如下:
示例创建对应上述路网的 edge file,名为 my_edge.edg.xml,内容如下:
<edges>
<edge from="n1" to="n2" id="1to2" type="3L45"/>
<edge from="n2" to="n3" id="2to3" type="2L15"/>
<edge from="n3" to="n4" id="3to4" type="3L30"/>
<edge from="n4" to="n5" id="out" type="3L30"/>
</edges>
3、利用netconvert命令生成“.net.xml”文件
4、type文件
type文件其实与上述中的type属性相同,写它的原因主要是为了方便,可以省略很多代码量,以官网中的案例做示范:
<edges>
<edge id="1fi" from="1" to="m1" type="b"/>
<edge id="1si" from="m1" to="0" type="a"/>
<edge id="1o" from="0" to="1" type="c"/>
<edge id="2fi" from="2" to="m2" type="b"/>
<edge id="2si" from="m2" to="0" type="a"/>
<edge id="2o" from="0" to="2" type="c"/>
<edge id="3fi" from="3" to="m3" type="b"/>
<edge id="3si" from="m3" to="0" type="a"/>
<edge id="3o" from="0" to="3" type="c"/>
<edge id="4fi" from="4" to="m4" type="b"/>
<edge id="4si" from="m4" to="0" type="a"/>
<edge id="4o" from="0" to="4" type="c"/>
</edges>
上述edge文件中的type=“a”、“b”、“c”其实就是用type文件进行定义的,type文件中可包含优先级、车道数、最大速度的信息,如下:
<types>
<type id="a" priority="3" numLanes="3" speed="13.889"/>
<type id="b" priority="2" numLanes="2" speed="11.111"/>
<type id="c" priority="1" numLanes="1" speed="11.111"/>
</types>
5、connection文件
connection文件其实就是将边(edge)与边之间联系在一起,即边转向功能。
connection文件主要的两个属性为“from”和“to”,from指上游边,to指下游边,示例如下:
<connections>
<connection from="1si" to="3o"/>左方来车右转
<connection from="1si" to="2o"/>左方来车直行
<connection from="2si" to="4o"/>右方来车右转
<connection from="2si" to="1o"/>右方来车直行
</connections>
八、抽象路网netgenerate
netgenerate允许生成三种类型的抽象网络:网格grid,蜘蛛spider,随机random
以建立网格文件为例:描述在x方向和y方向上建立多少个交叉点以及它们应该彼此相距多远。
结点数的参数是 –grid.x-number 和 –grid.y-number
结点之间的距离是 –grid.x-length 和 –grid.y-length
如果要构建两个轴具有相同值的网络,使用 –grid.number 和 –grid.length ,长度以米为单位。使用如下命令输入cmd中生成网格网络:
netgenerate --grid --grid.x-number=10 --grid.y-number=5 --grid.length=400 --output-file=netgenerateFile.net.xml