OpenMapTilesによるmbtilesの作成

今回は、OpenMapTilesを使ってmbtilesを作成したいと思います。

OpenMapTilesとは

OpenMapTilesとは、GeoFabrik社が提供するOpenStreertMapのpbf形式ベクトルデータをmbtiles形式に変換するツール群で、GitHubにて公開されているOSS(3条項BSDライセンス)です。

mbtilesについては、以下の記事でも触れています。

仕組みは以下のようなイメージです。

OpenMapTilesによるmbtiles変換のイメージ
  1. GeoFabrik社のダウンロードサイトからOSMデータ(pbf形式)をダウンロード
  2. OpenMapTilesのDockerイメージによりPostGISへロード(正確には、NaturalEarth、WikiPediaのデータも使用します)
  3. mbtiles形式ファイルを出力

OpenMapTilesを使った変換作業

検証環境と事前準備

今回検証した環境はさくらインターネットVPS上のLinuxで、仕様は以下となります。

  • OS:CentOS Linux release 8.1.1911 (Core)
  • CPU:2Core
  • メモリ:1GB
  • HDD:100GB(SSD)

以下に必要プロダクトと使用したバージョンなどを示します。

  • Docker(18.03.1-ce)
  • Dcoker-comnpose(version 1.25.5, build 8a1c60f6)
  • bc(計算機、yumにて導入)
  • TileserverGL(配信用、今回はDockerイメージを使用)

参考URLは以下となります。

作業手順

基本的には、OpenMapTilesのREADMEのBuild項に示された手順になります。

OpenMapTilesのREADME.mdより

では、順番に実施しましょう。

1.任意のディレクトリ上でopenmaptilesのクローンを取得

$ git clone https://github.com/openmaptiles/openmaptiles.git

treeコマンドで取得したファイルを確認してみます。

$ tree openmaptiles/
openmaptiles/
|– BENCHMARKING.md
|– CONTRIBUTING.md
|– LICENSE.md
|– Makefile
|– QUICKSTART.md
|– README.md
|– UPDATE.md
|– docker-compose-MINGW64.yml
|– docker-compose.yml
|– layers レイヤディレクトリの下にスキーマ定義画像やsql、yamlファイルが収容されています。
|   |– aerodrome_label
|   |– aeroway
|   |– boundary
|   |– building
|   |– housenumber
|   |– landcover
|   |– landuse
|   |– mountain_peak
|   |– park
|   |– place
|   |– poi
|   |– transportation
|   |– transportation_name
|   |– water
|   |– water_name
|    — waterway
|– openmaptiles.yaml
|– qa
|   |– layer_freq.sh
|   |– layer_numvar_analyze.sh
|   |– layer_toplength.sh
|   |– run.sh
|    — table_sizes.py
— quickstart.sh
18 directories, 142 files

2.ビルドの実施
GitHub上の手順通りビルド(make)を実行します。

$ cd openmaptiles
$ make
docker-compose run –rm –user=1000:1000 openmaptiles-tools generate-tm2source openmaptiles.yaml –host=”postgres” –port=5432 –database=”openmaptiles” –user=”openmaptiles” –password=”openmaptiles” > build/openmaptiles.tm2source/data.yml
Pulling openmaptiles-tools (openmaptiles/openmaptiles-tools:5.2)…
docker-compose run –rm –user=1000:1000 openmaptiles-tools generate-imposm3 openmaptiles.yaml > build/mapping.yaml
docker-compose run –rm –user=1000:1000 openmaptiles-tools bash -c \
‘generate-sql openmaptiles.yaml –dir ./build/sql \
&& generate-sqltomvt openmaptiles.yaml \
–key –gzip –postgis-ver 3.0.1 \
–function –fname=getmvt >> ./build/sql/run_last.sql’
Created 14 sql files for parallel execution at build/sql

PostgreSQL(PostGIS)データベースを作成したり、Dockerイメージ(openmaptiles-tools)を取得したりしています。
取得したDockerイメージを確認してみます。

$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
openmaptiles/openmaptiles-tools 5.2 5f66a6682504 4 months ago 752MB

3.タイルデータの作成
以下のコマンドにより、タイルデータを作成します。

$ ./quickstart.sh

上記のように引数に何も指定しないと、アルバニアの地図タイルが作成されます。(なぜ、アルバニアなのかは不明)
どうやらアルバニアの地図データは、事前にPostGIS(postgis-preloaded)上に読み込まれているらしく、osm.pbfのダウンロードはするのですが、PostGISに読み込んでいないようです。タイル作成は15分程度で終了しました。

Dockerイメージの状態を確認すると、3つ追加されています。

$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
openmaptiles/postgis-preloaded 5.2 79f59e3f8967 4 months ago 2.04GB
openmaptiles/postgis 5.2 985d6417de5e 4 months ago 458MB
openmaptiles/generate-vectortiles 5.2 d9f988ac9ced 4 months ago 824MB
openmaptiles/openmaptiles-tools 5.2 5f66a6682504 4 months ago 752MB

Dockerコンテナの状態を確認してみると、終了済みのコンテナ(postgis-preloaded)が1つあります。

$ docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
71a4c4829ff1 openmaptiles/postgis-preloaded:5.2 “docker-entrypoint.s…” 9 hours ago Exited (0) 9 hours ago openmaptiles_postgres_1


postgis-preloadedは、サイズも大きいので、何らかの地図データ(おそらくNaturalEarthやアルバニアのosm.pbf)が事前にロードされたPostgresデータベースだと思われます。このあたりは、追々調査します。

4.タイルデータの配信
TileserverGL(Dockerイメージ)を使ってタイル配信します。Dockerコンテナのポート80番をホスト側ポートXXXXにマッピングしています。

$ docker run -d -it –name tile_alba -v ./openmaptiles/data/:/data -p XXXX:80 klokantech/tileserver-gl
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cd36c6220e6d klokantech/tileserver-gl “/bin/bash /usr/src/…” 3 seconds ago Up 1 second 0.0.0.0:XXXX->80/tcp tile_alba

5.配信結果の確認
ブラウザから”http://seerver_name:XXXX”といった形式でサーバーへアクセスすると、以下の画面(TileServerGLの初期画面)が表示されます。

2種類のスタイルと生データの表示ができます。
スタイル”Klokantech Basic”の”Viewer”をクリックすると、以下のような地図が表示されます。

表示されたアルバニアの地図


まとめ

ここまで、OpenMapTilesを使ったmbtilesの作成を実施しました。
簡単な手順でmbtilesが作成できますし、失敗することもまずありません。

ただし、広範囲の地図データの作成やズームレベル(デフォルト設定ではズームレベル7まで)を深くすると大変時間がかかります。
この辺りは、次回以降考察していきます。