前言
最近在做的一个课题要用到sumo仿真,正好我们手头也有arcgis的shp文件,比osm上面的要简洁准确不少,在座的过程中遇到不少问题,这里做一下记录
要注意的地方有几个:
- shp转osm的工具
- shp文件中转换过来的中文乱码
- 转化完成的osm无法导入到sumo中成为路网
- 批量修改sumo中路网的车道数
以下会一一记录
1、shp转osm工具
这里直接参考了
https://www.jianshu.com/p/a47ed4a0b7bd
的文章,直接使用JOSM+opendata的插件实测可行的,但是直接转化过来就发现了第二个问题——中文乱码。
2、shp文件中转换过来的中文乱码
这里直接参考了
https://blog.csdn.net/qq_35582643/article/details/80651764
文章,下载链接已经是失效了,只能加群获取了,但是免费版在转换方面有限制数量,不过对于我来说足够了。
所以现在的操作就是将shp文件利用gis工具转换编码,然后利用JOSM转换为osm文件,而且也没有中文乱码,完成。
3、转化完成的osm无法导入到sumo中成为路网
但是熟悉shp文件的同学应该知道,shp文件中的属性表里面是有着各种各样的字段的,转换为osm文件之后,字段就成了各种各样的tag,但是要注意——
osm文件中的tag是有规定的,在shp中的字段变为osm文件之后,这些tag可能就成了非法标签
。
所以无法直接导入到sumo中成为路网,这里推荐的方法是:
- 在arcgis中将shp文件与sumo路网无关的字段统统删除,只留下一些有用的
- 查看osm文件中的合法tag内容,并将自己的shp文件做对应修改,这里贴一下osm中几个合法的tag:
<way id="233756369" visible="true" version="3" changeset="53939021" timestamp="2017-11-20T05:24:30Z" user="booktiger" uid="4794671">
<nd ref="1497364443"/>
<nd ref="294118699"/>
<nd ref="1497364422"/>
<nd ref="1772777332"/>
<nd ref="1420940430"/>
<nd ref="1772777334"/>
<nd ref="294114764"/>
<nd ref="294114772"/>
<nd ref="1779334576"/>
<nd ref="1779334575"/>
<nd ref="1779334574"/>
<nd ref="1779334555"/>
<nd ref="1571464679"/>
<tag k="bicycle" v="no"/>
<tag k="foot" v="no"/>
<tag k="highway" v="primary"/>
<tag k="lanes" v="3"/>
<tag k="name" v="中关村大街"/>
<tag k="name:en" v="Zhongguancun Main Street"/>
<tag k="name:zh" v="中关村大街"/>
<tag k="name:zh_pinyin" v="Zhōngguāncūn dàjiē"/>
<tag k="oneway" v="yes"/>
</way>
其中:
way是一条线路
nd标签是构成路线的节点
tag是路线的属性
tag的k对应shp中的字段名称,v对应该路线该字段的记录
所以如果想要shp文件转换的osm可以导入到sumo中,那么它的字段名称就需要是“bicycle”、“highway”、“lanes”、“name”这些名称,字段的记录也要遵循规则,而且顺便一提,highway还控制着车道数哦。
其中最自由的v对应的k应该就是name了,我们可以直接在arcgis里面
把需要保留的值字符串相加之后保存在name中。
留下合法的tag之后,就可以导入到sumo中变成路网了。
4、批量修改sumo中路网的车道数
对于arcgis中的路网来说,一般是会有一个字段说明一条路是几个车道,在osm中对应的这个车道数就是:
<tag k="lanes" v="4"/>
这个tag的意思就是说,它对应的这条道路的车道数是双向四车道,批量修改的话有两种方法:
- 直接在shp文件中修改字段的记录
- 修改osm文件的tag
arcgis里面虽然也集成了vb和python的方法,但是我觉得用着不是很舒服,所以我的就直接修改osm文件。
osm文件打开的话本质上还是xml文件,所以使用修改xml的方法修改就可以了,修改的方法可以参考我的上一篇分享文章:
https://blog.csdn.net/darer49/article/details/106712605
osm文件修改完成之后,sumo就可以直接加载osm文件形成路网了。
由此完成,写出来感觉还挺简单的,但是试错的过程可真是恼人嘞。