LoginSignup
5
1

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-12-15

はじめに

この記事は OpenStreetMap Advent Calendar 2018 の 15日目の記事です。

こんにちは、AROW というプロジェクトの開発チームの広井です。
AROW では 3Dリアルマップの研究開発を行っていて、没入感のある新しいゲーム体験の実現を目指すために現在開発中です。

その中で地図データをグリッド状に分割した話を書いていきます。

前置き

地図データをグリッド状に分割とは、以下のイメージのようなことを指します。

grid_1.png

このようにデータを分割することで、例えばゲームでプレイヤーの周辺の地図データをダウンロードさせたい場合、データごとの重複がなく効率的にダウンロードすることができます。

方法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つずつのグリッドに分割」に変更するという工夫をしました。

イメージは以下です。

image.png

スクリプトは以下のリポジトリに上げています。使ったままのスクリプトで拡張性はないですが、実装の参考程度にお願いいたします。
https://github.com/junjanjon/osm-map-grid-separator

現在、このスクリプトを改造し並列して実行することで、大体半日という現実的な時間で日本全体の地図データをグリッド状に分割することができるようになりました。

おわりに

OSMはいろいろなソフトウェアとの連携がされており、またwikiも日々更新されており、「エコシステム」?というのでしょうか、貢献している方たちの相互作用を感じることが多いです。

OSMを利用する開発者の1人として、OSMのコミュニティに貢献していきたいなと希望しています。

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1