JOSMでバスリレーションを書こう！

# はじめに
OSMのよくわからない機能第1位(自分調べ)に挙げられるのがリレーション機能です。
色々試行錯誤して、バスのリレーションを書く方法を見つけ出したので、まとめてみます。

# リレーションとは
リレーションとは、OSM上で「ひとまとまりの集合」を表現するための概念です。
今回のように特定のバスルートやサイクリングロードなどを表したりする際に利用します。
また、複数のポリゴンからなる建造物を表現するのにも用いられます。

# JOSMの導入
普段よく使っているOSM WebエディタのiDはリレーション編集機能に対応していないので、
[JSOM](https://josm.openstreetmap.de/wiki/Ja%3AWikiStart)(Java OpenStreetMap Editor)を利用します。

前提としてJava8のインストールを求められているので、インストールしてください。

Windowsでは[JSOM](https://josm.openstreetmap.de/wiki/Ja%3AWikiStart)公式サイトから"josm.jnlp"をダウンロードしてください。
落としてきた"josm.jnlp"をダブルクリックすればインストールしてくれます。

Linuxでは各ディストリのリポジトリに登録されているものをインストールしてください。

Macではbrew caskで入るのでこれを利用してください。
なお右クリックを頻繁に用いる都合上、Macのトラックパットでは操作が非常に難しいのでご注意ください。

# OSMへのログイン
編集するにはまずログイン、ということで先にログイン作業を済ませておきます。
*F12*キーを押して設定画面を開き、*OSMサーバーへの接続設定*ボタンをクリックします。

![josm13.png](https://qiita-image-store.s3.amazonaws.com/0/53168/2a97d7d7-2a80-3b5d-4340-c601f283e32b.png)

ここで*今すぐ認証*ボタンをクリックし、ログインユーザー名とパスワードを入力してトークンを受け取ってください。
OAuth認証を利用している人は、認証手続きを__半自動__に設定したうえで、リクエストトークンを取得してください。

# マップの事前ダウンロード
JOSMでは編集する範囲を事前にダウンロードしておく必要があります。
API制限のため極めて狭い範囲しかダウンロードできないので、ちまちまと編集範囲すべてをダウンロードしていきます。
赤枠で囲ってあるダウンロードボタンを押して、範囲を選択しつつダウンロードしてください。

![josm01.png](https://qiita-image-store.s3.amazonaws.com/0/53168/39da4202-1eea-208f-7646-c8b05bdd6e6e.png)

目安としてはこのぐらいの範囲です。
右クリックで地図上を移動しつつ、左ドラッグで範囲を選択します。
![josm02.png](https://qiita-image-store.s3.amazonaws.com/0/53168/da415f91-c69f-0231-7358-72dae2d20f6e.png)

ダウンロードしたマップはJOSMを終了すると破棄されてしまうので、保存しておきましょう。
Ctrl+Sで保存することができます。

# ウェイのみの表示
これからの作業には道路とバス停のみが見えていれば十分なので、フィルタをかけます。
他のポリゴンがあると動作も重たいですし、優先的に行っておきます。

画面左下のフィルタボタンをクリックし、フィルタ編集欄を出現させます。編集欄は右下に出てきます。

![josm03.png](https://qiita-image-store.s3.amazonaws.com/0/53168/8085ebde-b138-d6b5-a4bf-f23599a60f90.png)

編集欄で「追加」ボタンをクリックします。

![josm04.png](https://qiita-image-store.s3.amazonaws.com/0/53168/d6c68e64-228c-5c76-3161-77880b2e9b8a.png)

*フィルター文字列*に__highway__と入力し、*フィルターを登録*ボタンを押します。
追加されたら、左右2つのチェックボックスにチェックを入れて、完了です。

![josm05.png](https://qiita-image-store.s3.amazonaws.com/0/53168/e66c3d02-962f-2c23-cb4b-effa881ff69c.png)

# リレーションの作成
## リレーションの追加
いよいよバス用のリレーションを作成します。右下にあるリレーション一覧から「新規リレーション作成」ボタンをクリックします。

![josm06.png](https://qiita-image-store.s3.amazonaws.com/0/53168/49c3e79c-97c4-3d8c-a1e5-2b148f14b190.png)

編集ウィンドウが開くので、リレーションのタグを決めていきます。
バスの場合はおおむね以下のような値を設定するとよいと考えられます。

| キー        | 説明                 | 例       |
|-------------|----------------------|----------|
| type        | リレーションのタイプ | route    |
| route       | ルートの種類         | bus      |
| operator    | 運行業者             | ◦◦バス   |
| name        | ルート名             | ◦◦循環線 |
| ref         | ルート番号           | 6        |
| description | 説明                 | △発□行き(◦◦経由)   |

今回は例として以下のようなリレーション[^1]を追加してみます。

![josm07.png](https://qiita-image-store.s3.amazonaws.com/0/53168/08766fe8-68b5-05a5-ecd8-669eb3f119dd.png)

## バス停の追加
リレーション編集画面は開いたまま、追加するバス停を選んでいきます。
Ctrlキーを押しながら、始点から終点までのすべてのバス停を選択します。
地図上の移動は右ドラッグなので間違えないようにしてください。

あまりに大量に選びすぎるとミスクリックしたときのダメージが大きいので、
5つぐらい選択したら、リレーションに追加していくとよいでしょう。
下へ下へ追加していけば良いので、4つあるうち一番下のボタンを押して追加していきます。

続きがあるときはどこか何もない場所をクリックして、選択されたバス停の選択を解除することを忘れないでください。
さもないと二重にバス停が追加されてしまいます。

![josm08.png](https://qiita-image-store.s3.amazonaws.com/0/53168/c83816a8-9291-1620-9555-36a86c32f8f0.png)

ループ線がある都合上、同じバス停をリレーションに追加しようとすると既に登録されているという旨の警告が出ますが、
事実そういうルートであることには変わりが無いので無視して登録してかまいません。

一通りバス停を追加し終わったら、ロールを適用していきます。
Shiftキーを使って登録したバス停をすべて選択し、*ロールを適用*欄に__stop__と入力してチェックボタンを押します。

![josm09.png](https://qiita-image-store.s3.amazonaws.com/0/53168/7cdf2787-8510-e0cf-a72e-3189b4944c13.png)

すべての*役割*欄に__stop__と記述されればOKです。

## 運行ルートの追加
バス停を選択していったときと同様、バスが通る順番に道路を選択していきます。
こちらも下へ下へ追加していってください。
また、ループ線などで同じところを登録しようとすると警告が出ますが、気にする必要はありません。

曲がりたいところで道路が切れていない場合は、交差点部分をクリックして*P*キーを押すと道路を分割できます。

ざっくり道路を追加したら、切断箇所がないかを確認します。
特に道路を分割した際などには意図した道路が選択されておらず、途切れてしまう場合があります。
その場合はメンバー欄の一番右の路線選択状況を見て、赤丸になっている箇所を探して修復すればOKです。

![josm10.png](https://qiita-image-store.s3.amazonaws.com/0/53168/934097fc-5f02-1c11-407d-33bae148dee2.png)

赤丸になっている参照先をダブルクリックすると地図上に赤く表示されるので、
その前後を繋ぐような道路を新たに選択して該当箇所に挿入します。
選択されたノードの下に追加ボタンで挿入できます。

![josm11.png](https://qiita-image-store.s3.amazonaws.com/0/53168/b3969fee-82a6-3a17-a0c7-00ec5e97e5f9.png)

追加し終わったら、先ほどと同様にロールを適用していきます。路線状況の矢印に注目してください。
矢印が下に向いているものは__forward__、上を向いているものは__backward__を記述していきます。
これを間違うと切断状態になってしまうので、気をつけてください。
(もっとも、その場合は赤丸で表示されるのですぐわかりますが)

![ルートの結合](https://qiita-image-store.s3.amazonaws.com/0/53168/8061adee-54ae-17a6-9444-db2af394b357.png)

最後に編集画面下部にある*OK*ボタンを押して、リレーションへの登録作業は終了です。

## アップロード
リレーションを作り終わったら、OSMに反映させるためにアップロードしましょう。
その前にログインが必要なので済ませておきます。

アップロードボタンをクリックして、いくつかの確認作業を経た後にアップロードできます。
上矢印のアイコンがアップロードボタンです。

![アップロードボタン](https://qiita-image-store.s3.amazonaws.com/0/53168/5de54ba8-26a5-3afa-b2ee-24f19cbcf58b.png)

疑わしいデータへの警告はとりあえず無視してかまいません。

追加や変更のあったオブジェクトの確認欄で、意図していないものを編集していないか確認してから、
*変更の概略コメント*と*データのソース*を入れてアップロードしましょう！

## マスターリレーションへの登録
同名のバスルートで複数のルートがある場合、マスターリレーションを作成して登録することで関係性を示すことができます。
先ほどと同様に新規リレーション作成し、以下のようなキーと値を設定していきます。


| キー         | 説明                 | 例           |
|--------------|----------------------|--------------|
| type         | リレーションのタイプ | route_master |
| route_master | ルートの種類         | bus          |
| operator     | 運行業者             | ◦◦バス       |
| name         | ルート名             | ◦◦循環線     |
| ref          | ルート番号           | 6            |

さらに、所属させたいリレーションを選択して同様に登録します。
今回は、ロールに何かを設定する必要はありません。

試しに「1」のマスターリレーションを作ってみました。

![マスターリレーションの登録](https://qiita-image-store.s3.amazonaws.com/0/53168/69bb81ef-5bc0-0996-86b8-30be77912f1c.png)

できたらアップロードしましょう。

# おわりに
リレーション追加の手順、いかがだったでしょうか。
JOSMを使えば、多少の手間はかかりますが意外と簡単にできてしまうものです。

今回例として書いたリレーションは[こちら](https://openstreetmap.org/relation/6822618)から見てみてください。
登録してから数日経つと、交通レイヤーにも反映されてやりがいを感じられますよ！

最後になりましたが、もしもっと良いやり方があったり、
リレーションとして不適切な箇所がございましたらご指摘ください。

# 参考
- [route relationの描き方](http://qiita.com/nyampire/items/c70ff1d4a8d07efe4e11)

# 注釈
[^1]: 北海道で未着手のバスルートは[こちらのサイト](https://wiki.openstreetmap.org/wiki/JA:Bus_routes_in_Hokkaido#.E5.AE.A4.E8.98.AD.E6.9D.B1.E5.96.B6.E6.A5.AD.E6.89.80)で公開されています。そもそもこのページ自体も充実していないので、拡充が必要ですが...