Edited at

osmium-tool を使って日本全体の地図データをグリッド状に分割した話


はじめに

この記事は 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のコミュニティに貢献していきたいなと希望しています。