Plateau建物データ: OpenStreetMapへのインポート手順（ドラフト）

**注意: これは最新版の手順書ではありません！ [最新版は、OSM wikiで公開されています](https://wiki.openstreetmap.org/wiki/JA:MLIT_PLATEAU/imports_outline/manual)。**

**作業手順およびフィードバックは、最新版を参照ください。**

https://wiki.openstreetmap.org/wiki/JA:MLIT_PLATEAU/imports_outline/manual

このページでは、Plateauプロジェクトで公開される3Dデータの建物オブジェクトについて、OpenStreetMapへインポートする手順を記載します。

インポート全体に関する情報については、[OSM wiki: JA:MLIT PLATEAU/imports outline](https://wiki.openstreetmap.org/wiki/JA:MLIT_PLATEAU/imports_outline)を参照してください。

## 1. 対象地域のcitygmlファイルをダウンロードする
作業対象のファイルを、[G空間情報センター](https://www.geospatial.jp/ckan/dataset/plateau)からダウンロードします。

* [3D都市モデル（Project PLATEAU）ポータルサイト](https://www.geospatial.jp/ckan/dataset/plateau)

ダウンロードする際には、CityGML形式を選択します。

ファイルのダウンロードが終わったら、zipファイルを展開します。
建物データは、展開したディレクトリの `udx/bldg` 配下に格納されています。

## 2. 変換スクリプトのダウンロード
[ yuuhayashi / citygml-osm](https://github.com/yuuhayashi/citygml-osm)をダウンロードします。

コンパイルされたスクリプトが、release配下から配布されています。
今回の作業では、[version 1.4.3](https://github.com/yuuhayashi/citygml-osm/releases/tag/v1.4.3)を利用します。

ダウンロードしたファイルを展開し、`citygml-osm-jar-with-dependencies.jar`を、Plateauの建物データ（citygml形式, デフォルトでは`udx/bldg`配下）を展開したファイルに格納します。


### 2.1 1st-3rdまでのスクリプトを回す
ターミナル（あるいはコマンドラインやPowershellなど）を起動し、citygmlを展開したフォルダに移動します。

移動したら、以下のコマンドを入力します。

```
java -Dfile.encoding=utf-8 -jar citygml-osm-jar-with-dependencies.jar 1st
java -Dfile.encoding=utf-8 -jar citygml-osm-jar-with-dependencies.jar 2nd
java -Dfile.encoding=utf-8 -jar citygml-osm-jar-with-dependencies.jar 3rd
```

それぞれのコマンドでは、以下の処理が行われます。

* **1st**: CityGMLデータを.osm形式に変換し、`.osm`形式として保存する
* **2nd**: それぞれの.osmファイルのデータ範囲のデータをosm.orgからダウンロードし、`.org.osm`形式として保存する
* **3rd**: `.osm`と`.org.osm`を比較・マージすることで `mrg.osm`形式のファイルを出力し、保存する

この処理により、同じ名称で拡張子の異なるファイルが4種類 (`*.gml`, `*.osm`, `*.org.osm` そして `*.mrg.osm`) できあがることになります。
なお上記のコマンドは、配布されているスクリプトに同梱されている `run.sh` （あるいは`run.bat`）をキックしても、同じ結果が得られます。

スクリプトは、同じディレクトリに格納されているすべてのgmlファイルに対して実行されます。そのため、ファイル数が多いとそれなりに処理時間がかかります。必要に応じて、適宜ディレクトリを分けるなどの対応を行ってください。

### 3. `.mrg.osm`ファイルをJOSMで開く
拡張子 `.mrg.osm` のファイルをJOSMで読み込みます。

この作業では、読み込まれたファイルを編集して、インポートしたくないオブジェクトを削除することが目的です。

![スクリーンショット 2022-03-09 11.55.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9928/6b187207-344e-cda6-6ce7-43d5fcd18107.png)

#### 3.1 todoプラグインのインストール
JOSMのメニューを開き、プラグイン設定タブを開きます。
![スクリーンショット 2022-03-16 15.45.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9928/f91bd0f0-ed45-0a93-f9c6-8aa0d1797232.png)
todoプラグインにチェックを入れ、OKを押すとプラグインがインストールされます。
インストールが終わったら、インストールを有効化するため、JOSMを再起動します。
再起動が終わったら、JOSM画面左側のプラグイン一覧からtodoプラグインを有効化します。
プラグインが有効化されると、JOSM画面左側のペインにtodoプラグインが表示されるようになります。
![スクリーンショット 2022-03-16 15.47.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9928/3d8c1d98-cd77-eb3f-3f14-4419f2c22371.png)
![スクリーンショット 2022-03-16 15.47.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9928/e3678e31-0026-8419-7dc1-d2bae7c7f376.png)

#### 3.2 フィルタの設定
JOSMのフィルタに、以下4つのフィルタを設定します。

* `"MLIT_PLATEAU:fixme"=*`
* `"MLIT_PLATEAU:fixme"="PLATEAUデータで更新されています"`
* `"MLIT_PLATEAU:fixme"="delete 削除されます"`
* `type:node`

合成されたファイルである `.mrg.osm`では、既存のOSMデータとPlateauデータで差分があった場合、対象のオブジェクトに `"MLIT_PLATEAU:fixme"`タグが付与されています。
基本的に、この `"MLIT_PLATEAU:fixme"=*` を処理してゆくことで、アップロード可能な状態のファイルを作成することができます。
JOSMのフィルタを利用することで、対象のオブジェクトを発見しやすくしましょう。

![スクリーンショット 2022-03-16 14.28.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9928/d88d8d7e-f0eb-a364-b797-d4a83651eb6b.png)

#### 3.3 `"MLIT_PLATEAU:fixme"=*`に含まれる値の解説
`"MLIT_PLATEAU:fixme"=*`には、以下2つのどちらかの値が格納されています。

* `"MLIT_PLATEAU:fixme"="PLATEAUデータで更新されています"`
* `"MLIT_PLATEAU:fixme"="delete 削除されます"`

### 4 `.mrg.osm`の編集
JOSMで`.mrg.osm`を編集します。

#### 4.1 `"MLIT_PLATEAU:fixme"`が付与されていないデータの確認
`"MLIT_PLATEAU:fixme"=*`のフィルタを有効化し、反転させて、タグがついていないデータ（つまり、Plateauデータそのままのオブジェクト）だけを表示させます。

背景画像にBingやMaxarなど、なるべく撮影年度の新しい衛星写真をセットし、明らかに現状存在しない建物オブジェクトがある場合、そのオブジェクトを削除します。

#### 4.2 `"MLIT_PLATEAU:fixme"=*`が付与されたデータへの対応
`type:node`のフィルタを有効化します。
これにより、オブジェクトを選択する際にノードが選択されないようになります。

##### `"MLIT_PLATEAU:fixme"="PLATEAUデータで更新されています"` に関する処理
OSMの既存データから、Plateauデータの形状への置換が行われる予定のオブジェクトです。
目視によるチェックや修正作業を行い、アップロードしてもよい形状であることを確認します。

これらの建物形状データは、以下の特性を有しています。
* 建物形状: Plateau側の形状を利用
* タグ: 既存とPlateauの両方をマージしたもの（タグのマージ方針についてはGithubを参照してください）

次に、レイヤーを選択し、`type:node`と`"MLIT_PLATEAU:fixme"=PLATEAUデータで更新されています`のフィルタを有効化した状態で、Ctrl+Aを押し、レイヤー内のオブジェクトを全選択します。
タグが付与されたオブジェクトが全選択されたら、その状態でtodoプラグインの `+` ボタンを押して、対象のオブジェクトがtodoリスト内に格納され、チェックリストを作成します。

背景画像にosm.orgのタイル画像と、撮影年度の新しい衛星写真の2つを設定し、OSMに存在する既存の建物との位置関係を確認してください。
![スクリーンショット 2022-03-16 16.11.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9928/fab8eb8d-f92b-d4a1-16a9-0806a8fb4c60.png)

もしオブジェクトの形状やタグに問題がなく、インポートができると判断できれば、todoプラグインの `✔マーク`ボタンを押します。

もし`"MLIT_PLATEAU:fixme"="PLATEAUデータで更新されています"`のタグがあるオブジェクトの位置が間違っている場合、そのオブジェクトを削除してください。削除することで、既存のOSMデータが優先され、形状の更新が行われなくなります。

次の処理で使うため、 `"MLIT_PLATEAU:fixme"="PLATEAUデータで更新されています"` のタグは削除しないでください。

##### `"MLIT_PLATEAU:fixme"="delete 削除されます"` に関する処理
このタグが付与されたオブジェクトは、何らかの理由で削除が提案されています。
例えば、3戸の既存建物が存在する箇所が、2戸のPLATEAUオブジェクトに統合される場合、統合からあぶれた1戸が”delete”となります。

`更新されています`のオブジェクトの手順と同様、レイヤーを選択し、`type:node`と`"MLIT_PLATEAU:fixme"="delete 削除されます"`のフィルタを有効化した状態で、Ctrl+Aを押し、レイヤー内のオブジェクトを全選択します。
タグが付与されたオブジェクトが全選択されたら、その状態でtodoプラグインの `+` ボタンを押して、対象のオブジェクトがtodoリスト内に格納され、チェックリストを作成します。

osm.orgのタイル画像や、撮影年度の新しい衛星写真と比較し、削除して問題ないことが確認できた場合は、todoプラグインの `✔マーク`ボタンを押してリストから消込を行い、このタグ（`"MLIT_PLATEAU:fixme"="delete 削除されます"`）をもつオブジェクトをそのままにしてください。

![スクリーンショット 2022-03-09 11.18.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9928/afd578d2-c8ca-670a-cf8a-7c837f153b63.png)

この建物形状を残したい場合は、 `"MLIT_PLATEAU:fixme"="delete 削除されます"` の**タグ**を削除してください。
また、すぐ近くに、置き換え対象となっている建物形状が存在することが多いはずです。フィルタのオン/オフを行ってオブジェクトを表示させ、近隣の建物形状を適宜修正してください。場合によっては、近くに存在する建物オブジェクトから残したい建物オブジェクトに対し、nameなどのタグをコピーしてくることも重要です。
残したい建物オブジェクトと重複しているすべてのオブジェクトを削除することで、対象の建物形状を残すことができるようになります。

##### 迷ったときは？
多くの場合、Plateauの建物データは非常に優秀で、形状の置き換えに問題はありません。

ただし、Plateauデータも完璧ではありません。現在の建物の状況がどうなっているか、Plateauデータセットの建物形状が本当に正しいものなのかどうか、Bingなどの航空写真では判別が付きづらい場合、以下の手がかりを参考に情報を集めてください。

* **既存データの履歴の確認**
既存データの履歴等を確認し、どのような情報をもとに形状が描かれたかを確認します。
Plateauデータは主に2016年頃に取得したデータから作成されていることが多く、それよりも後に追加された建物オブジェクトの場合は、新しく描かれた建物が正しい場合があります。特に2016年以降にsurvey情報をもとに形状が描かれた建物は信頼性が高い可能性があります。

* **最新の航空写真を参照する**
2016年以降にOSMへ追加された建物オブジェクトであったとしても、参照している航空写真/衛星写真が2016年よりも古い写真であるケースがあります。
2016年より新しく撮影された航空写真と比較することによって、データの信憑性を確認することが可能です。

* **それでもどうしても判別や決断ができない**
作業を一時中断し、対象のメッシュ名を付記してSlackチャンネル等で相談してください。

なお、Plateauデータのインポートを行った地域は、作業完了後、Tasking Managerを使って形状などの事後確認プロセスを設ける予定です。大きな間違いの場合は、事後確認プロセスの段階でチェックすることも可能です。

## 4. チェックしたファイルを `名前をつけて保存`
チェックが完了したファイルを、名前を付けて保存します。

JOSMのメニューから、あるいはJOSMのレイヤー一覧から、対象のレイヤーを保存します。

保存する際は、ファイル名を `checked.osm` としてください。

## 5. アップロード用ファイルへの変換（4thスクリプトを回す）
`checked.osm`ファイルを、アップロード用ファイルに変換します。

ターミナルから、以下のコマンドを入力します。

```
$ java -Dfile.encoding=utf-8 -jar citygml-osm-jar-with-dependencies.jar 4th
```

これにより、 `checked.osm` を元にした `upload.osm` が生成されます。

## 6. osm.orgへのアップロード
JOSMで `upload.osm` を開き、osm.orgへアップロードします。

レイヤで `upload.osm`を開いた状態で `妥当性検証`を行います。

妥当性検証の結果として表示される警告やエラーを確認し、その上でデータのアップロードを行ってください。
例えば、縁の部分で重複するノードのエラー処理や、メンバーが存在しないリレーションなどが発生することがあります。

アップロードする際には、変更セットに対して以下のタグを付与してください。

```
 source = MLIT_PLATEAU
 source_ref = https://wiki.openstreetmap.org/wiki/MLIT_PLATEAU/imports_outline
```

また、変更セットのコメントとして、以下のフォーマットを推奨します。
メッシュ番号は、作業を行っているファイルの先頭8桁の数字です。

```
Plateau import: [対象の市町村] [メッシュ番号]
```

例: `Plateau import: 新座市 53395404`

## 7. OSM wikiの対象リストを編集する
OSM wikiに、インポート対象となる各市町村ごとのファイル名一覧を作成しています。

* https://wiki.openstreetmap.org/wiki/JA:MLIT_PLATEAU/imports_list

インポートが完了したメッシュ番号に対し、インポート済みであることを記載してください。
また、申し送り事項がある場合は、備考欄にその内容を記載してください。