OSM 3Dタグの基礎


OpenStreetMapで、建物の高さを入力する方法を解説します。

## 基本資料
OSM Wikiに詳細な解説があります。

[Simple_3D_Buildings](http://wiki.openstreetmap.org/wiki/Simple_3D_Buildings)のページを参照してください。
[日本語ページもあります](http://wiki.openstreetmap.org/wiki/JA:Simple_3D_Buildings)。

## 3Dレンダラ
入力した結果は、以下のページで表示を確認することができます。

* [OSM Buildings](http://osmbuildings.org/?lat=35.68996&lon=139.69497&zoom=17): 建物の高さ、建物の各部分の色がレンダリングされます。データ更新が早いので、確認用として最適です
* [F4 Maps](http://demo.f4map.com/#lat=35.6894509&lon=139.6954648&zoom=17): 多くの3Dタグを網羅しており、非常に綺麗にレンダリングされます。いったん画像が出来上がった後の更新がやや遅いようなので、気長に待ちましょう。(感覚ですが、1日くらいかかる感じです)

## 基本となるタグ
建物の各部分を、タグを使って表現します。

主に入力する項目は以下のとおりです。この6つのタグを、building=yesのエリアオブジェクトに対して適用します。

|内容|タグ|値|備考|
|---|---|---|---|
|建物の高さ|height|数字(メートル)|建物オブジェクト高さ。入れなくてもよい
|建物の階数|building:levels|数字(階数)|階数。heightタグの代わりにこちらが入っていればとりあえずOK。
|建物の外壁の色|building:color|[カラーコード](http://www.finitojapan.com/cltable.html)|
|屋根の高さ|roof:height|数字(メートル)|
|屋根の色|roof:color|[カラーコード](http://www.finitojapan.com/cltable.html)|
|屋根の形|[roof:shape](http://wiki.openstreetmap.org/wiki/Simple_3D_Buildings#Roof)|定義から選択|

### 実例
実際に値が入力されている場所を見てみましょう。

* [2階建ての建物](http://www.openstreetmap.org/way/121793532) 
![スクリーンショット 2014-04-20 21.28.38.png](https://qiita-image-store.s3.amazonaws.com/0/9928/ab16743d-2adb-e5f2-cc71-aefa60d48fb4.png "2階建ての建物")

* [同じ場所のOSM Buildings](http://osmbuildings.org/?lat=35.49807&lon=139.63265&zoom=19)
![スクリーンショット 2014-04-20 21.28.52.png](https://qiita-image-store.s3.amazonaws.com/0/9928/95ef20d9-faa6-560d-1ed7-1b4218b8809e.png "OSM Buildings")


ここでは、以下のタグが使用されています。
とりあえず、このくらいが最低限入っていれば大丈夫です

> heightは計測が大変なので、とりあえず building:levels があると、それなりに見栄えがします。

|Key|Value|意味|
|---|---|---|
|building|yes|これは建物です|
|building:color|#878F94|外壁の色は#878F94|
|building:levels|2|2階建て|
|roof:color|#6B6361|屋根の色は#6B6361|
|roof:shape|hipped|屋根の形は [hipped](http://wiki.openstreetmap.org/wiki/Simple_3D_Buildings#Roof)|

### JOSMでの入力と確認
まずは、表示確認用に[Kendzi3dプラグイン](http://wiki.openstreetmap.org/wiki/Kendzi3d)をインストールしましょう。
インストール方法は、通常のプラグインと同様です。

起動すると、3D表示が確認できる小窓が表示されます。

![スクリーンショット 2014-04-20 21.38.56.png](https://qiita-image-store.s3.amazonaws.com/0/9928/fd71480d-b648-5a23-6347-7d5ec087b540.png "kendzi3dの起動")

こんなかんじです。なんのことやらわかりませんね。
![スクリーンショット_2014-04-20_21_39_22_1.png](https://qiita-image-store.s3.amazonaws.com/0/9928/636aa680-4e09-d8d3-6855-459829eb3ac2.png "kendzi3D小窓")

それでは、小窓を選択した状態で、キーボードの矢印キーとマウスを使って表示を移動させましょう。

マウスをクリックしながら、まずは地面の方を向き、その後でキーボードの下キーを押し続けると、視点が空中に移動します。
詳しい操作については、[kendzi3dのwikiページ](http://wiki.openstreetmap.org/wiki/Kendzi3d)を参照してください。

![スクリーンショット 2014-04-20 21.51.55.png](https://qiita-image-store.s3.amazonaws.com/0/9928/77341b34-fce2-09d1-5222-203f1ddcbf6d.png "空中写真")

kendzi3dはあくまで結果確認用のビューアなので、とりあえず表示ができていればよいです。

この状態で、適当な建物に、heightタグを入れてみましょう。
アップロードしないことを考えたら、height=200とか、わかりやすい数字でも大丈夫です。

その建物の高さが伸びることがわかります。

![スクリーンショット 2014-04-20 21.56.02.png](https://qiita-image-store.s3.amazonaws.com/0/9928/9a024238-89fd-7f4b-d1da-3123bf1c79de.png "スクリーンショット 2014-04-20 21.56.02.png")

あとは、通常のJOSMでの編集と同じく、先ほどのタグを1つ1つ追加してゆきます。
ひたすら地味で、大変な作業です (^^;

### 建物の色の確認方法
building:colorの調査は、その建物の写真があれば簡単です。

Macであれば、アプリケーション -> ユーティリティ -> DigitalColor Meterというアプリが標準で装備されていて、写真のカラーコードを抽出してくれます。
この色を使います。なるべく明るく写っている写真がよいでしょう。

![スクリーンショット_2014-04-20_22_03_43.png](https://qiita-image-store.s3.amazonaws.com/0/9928/e787ccdf-1855-6e87-8aae-ef92a84c6988.png "スクリーンショット_2014-04-20_22_03_43.png")

roof:colorも、同様にして空中写真から色を抽出します。


### 建物の一部分だけ、階数が異なる場合
多くの方が悩む部分だと思います。

これは、 building:part = yes というタグを使います。

1. まずは、建物の外郭部分を、通常と同じように描きます。
![スクリーンショット 2014-04-20 22.13.13.png](https://qiita-image-store.s3.amazonaws.com/0/9928/dd82dcb6-f5e9-bfd6-e252-2d613380f730.png "建物の外郭部分")


2. その建物外郭オブジェクトとは別に、建物の中身を埋めるようにしてbuilding:partオブジェクトを作成し、そこに building:levelsなどのタグを付与します。

![スクリーンショット_2014-04-20_22_14_06.png](https://qiita-image-store.s3.amazonaws.com/0/9928/187d5df2-cccd-ba52-aa33-3f1bdb0f3af3.png "建物の一部をbuilding:partとして別途作成")

3. また、building:partタグと[building:min_levels](http://wiki.openstreetmap.org/wiki/Key:building:min_level)というタグを組み合わせることで、渡り廊下状の形を作成することもできます。
この建物は、3つの building:partから形成されています。

![building](http://wiki.openstreetmap.org/w/images/thumb/1/1f/Minlevel.svg/631px-Minlevel.svg.png)


こういう形状のマンションも、これで簡単に作成できますね。
![2014-04-11_10_32_15.jpg](https://qiita-image-store.s3.amazonaws.com/0/9928/5664b4a8-989d-00cc-ab74-8bd68a12a396.jpeg "2014-04-11_10_32_15.jpg")

### より詳しい描き方
[リレーションとして表す方法もあります](http://wiki.openstreetmap.org/wiki/Simple_3D_Buildings#Building_relation)。
この方法を使うと、建物の外壁の色を、面ごとに変える(この部分はガラス張りだけど、この部分はコンクリート、など)ことができます。

また、[屋根の傾き具合の調整](http://wiki.openstreetmap.org/wiki/JOSM/Plugins/Kendzi3D/tutorial/skillion_roof)や、["建物の3階と5階にだけ窓がある"](http://wiki.openstreetmap.org/wiki/JOSM/Plugins/Kendzi3D/tutorial/windows)などの記述も可能ですが、そこまでやるならテクスチャ貼ったほうがいいのじゃないかなぁ、と思うことはあります。

### 店舗が建物の中にある場合
建物の中に店舗が存在する場合、建物のエリアオブジェクトとは別に、ノードオブジェクトとして店舗のノードを置くことをお勧めします。

これはなぜかといえば、建物自体の name (たとえば"小池ビル"など)と、そのPOIの name がバッティングすることが多いためです。

また、そのPOIには [level](http://wiki.openstreetmap.org/wiki/Levels
)タグを付与しておくことをお勧めします。これによって、"3階建ての小池ビルの2階に、村田歯科医 (amenity=dentist)が入っている" ということがすっきりと表現できます。

POIに付与するための level タグは、1階に入居している場合の値が0(地階)、2階ならば1、という風に、日本での数え方と異なっているため、注意してください。