Open Street Map(OSM)とMASソフトを使って、人の流れを可視化する


# はじめに
こんにちは。ドコモ クロステック開発部 1年目の中村と申します。
本日は、ドコモの中で盛り上がり始めている（と思っている）人流シミュレーションについてご紹介したいと思います。
記事の具体的な内容は、Open Street Map(OSM)で鉄道ネットワークを生成し、Multi-Agent Simulation(MAS)を使用して人の流れを可視化します。
（要は、フリーの地図と専用のソフトウェアを使って、人々の電車移動を実装してみるよ、という記事です。）

## この記事でわかること
- Multi-Agent Simulation(MAS)の概要
- Open Street Map(OSM)を用いた地図の取得方法

## どんな人におすすめ？
- MASについて知りたい人、無料で地図を扱ってみたい人、などなど


# Multi-Agent Simulation
人々の移動をシミュレーションする目的は、電車や施設内で人が集中する地点を確認したり、災害時の人々の流れを事前に予測したりすることで、現実で打ち出す施策を低コストかつ高速に検証することにあります。  
例えば、災害時の迅速な避難のためにはどこに案内板や誘導員を設置すべきか、イベント時では電車をどれくらいの間隔で運行すべきか、といったことを検証するためにシミュレーションは使用されます。

<img width="50%" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887578/48eeefd5-36bd-acea-3b15-071bc877c311.png">


人流をシミュレーションする方法として、様々なものが提案されていますが、本記事では、一人ひとりの挙動をモデル化し、社会全体の効果を測るMulti-Agent Simulationに注目します。
Multi-Agent Simulationは、エージェント毎に心理特性(金額優先、時間優先など)や行動パターン（通勤、買い物など）を設定でき、徒歩、自転車、車、鉄道といった様々な移動手段を包含した社会活動のシミュレーションを実現できます。
また、今回は扱いませんが、人の流れを流体で模擬したシミュレーションもあります。

Multi-Agent Simulationのソフトウェアとして、この記事ではスペースタイムエンジニアリング社製の[Scenargie&reg;](https://www.spacetime-eng.com/jp/) を使用します。  

<img width="50%" alt="multiagent_1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887578/b73771d5-46db-8ab6-d931-7b7d132afa3b.png">

[[スペースタイムエンジニアリングの公式ホームページ](https://www.spacetime-eng.com/jp/products?page=Products_Scenargie_Extension_Modules_jp)から引用]
[Scenargie&reg;](https://www.spacetime-eng.com/jp/)は、徒歩、自転車、車、バス、電車、タクシーといった基本的な移動手段が完備されているだけでなく、乗り合いタクシーやレンタカーといったモーダルの追加や、個々人の意思決定もソースコードレベルで実装できるソフトウェアです。  

他のMASソフトとして、オープンソースの[MATSim](https://www.matsim.org/)などもあります。
また、Multi-Agent Simulation自体の詳細については、[こちらのサイト](https://mas.kke.co.jp/about/)が大変分かりやすいので、ぜひご参照下さい。


# シミュレーションができるまで
市街の人々の動きをMASで再現する場合、必要な作業は以下の4ステップで構成されます。

1. 地図を入手
2. 電車やバスの時刻表を入手
3. 人々(エージェント)の行動を設定
4. シミュレーション実行

本記事では、首都圏の鉄道網を再現したMASを実装していきます。
それでは、鉄道網の実装を前提に上記の4ステップについてご説明します。


## 1. 対象エリアの地図を入手

MASを構築するうえで筆者が一番手間取ったということもあり、ボリューミーなセクションとなっています。
手順だけをサクっと知りたい人は**太字部分**を追っていただければと思います。  

地図を入手するには地図会社から地図データ(.shpなど)を購入することがまず考えられます。 
ただ、個人がおいそれと地図データを購入するのはなかなかハードルが高いものです。
自分で建物や駅を1つ1つコーディングすることも考えられますが、骨が折れるだけでなく、動作が保証されない(バグの温床になる)という課題があります。  

そこで、そのような悩みを解決してくれるのがOpen Street Map(OSM)です。
初めてOSMの名前を聞く方向けに、OSMとは地図版のWikipediaのようなもので、親切な人たちが地球上の地図を無償で作成してくれています。大勢の人が地図を編集できるので、地図を作成するうえでのガイドラインまで作られているほどです。
地図会社の有償データに比べると、どうしても品質は劣ってしまいますが、個人で楽しむ分には十分すぎる情報量となっています。  

Open Street Mapは[こちらのサイト](https://www.openstreetmap.org/)で提供されています。
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887578/6362e6e0-d090-e99a-dbb0-0d0e23f1e8b5.png)
上の画面は、ドコモ R&DセンタがあるYRP野比駅周辺の地図です。
※場所によって建物があったりなかったりするので、YRP周辺はまだ編集途中のようですね。
「エクスポート」を押すことで、指定した領域の地図(.osm)を取得することができます。

ただ、この方法で取得できるのは比較的狭い範囲(駅周辺レベル)に限られてしまいます。
そこで、今回のように鉄道網をシミュレーションする場合には、県レベルの地図を取得する必要があるので、別の方法でosmファイルを取得しなければなりません。


### 1-1. osm(地図)の取得
広範囲の地図を取得するには、下記サイトを利用します。
http://download.geofabrik.de/  
このサイトでは、以下の粒度の地図を取得できます。
- 地球全体
- アジアやヨーロッパなどの大州
- 日本や中国などの国
- 関東や北海道などの地方

今回は首都圏の鉄道網を作成したいので、関東地方のosmを取得します。

**[こちらのページ](http://download.geofabrik.de/asia/japan/kanto.html)からkanto-latest.osm.pbfというファイルをダウンロードします。**（280MB程度）
ちなみに、地球全体のファイル"planet.osm"は50GB程度です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887578/1fc3c45f-367b-3232-c95d-7296335973ab.png)

これで、関東全域の地図を取得できました。
この地図データをこのままシミュレータにインポートしても良いのですが、あまりにも情報過多なので適宜選別した方が賢明です。

今回は、鉄道シミュレーションがメインであり、地図としては線路と駅があれば充分です。（言い換えると、道路やバス停、建物などの情報は不要です）  
そこで、kanto-latest.osm.pbfから線路と駅のみを抽出します。

### 1-2. osm(地図)の整形

**まずは、osmの整形に必要なコマンドラインツール[osmosis](https://github.com/openstreetmap/osmosis/releases/tag/0.48.3)をダウンロードします。**
インストール手順は[こちら](https://learnosm.org/ja/osm-data/osmosis/)のサイトで大変わかりやすくまとめられているので、是非ご参照ください。（筆者もこのサイトを見ながら環境構築しました。）
ここでは、関東の地図(kanto-latest.osm.pbf)から首都圏の鉄道網を抽出するコマンドをご紹介したいと思います。

**コマンドラインを起動し、kanto-latest.osm.pbfが格納されているディレクトリに移動した後、下記コマンドを入力します。**

```
osmosis --rbf kanto-latest.osm.pbf --bounding-box top=35.8206 left=139.2036 bottom=35.5356 right=139.9262 --wb tokyo.pbf
```
このように設定すると、kanto-latest.osm.pbf(関東地方)のうち、北緯35.5336度~北緯35.8206、東経139.2036度~東経139.9262(東京近辺)で囲われた四角形の地図tokyo.pbfが抽出されます。

**次に、鉄道と駅を抽出したいので、下記コマンドを入力します。**

```
osmosis --rbf tokyo.pbf --tf accept-ways railway=* --used-node --tf reject-relations --tf reject-nodes highway=bus_stop --wx tokyo_train.osm
```

これにより、東京近辺の鉄道網を抽出したtokyo_train.osmが生成されます。

ここから、上記コマンドの各オプションについて説明していきます。

```
--tf accept-ways railway=* --used-node
```
この箇所で、railway=*で全ての線路(鉄道、トラム、モノレールなど)を取得します。
また、--used-nodeで線路が関係しているノード(駅)も一緒に抽出しています。

```
--tf reject-relations
```
この部分で、駅とノードの関係を断ち切ります。（例えば、osmのタグの名前次第ではバス停と線路が関連付けられていたりするので、こういった不適切な関係性を削除するため、あえて記載する必要があります。）

```
--tf reject-nodes highway=bus_stop
```
ここでは、highwayタグがbus_stopとして登録されているノードをすべて削除します。
以上が、各オプションの説明になります。

上記コマンドで生成した地図はこのようになります。なお、画像はScenargie&reg; Visual labのキャプチャ画面です。
Scenargie&reg; Visual lab： https://www.spacetime-eng.com/jp/products?page=Products_Scenargie_Visual_Lab__Base_Simulator_jp
![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887578/602174b4-4ca4-4a60-7599-b4c729eafcd1.png)
&copy; OpenStreetMap contributors

首都圏の鉄道網が文字通り網の目のように張り巡らされているのがわかります。
余談ですが、全ての鉄道を網羅しているので、右下の[千葉の環状線](https://ja.wikipedia.org/wiki/%E8%88%9E%E6%B5%9C%E3%83%AA%E3%82%BE%E3%83%BC%E3%83%88%E3%83%A9%E3%82%A4%E3%83%B3%E3%83%87%E3%82%A3%E3%82%BA%E3%83%8B%E3%83%BC%E3%83%AA%E3%82%BE%E3%83%BC%E3%83%88%E3%83%A9%E3%82%A4%E3%83%B3)もしっかり再現されています。osmosisすごい。
ただ、除外したはずのバス停や信号機がちらほら表示されています。(黒矢印)
![1'.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887578/ef2c4c46-d676-4f59-7c4a-30d2005980e5.png)
&copy; OpenStreetMap contributors

そこで、試行錯誤を重ねた結果、**バス停と信号機を除外し、駅と線路のみを抽出するコマンドは下記の通りです。**

```
osmosis --rbf tokyo.pbf --tf accept-ways railway=* --used-node --tf reject-relations --tf reject-nodes highway=bus_stop,traffic_signals --tf reject-nodes bus=yes  --tf reject-nodes building=yes --tf reject-nodes railway=subway_entrance --tf reject-nodes amenity=bus_station --tf reject-ways highway=bus_stop,traffic_signals  --tf reject-ways building=yes --wx tokyo_train.osm
```
--tf reject-nodes bus=yes以降のオプションが追記部分で、busやtraffic_signal、必要ない建物に関する情報を、これでもかというぐらい執拗に削除したコマンドです。
（もう少しスマートなやり方もある気がするので、ご存知の方いたら教えてください。）
osmosisの各コマンドの使い方については、[こちら](https://wiki.openstreetmap.org/wiki/Osmosis/Detailed_Usage_0.48)に詳しく記載されています。

こうして得られた地図データがこちらです。
![2-2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887578/f6d0063e-d36e-a0dd-d10a-8d4e398f45ef.png)
&copy; OpenStreetMap contributors

これまでとは違い、信号機やバス停が一掃されています。
**これで鉄道路線のみの綺麗な地図が作成できたので、シミュレーションを進めていきたいと思います。**



## 2. 時刻表を入手
このステップは、好きな方法をとってください。

いまや時刻表アプリが多数リリースされているので、作成元が提供しているAPIを利用したり、鉄道会社のHPを閲覧して逐一書き下したり、時刻表を買ったり、と方法はいろいろ考えられるので、費用とかかる時間を考慮して最適な方法で時刻表を集めてもらえればと思います。  
なので、本記事では時刻表の取得の詳細は省略します。

さて、今回は東京メトロの路線の時刻表をScenargie&reg;へインポートして、鉄道のシミュレーションを動かしてみました。
※本当は、JRや東急、京急、都営地下鉄、京成、小田急、京王、西武、東武、東京モノレール、多摩都市モノレール、ゆりかもめ、りんかい線なども含めて首都圏鉄道網を完全再現したかったのですが、力及ばず投稿日に間に合いませんでした...
![3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887578/bae52847-6bec-7d6a-9fd9-3e9497fea181.gif)
&copy; OpenStreetMap contributors

各電車が時刻表通りに動いてくれています。
GUIベースで結果を出力すると、シミュレーションがとても分かりやすくて良いですね。 
電車の挙動が愛らしくてずっと見ていられます。




## 3. 人々の行動モデルを設定
シミュレーションを行う上で、このステップが最も大事な部分です。
行動モデルには、人々の心理特性(金額優先、時間優先など)や行動パターン（目的地、通勤、買い物など）を設定する必要があります。
当てずっぽうな行動モデルを設定しても、実データを基に綿密にモデリングした値を設定しても、シミュレーションとしては何らかの結果が出力されます。
そのため、如何に人々の行動モデルを妥当なものにするか、がシミュレーションを有意義なものにするカギになります。　　

ただ、今回はあくまで精緻なシミュレーションを行うというより、OSMを使ってシミュレーションしてみる、ということがメイントピックになるので、行動モデルについては適当に決めていきたいと思います。
シミュレーション条件は決め打ちで下記の通りに設定しました。

|条件  |値  |
|---|---|
|鉄道路線  |東京メトロ 9路線  |
|エージェント総数  |6000人|
|各エージェントの初期位置  |東京メトロのいずれかの駅(適当)  |
|各エージェントの目的地  |東京メトロのいずれかの駅(適当)  |
|各エージェントの移動手段  |徒歩と電車のみ  |




## 4. シミュレーション実行
上記の条件でシミュレーションを実行してみました。
![hoge5.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887578/cd7b7457-48fa-548d-9622-b0eadf6ad5b9.gif)
&copy; OpenStreetMap contributors

青いポチが人(エージェント)です。
各エージェントが電車を使って、移動している様子がわかります。
中には駅間を歩いて移動している猛者もいますが...
電車だけのアニメーションでも十分楽しめましたが、エージェントも加わるとより賑やかになって面白いですね。

また、渋谷駅(上の図における左下の駅)の混雑の推移もグラフ化してみました。
![Mas_Congestion.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887578/3986602d-94d3-896e-d566-27877c7c669e.png)

赤：銀座線、青：副都心線、緑：半蔵門線の各ホームの混雑度合いを表しています。
グラフが急激に0に変化している部分は、電車が到着したことを意味しています。
各エージェントの目的地などは適当に設定したので、**グラフの値と現実の値に整合性は全くない**ですが、このように混雑の可視化ができると色々な応用先が考えられますね。

# さいごに
本記事では、OSMとMASソフトを使って、鉄道における人の移動のシミュレーションを行いました。
この記事を読んで、OSMを使ってみよう、MASについて興味がわいた、と少しでも思っていただけたらとても嬉しいです。

以上で、この記事を締めたいとと思います。
最後までお付き合いいただき、ありがとうございました。