OSM タグベースのベクトルタイルスキーマ two-eleven の設計

[ハンズオン準備](https://qiita.com/hfu/items/6026eec6816465d7e7a9)の第７回です。

# 作業の位置付け
前回の作業で、地物にレイヤ名とズームレベルを割り当てられればベクトルタイル変換に持っていける形は確保しました。また、その割り当てを行う modify.js についても、初期的なものを書くところまで言っています。

今回のハンズオンでは、地球地図データと OpenStreetMap データをデータソースとして使います。

地球地図データについては、伝統的な設計のデータですので、ズームレベルの割り当ての最適化は別として、比較的素直に modify.js がかけました。

他方、OpenStreetMap データについては、このデータを PostGIS などのデータベースに一旦インポートしたデータはともかく、planet.osm.pbf を osmium-export で変換した素直なデータにレイヤ名とズームレベルを割り当てるのは初めての経験です。また、世の中でも、それほどはやられていない作業でしょう。

そこで、imposm の設定ファイルとして使われる mapping.yml　の先例などを参考としながら、OSM タグベースのベクトルタイルスキーマを作ってみました。作ったスキーマが実用になるか**テストはまだですが**、設計を明確にするために、このエントリに書き出してみます。

基本地図系と POI 系でそれぞれ 11 のタグに注目しているので、このベクトルタイルスキーマのコード名を two-eleven としました。

# 設計指針
1. ジオメトリ型を混ぜることを避ける傾向や、リレーションの規模を大きくしすぎないためにリレーションを分割する傾向に迎合することなく、OSM のタグオリエンテッドな設計をなるべく素直にベクトルタイルに写像することを狙う。
2. レイヤ名はタグ名と同一とする。
3. レイヤ名の順序は、複数タグを持つ地物について、どちらに落とすかであるとか、スタイル上の順序などをあらかじめ意識しながら決める。

# 設計内容
## 1. 基本地図系 11 タグ
基本地図系 11 タグの順序は、描画順が早く、よって地図の骨格を決めるレイヤからの順序となることを意識している。

### 1-1. landuse
landuse タグは人による土地の主な利用方法を記述するタグなのだそうです。ときに、landuse ポリゴンは水上にもかかる場合があります。基本地図の用途では、水部は水部で塗られてほしいので、水部でオーバーライドされることを狙って、landuse を最初にします。データ量もそこそこ多めになっていたはずです。

### 1-2. natural
natural タグは物理的な自然の地形の特徴（人間が手を加えたものも含む）を記述するときに使われるそうです。natural=water, natural=glacier, natural=wetland などで水部系の面も扱います。

### 1-3. boundary
主に政治的な（その他も含む）管理領域の境界線をマークするタグだそうです。

### 1-4. waterway
河川、小川、ボート基地などを表すタグだそうです。

### 1-5. highway
あらゆる種類の道路、通り、小道などのためのタグだそうです。

### 1-6. building
建物の領域をマークするためのタグだそうです。

### 1-7. railway
全ての種類の鉄道、鉄道インフラ、線路を利用した交通機関のためのタグだそうです。

### 1-8. route
あらゆる種類の非物理的なルートのためのタグだそうです。基本地図の観点からは route=ferry すなわちフェリールートが狙いですが、地上の路線系もこれで扱っているようです。このタグを殺さずに基本地図に埋め込んでおくことで、地上の路線系についてもなんらかメリットがあるかもしれません。やってみましょう。

### 1-9. aeroway
航空機の運用や航空旅客に関する施設のためのタグだそうです。

### 1-10. place
ある特定の名称で呼ばれている地域や区画を示し、その土地がどのような種類であるか表すタグだそうです。いわゆる、地名系がこのタグで担われていると理解しています。

### 1-11. leisure
人々が余暇を過ごす場所のためのタグだそうです。

## 2. POI 系 11 タグ
POI 系 11 タグの順序は、実際には大半を支配しているように見える amenitiy のみ特例的に最初とし、残る 10 タグについては、描画順が早い順になることを意識しながら決めている。modify.js ではこの順序に swtich させてレイヤ名を割り当てていきつつ、style.js では、amenity 以外のものをまず描画して、最後に amenity を描画するようなことを意識している。

### 2-1. amenity
来訪者や住民にとって便利で重要な施設を記述するタグだそうです。実際には、いわゆる POI の多くがこのタグを使っているように見受けられます。よって、よりマイナーな 2-2 以降に地物が落ちることを避け、なるべくこのレイヤで多くのデータを拾うために、このタグに 2-1 を割り当てることにしました。

描画の際には、amenity が最後尾すなわち最上位になるようにするのではないだろうかと思います。

2-2 以降は、描画順が先つまり描画の最下位になるべきものと考えられるものを先にしています。

### 2-2. historic
歴史的な場所や建物、すなわち史跡を表すためのタグだそうです。

### 2-3. military
軍によって使用されている建物や土地を表すためのタグだそうです。

### 2-4. man_made
人造の構造物を識別するためのタグだそうです。

### 2-5. power
電力の発電と送電に関する設備を記録しタグ付けするために使うタグだそうです。

### 2-6. sport
特定のスポーツを分類するためのタグだそうです。物理的なタグではないので、物理的なタグ、例えば club, leisure, natural, landuse, tourism, amenity と組み合わせるそうですが、このうち club は two-eleven には採録していないので、これを拾う目的でこのタグを入れてみています。

（参考） 類似のタグに religion タグがありましたが、こちらについてはおそらく他のレイヤで拾いきると思われるので、two-eleven には採録していません。

### 2-7. office
主にサービスを販売する場所のためのタグだそうです。

### 2-8. craft
注文にあわせて物を作ったり処理したりするところのためタグだそうです。

### 2-9. public_transport
公共交通の停車場やプラットフォームのためのタグだそうです。停車場は街路上のノード、プラットフォームは街路の隣なのだそうです。

### 2-10. tourism
旅行者が特に関心を持つ場所や物事のためのタグなのだそうです。

### 2-11. shop
製品やサービスを販売している場所のためのタグなのだそうです。

## 一覧図
一覧図を作ってみると、次のような感じです。
<img width="559" alt="スクリーンショット 2018-11-17 15.31.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/102082/4386b139-435f-5553-eb4f-3c4d5026b6cd.png">

# 点線面が混ざって大丈夫か
Mapbox Style レベルでの同名 style に点線面が混ざっている場合の描きわけについて、次の通りに考えています。

点と面が混ざっている分には、描画上も問題が起こりにくかったと記憶しています。

線と面が混ざる場合が厄介で、線を面と解釈して塗りをやってしまうと、かなり目立つ描画エラーになることがよく知られています。

レイヤ個別の知識や、[area](https://wiki.openstreetmap.org/wiki/JA:Key:area)=yes の有無が活用できることを期待しています。

# おことわり
この記事の内容は、最新の実装と乖離する可能性があります。最新の実装は、実装を確認してください。