JA:MLIT PLATEAU/imports outline/manual detail
このページの内容はuser:okadatsuneoがPlateauインポート時に追加で作業している手順です。 参考になれば、また取り入れられるものであればご活用下さい。
ここでの操作はJOSMのutilsplugin2を使用しますので、インストールしていない場合は事前にプラグインをインストールしてください。
type=buildingリレーション確認の効率化
citygmlでは隣接するbuildingオブジェクトを1つの建物と見なして、全体をtype=buildingのマルチポリゴンにしていますが、
航空写真のデータと見比べると、実際に1つの建物と想定できるものはせいぜい1割前後で、それ以外は複数の建物が隣接しているだけというものが多いです。
マニュアルでは、アップロード前にマルチポリゴンを確認するように書いていますが、手動でマルチポリゴンを解除するのは手間なので、スクリプトを作成しました。
実施箇所:1st Stepの***_op.osmを作成した後
作業手順:
- 1st Stepで作成したosmファイル(
***_op.osm)のtype=buildingマルチポリゴンを個々のbuildingに変換します。(出力:***_op_2.osm) ***_op.osmと***_op_2.osmの2つのファイルをJOSMで開きます。***_op.osmの「リレーションウインドウ」でオブジェクトを全選択し、右クリックメニューから「リレーションを選択」を選びます。- 「ToDoリスト」の
+ボタンを押して、リレーションをすべてToDoリストに追加します。 - リレーションを1つずつ航空写真と見比べて、1つの建物か、複数の建物の集まりか確認します。
- 1つの建物の場合はそのままとします。
- 複数の建物の集まりと判断した場合は、該当のオブジェクトを削除し、
***_op_2.osmにある相当するオブジェクトをコピーして***_op.osmに貼り付けします。- 任意のノードやウェイに接続されたすべてのウェイを選択する場合は「選択」→「すべての接続されたウェイを選択 (Crtl+Shift+E)」を選択すると楽です。
- また貼り付ける場合は「編集」→「元の位置に貼り付け (Crtl+V)」をすると、座標をそのままに貼り付けできます。
- すべてのリレーションを確認したら保存します。
- 次の「2nd : 既存のOSM建物データを取得する」手順に進みます。
アップロード時に既存のノードを削除せずに流用する
citygmlで4thスクリプトを実行してupload.osmを作成すると、既存のOSMオブジェクトのノードは全部削除してしまい、新規作成します(ウェイのみ流用しています)。
ノードの削除量が多いと、他のコントリビューターさんから「無駄なことをやっているのでは?」とのコメントがついたりするので、削除を最小限にして活用する手順を示します。
実施個所:upload.osmファイル作成後
作業手順:
upload.osmと中間ファイルである***_op.org.osmを用意します。- 次のスクリプトで2つのファイルを入力ファイルとして
upload_2.osmファイルを作成します。 - これにより、upload.osmで削除される予定のノードを復活させます。
- JOSMで
upload_2.osmを開きます。 - フィルターで
type:node & untagged & -child(type:way)を有効にします(ウェイに接続されていない単独のノードのみが表示されます)。 - メインウィンドウで全選択し、ToDoリストに
+ボタンで追加します。 - フィルターの
type:node & untagged & -child(type:way)を解除します。 - ToDoリストからノードを1つずつ、置換したウェイ上の一番近くにあるノードに近づけます。
mキーを押すとそのノードにマージされます。- ToDoリストにあるノードをすべて移動先のノードにマージします。数が余って削除が必要なものはそのままノードを削除します。
- JOSMの「妥当性検査」を実行します。単独ノードが残っていたり、建物の重なりなどのエラーがあれば解決します。
- OSMにアップロードします。
以上の手順で、置換ウェイの既存ノードを引き継いで利用することができます。
ただ、ノードの数が数百を超えるとこの作業も大変なので、その場合は下記のように「まず新規のオブジェクトのみ追加、既存のオブジェクトを必要なだけ置換」しています。
既存の建物オブジェクトはそのままにして、新規の建物オブジェクトのみを追加する。
OSMの既存の建物オブジェクトが多くあり、それには手を付けずにOSMにない建物オブジェクトのみを追加したい時は下記のようにします。
実施個所:「.mrg.osmの編集」
作業手順:
***.mrg.osmをJOSMで開きます。"MLIT_PLATEAU:fixme"=*のフィルタを有効化し、かつ反転フィルターをONにします(フィルタの"I"の欄にチェックを入れる)。- メインウインドウでオブジェクトを全選択します。
- この状態で先の
"MLIT_PLATEAU:fixme"=*フィルターを解除します。 - 「すべての接続されたウェイを選択 (Crtl+Shift+E)」で、接続するすべてのウェイを選択します。
- 選択したオブジェクトを全削除します。(これで既存オブジェクトはアップロードプロセスで更新されずにそのまま残ります)
- レイヤーで
***.mrg.osmデータレイヤーの下の「OpenStreetMap Carto (Standard)」レイヤーを有効化し、OSMに描画されている建物に重なっているウェイがあればそれも削除します。(実際には建物オブジェクトが重なっているのに、位置ずれなどで"MLIT_PLATEAU:fixme"=*がつかないオブジェクトがあるので、目視でそれを確認・削除します。) - 「チェックしたファイルを名前をつけて保存」の手順に進み、以後はアップロード用ファイルへの変換、アップロードと進めます。
新規の建物オブジェクトをOSMにアップロードした後、既存の建物オブジェクトを更新したい場合
OSMの既存の建物オブジェクトを一部でも手動でPlateauオブジェクトに変換したい場合または、Plateauのタグ(heightなど)をOSMに追加したい場合は下記の手順で行います。
実施個所:新規の建物オブジェクトをOSMにアップロードした後
作業手順:
- まず、
***_op.osmでは建物のIDがref:MLIT_PLATEAU=***となっているので、それをsource=MLIT_PLATEAU ***に変換するために4thスクリプトをかけます。***_op.osmをchecked.osmにリネームします。java -Dfile.encoding=utf-8 -jar citygml-osm-jar-with-dependencies.jar 4thスクリプトで、upload.osmに変換します。- 間違えてアップロードしないように
plateau.osmなどに念のためにリネームします。
- JOSMで
plateau.osmを開きます。 - JOSMの「データをダウンロード」を選択します。
- 「ダウンロード」ウインドウで「Overpass APIからダウンロード」のタブを選択します。(「Overpass APIからダウンロード」のタブは「上級者モード」でのみ表示されます。F12キーでの設定ウインドウで「上級者モード」にチェック、または「表示」→「上級者モード」を選ぶことで設定できます。)
- 下記のOverpassクエリを入力して、ダウンロード範囲はおおむね
plateau.osmの範囲を選択し、「新しいレイヤーとしてダウンロード」を選択します。
[out:xml][timeout:90][bbox:{{bbox}}];
(
wr[building]["source"!~"^MLIT"];
);
(._;>;);
out meta;
これで新規レイヤーに元々OSMにあった建物オブジェクトのみがダウンロードされます。
- 既存オブジェクトとPlateauオブジェクトの形状が大きく異なるなど、Plateauオブジェクトに置き換えたい建物を見つけます。
plateau.osmレイヤーでオブジェクトをコピーし、ダウンロードしたレイヤーに「元の位置に貼り付け (Crtl+V)」」で貼り付けます。- 置換したい2つのウェイを選択し、「他のツール」→「座標を置換 (Ctrl+Shift+G)」を選択すると、ウェイやノードの履歴を保持したまま、新しい形状に置換します。
- これを置き換えたいオブジェクトの分だけ繰り返します。
- オブジェクトの置き換えはせずにタグの内容のみをコピペしたい場合は、コピーしたいオブジェクトの必要なタグを「タグ」ウインドウで選択し、右クリックメニューから「選択した〇キー/値をコピー」し、次にペースト先のオブジェクトを選択し、「編集」→「貼り付け (Ctrl+V)」でペーストします。
- 置き換えが終わったら、データのある範囲内のすべてのオブジェクトを上書きでダウンロードします(通常の「OSMからダウンロード」)。
- JOSMの「妥当性検査」を実行します。
- 「建物の重なり」のエラーがあればそれを解消します。
- 最後にデータをアップロードして更新します。