OpenMapTilesによるmbtilesの作成
今回は、OpenMapTilesを使ってmbtilesを作成したいと思います。
OpenMapTilesとは
OpenMapTilesとは、GeoFabrik社が提供するOpenStreertMapのpbf形式ベクトルデータをmbtiles形式に変換するツール群で、GitHubにて公開されているOSS(3条項BSDライセンス)です。
mbtilesについては、以下の記事でも触れています。
仕組みは以下のようなイメージです。
- GeoFabrik社のダウンロードサイトからOSMデータ(pbf形式)をダウンロード
- OpenMapTilesのDockerイメージによりPostGISへロード(正確には、NaturalEarth、WikiPediaのデータも使用します)
- 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項に示された手順になります。
では、順番に実施しましょう。
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まで)を深くすると大変時間がかかります。
この辺りは、次回以降考察していきます。
今回の検証では、さくらインターネットのVPS(バーチャルプライベートサーバー)を使用しました。
月額880円(CPU2コア、メモリ1GB、SSD100GB、石狩データセンター)のプランです。
2年使っていますが、Docker上でTileServerやPostGISなどは問題なく動作しており、サービスの品質には大変満足しています。
欲をいえばメモリがもう少しほしいなと思いますが、2GBにすると価格が2倍となるので見送っています。。