將shp文件轉化爲osm文件,並導入到sumo中建立路網

前言

最近在做的一個課題要用到sumo仿真,正好我們手頭也有arcgis的shp文件,比osm上面的要簡潔準確不少,在座的過程中遇到不少問題,這裏做一下記錄

要注意的地方有幾個:

  1. shp轉osm的工具
  2. shp文件中轉換過來的中文亂碼
  3. 轉化完成的osm無法導入到sumo中成爲路網
  4. 批量修改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中成爲路網,這裏推薦的方法是:

  1. 在arcgis中將shp文件與sumo路網無關的字段統統刪除,只留下一些有用的
  2. 查看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的意思就是說,它對應的這條道路的車道數是雙向四車道,批量修改的話有兩種方法:

  1. 直接在shp文件中修改字段的記錄
  2. 修改osm文件的tag

arcgis裏面雖然也集成了vb和python的方法,但是我覺得用着不是很舒服,所以我的就直接修改osm文件。

osm文件打開的話本質上還是xml文件,所以使用修改xml的方法修改就可以了,修改的方法可以參考我的上一篇分享文章:

https://blog.csdn.net/darer49/article/details/106712605

osm文件修改完成之後,sumo就可以直接加載osm文件形成路網了。

由此完成,寫出來感覺還挺簡單的,但是試錯的過程可真是惱人嘞。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章