はじめに
この記事は OpenStreetMap Advent Calendar 2018 の 15日目の記事です。
こんにちは、AROW というプロジェクトの開発チームの広井です。
AROW では 3Dリアルマップの研究開発を行っていて、没入感のある新しいゲーム体験の実現を目指すために現在開発中です。
その中で地図データをグリッド状に分割した話を書いていきます。
前置き
地図データをグリッド状に分割とは、以下のイメージのようなことを指します。
このようにデータを分割することで、例えばゲームでプレイヤーの周辺の地図データをダウンロードさせたい場合、データごとの重複がなく効率的にダウンロードすることができます。
方法1. Overpass API の利用
グリッド状に分割しようと考えたとき、まず利用しようとしたのは Overpass API でした。
これは、Web上のOSM地図データの中から個別に選択された部分を取り出すものです。
矩形領域のダウンロードをするようなマップクエリを用意し、APIを叩くことで、1グリッド分をダウンロードすることができます。
これを必要なグリッドの数だけ繰り返すと目的は達成されます。
問題点
ですが、この方法だと1グリッドずつAPIを叩くので、グリッドの数が多いと問題になってきます。
Overpass API の記事に以下の記述があります。
1日あたり10,000クエリまたは5GBのデータ取得より少なければ、他のユーザーを邪魔しないと考えてよいでしょう。
今回自分が必要だったのは「日本全体を n [km] 四方のグリッドに分割する」であり、期待するグリッド数が数万〜数十万という数でした。
データ更新のことを考えると、Overpass API以外の方法を検討する必要がありました。
方法2. osmium-tool の利用
2つ目に上げるのが、タイトルにも挙げている osmium-tool を利用する方法です。
これは、ローカルにあるOSM地図データに対していろいろな操作ができるコマンドラインツールです。
osmium extract --bbox 〜
のコマンドでは矩形領域の切り出しが可能です。
地図データは http://download.geofabrik.de/index.html でダウンロードできます。
これを必要なグリッドの数だけ繰り返すと目的は達成されます。
問題点
ですが、これも一筋縄ではいかず、単純に処理時間が長いという問題がありました。
例えば一番最初は以下のコマンドを実行していました。
$ osmium extract --bbox 切り出したい矩形 -o grid_1.osm.pbf japan-latest.osm.pbf
これは、日本全体の地図データ(japan-latest.osm.pbf, 1.2[GB])から1つのグリッド(grid_1.osm.pbf)を取り出すコマンドです。
日本全体の地図データを使っているので処理時間が長いのは当然です。1回の実行に数分かかっていました。
工夫
「日本全体の地図データ -> 1つずつのグリッドに分割」だったので、
「日本全体の地図データ -> ある程度小さいグリッドに分割 -> 1つずつのグリッドに分割」に変更するという工夫をしました。
イメージは以下です。
スクリプトは以下のリポジトリに上げています。使ったままのスクリプトで拡張性はないですが、実装の参考程度にお願いいたします。
https://github.com/junjanjon/osm-map-grid-separator
現在、このスクリプトを改造し並列して実行することで、大体半日という現実的な時間で日本全体の地図データをグリッド状に分割することができるようになりました。
おわりに
OSMはいろいろなソフトウェアとの連携がされており、またwikiも日々更新されており、「エコシステム」?というのでしょうか、貢献している方たちの相互作用を感じることが多いです。
OSMを利用する開発者の1人として、OSMのコミュニティに貢献していきたいなと希望しています。