交通流シミュレータ SUMO で日本国内のOpenStreetMap地図を読み込む際の設定と注意点

#概要
交通流シミュレータSUMOで，付属の地図変換スクリプトNETCONVERTを用いてOpenStreetMapのリアルワールド準拠の地図を読み込んでシミュレートする際に，日本国内の地図を利用する場合の設定と注意点をまとめます．

NETCONVERTはOpenStreetMapの地図形式（.osm）をSUMOの地図形式（.net.xml）に変換するスクリプトです．
NETCONVERTの基本的な使い方はシミュレーション手順は既に[こちらの記事](https://qiita.com/nattof/items/d198557126b7d3636f10)にまとめられているので参照ください．

#環境
- Windows10 64bit
- SUMO version 1.1.0
 
SUMOのインストール方法は下記を参照してください．
[Quiita: 交通流シミュレータ SUMO をWindowsに導入する](https://qiita.com/jagimo/items/a137b5c7d4e3e70e0919)

#制限速度の設定
制限速度がOpenStreetMapで設定されている場合は，NETCONVETで地図を変換する場合にもOSMの制限速度が反映されるので問題ありません．
制限速度がOpenStreetMapで設定されていない場合は，OpenStreetMapの道路クラスごとにデフォルトの値が設定されてしまいます．

|OSMクラス|日本での適用例|NETCONVERTデフォルト制限速度|
|:---|:---|:---|
|highway=motorway|高速道路または自動車専用道|44.44 m/s (160km/h)|
|highway=trunk|国道|27.78 m/s (100km/h)|
|highway=primary|主要地方道|27.78 m/s (100km/h)|
|highway=secondary|一般都道府県道|27.78 m/s (100km/h)|
|highway=tertiary|市町村道|22.22 m/s (80km/h)|
|highway=unclassified|市町村道（1車線）|13.89 m/s (50km/h)|
|highway=residential|居住地域内道路|13.89 m/s (50km/h)|

これらの制限速度は日本国内では速すぎますので，現実的にシミュレートする場合は設定の変更が必要です．下記のxmlファイルを書き換えます．

```インストールフォルダ\eclipse\Sumo\data\typemap\osmNetconvert.typ.xml
<省略>
//高速道路の場合．speedを書き換える．
<type id="highway.motorway" numLanes="2" speed="44.44" priority="13" oneway="true"  disallow="pedestrian bicycle moped rail rail_urban rail_electric tram ship"/>
<省略>
```

#信号・交差点の設定
信号・交差点の設定を含むあらゆるNETCONVETの設定は[公式ページ（英語）](https://sumo.dlr.de/wiki/NETCONVERT)に詳細が掲載されています．
その中でも信号・交差点の設定については，OpenStreetMapから地図を読み込む場合に必ず設定すべき項目があります．

###OSMから地図を読み込む場合に絶対に設定すべき項目
|オプション|デフォルト値|説明|
|:---|:---|:---|
|--junctions.join \<BOOL>|false|近接している交差点を結合する|
|--tls.guess-signals \<BOOL>|false|近接している信号機を一体の構成とみなす|


上記オプションがない場合，例えば中央分離帯が広い道路や間に川を挟んでいる道路が一方通行の別々の道路扱いをされてしまい，実際は1つの交差点でも複数の交差点扱いをされてします．このような交差点ではシミュレーション上で信号の制御がうまくいかず，異常に車両が滞留してしまう原因となります．

![junction.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366359/4b8fbbad-5478-9cda-e371-9297b3cf1c7d.png)

左: 交差点が結合されていない状態．南側から右折する場合は1台ずつになってしまう状態．
右: 交差点が結合されている状態．対向車がいなければ右折できる．

###信号の生成される交差点について
OpenStreetMapから地図を読み込む場合，OSM側に信号の存在を明記してあればNETCONVETでも信号が出力されます．ただ，OSMは有志で追記・編集する運用（Wikipediaのような形態）のため，必ずしも現実世界の信号がOSMにも反映されているとは限りません（田舎の地図では特に顕著）．

信号があまりにも少ない場合，制限速度が一定の速度以上の道路同士が交差する交差点に信号を設置することもできます．その場合は下記3つのコマンドを追加してください．

|オプション|デフォルト値|説明|
|:---|:---|:---|
|--speed-in-kmh \<BOOL>|false|km/hで設定を行う|
|--tls.guess \<BOOL>|false|OSM上に存在しない交差点もルールベースで追加する|
|--tls.guess.threshold \<FLOAT>|69.4444[km/h]|交差点を設置する道路の制限速度の最小値|

#その他設定するとよいオプション
|オプション|デフォルト値|説明|
|:---|:---|:---|
|--lefthand \<BOOL>|false|左側通行の設定|
|--sidewalks.guess.from-permissions \<BOOL>|false|歩道を追加する|
|--crossings.guess \<BOOL>|false|横断歩道を追加する|

特に日本国内の地図の場合，両側通行の道路（細街路）と一方通行の道路の組み合わせで表現されている道路（幹線道路）の矛盾が起きますので，--lefthand は設定すべきでしょう．

歩道と横断歩道は歩行者のシミュレーションをする場合には適宜追加してください．

最終的なNETCONVERT実行コマンドは以下のようになります（39km/h以上の道路に交差点を追加する場合）．

```
netconvert --osm-files map.osm -o hoge.net.xml --speed-in-kmh --junctions.join --tls.guess --tls.guess.threshold 39.0 --tls.guess-signals --sidewalks.guess.from-permissions --crossings.guess
```

#生成したnet.xmlファイルを微修正したい場合
NETEDITを使ってGUIでマニュアル編集しましょう．
インストールフォルダ\eclipse\Sumo\bin\netedit.exe を起動．

#参考ページ
- NETCONVERT公式ドキュメント（英語）: https://sumo.dlr.de/wiki/NETCONVERT
- OpenStreetMap Wiki 道路の項 : https://wiki.openstreetmap.org/wiki/Key:highway#Roads