OpenMapTiles で地図のベクタータイルを作成する

OpenMapTilesはOpenStreetMapやその他オープンソースデータをベースにして、地図をベクタータイル形式で配信するためのプロジェクトです。OpenMapTileには様々なコンポーネントが含まれていますが、タイルの作成と配信を手っ取り早く体験できる方法が用意されており、ここではそれを試してみます。
GitHubのQUICKSTART.mdに手順があるので、それを参考に実行します。

全体の流れ

実行するコマンドはたったこれだけです。タイルの作成から配信準備まで、quickstart.shがまとめて行なってくれます。あとはpostserveやtileserverで動作確認をするという流れです。

$ git clone https://github.com/openmaptiles/openmaptiles.git
$ cd openmaptiles
$ ./quickstart.sh
$ docker-compose start postgres
$ docker-compose up -d postserve
$ make start-tileserver

リポジトリを clone

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

quickstart.sh を実行

$ cd openmaptiles
$ ./quickstart.sh

実行中、以下のエラーが出ることがありますが、COMPOSE_HTTP_TIMEOUTの値を大きくすることで解消できます。デフォルトで60秒となっているため、それより大きな適当な値を設定します。.envファイルに追記するのが手っ取り早いです。

ERROR: for openmaptiles_postgres_1  UnixHTTPConnectionPool(host='localhost', port=None): Read timed out. (read timeout=60)

ERROR: for postgres  UnixHTTPConnectionPool(host='localhost', port=None): Read timed out. (read timeout=60)
An HTTP request took too long to complete. Retry with --verbose to obtain debug information.
If you encounter this issue regularly because of slow network conditions, consider setting COMPOSE_HTTP_TIMEOUT to a higher value (current value: 60).
make: *** [Makefile:120: start-db-nowait] エラー 1

.env

# This file defines default environment variables for all images

# Use 3-part patch version to ignore patch updates, e.g. 5.0.0
TOOLS_VERSION=5.0

# Make sure these values are in sync with the ones in .env-postgres file
PGDATABASE=openmaptiles
PGUSER=openmaptiles
PGPASSWORD=openmaptiles
PGHOST=postgres
PGPORT=5432

QUICKSTART_MIN_ZOOM=0
QUICKSTART_MAX_ZOOM=7
DIFF_MODE=false

BBOX=-180.0,-85.0511,180.0,85.0511
MIN_ZOOM=0
MAX_ZOOM=14

COMPOSE_HTTP_TIMEOUT=600

PostgreSQL を起動

quickstart.shの最後の方でpostgresがstopされてしまっているので、手動で再度startします。

$ docker-compose ps
         Name                        Command              State    Ports
------------------------------------------------------------------------
openmaptiles_postgres_1   docker-entrypoint.sh postgres   Exit 0        
$ docker-compose start postgres
Starting postgres ... done
$ docker-compose ps
          Name                        Command               State            Ports         
-------------------------------------------------------------------------------------------
openmaptiles_postgres_1    docker-entrypoint.sh postgres    Up      0.0.0.0:32769->5432/tcp

postserve で動作確認

$ docker-compose up -d postserve
Starting openmaptiles_postserve_1 ... done
$ docker-compose ps
          Name                        Command               State            Ports         
-------------------------------------------------------------------------------------------
openmaptiles_postgres_1    docker-entrypoint.sh postgres    Up      0.0.0.0:32769->5432/tcp
openmaptiles_postserve_1   postserve openmaptiles.yam ...   Up      0.0.0.0:8090->8090/tcp 

動作確認のためにウェブブラウザからlocalhost:8090/tiles/0/0/0.pbfにアクセスします。大抵は以下のようなファイル保存ダイアログが出る形になります。アクセスできれば成功です。

TileServer GL で動作確認

$ make start-tileserver
 
***********************************************************
* 
* Download/refresh maptiler/tileserver-gl docker image
* see documentation: https://github.com/maptiler/tileserver-gl
* 
***********************************************************
 
docker pull maptiler/tileserver-gl
Using default tag: latest
latest: Pulling from maptiler/tileserver-gl

~中略~

Digest: sha256:ecc0a61d53408b3330ac00e0160a88e27bbe2cfb4d99508adc02b903bda43c48
Status: Downloaded newer image for maptiler/tileserver-gl:latest
docker.io/maptiler/tileserver-gl:latest

***********************************************************
* 
* Start maptiler/tileserver-gl 
*       ----------------------------> check http://localhost:8080 
* 
***********************************************************
 
docker run --rm -u 1000:1000 -it --name tileserver-gl -v $(pwd)/data:/data -p 8080:8080 maptiler/tileserver-gl --port 8080
Starting Xvfb on display 99
xdpyinfo:  unable to open display ":99".

Starting tileserver-gl v3.0.0
No MBTiles specified, using tiles.mbtiles
[INFO] Automatically creating config file for tiles.mbtiles
[INFO] Only a basic preview style will be used.
[INFO] See documentation to learn how to create config.json file.
Run with --verbose to see the config file here.
Starting server
Listening at http://[::]:8080/
Startup complete

ウェブブラウザでlocalhost:8080にアクセスするとTileServer GLのトップページが開き、Viewerボタンから地図を表示できます。地図をズームイン、ズームアウト、移動すると、上記のコマンドラインにログが出力されていきます。

仕組み

OpenMapTiles の Docker イメージ

Docker Hubのopenmaptilesでは、現在14のDockerイメージが配布されています。GitHubの記載によると、いくつかのイメージは既にレガシーで非推奨のようです。

openmaptiles 提供の Docker イメージ説明注意
postgis-preloadedいくつかのOpenMapTilesデータが事前読み込みされたPostgreSQL。
import-dataOpenMapTiles関連データをPostgreSQLにインポートする。
postgisGEOS 3.5とPostGIS 2.2をサポートしたPostgreSQLのDockerイメージ。
generate-vectortilesMBTilesを生成する。
openmaptiles-toolsOpenMapTiles生成ツール。
import-osmOpenStreetMapをPostGISにインポートする(imposm3を利用)。
import-water水域をOpenStreetMapからPostGISにインポートする。レガシーイメージのため非推奨。
代替:import-data
import-natural-earthNaturalEarthデータをPostGISにインポートする(ogr2ogrを利用)。レガシーイメージのため非推奨。
代替:import-data
import-lakelinesOpenStreetMapの湖のラベル付けをするための中央線をPostGISにインポートする。レガシーイメージのため非推奨。
代替:import-data
import-osmborderOpenStreetMapの境界をPostGISにインポートする。レガシーイメージのため非推奨。
代替:openmaptiles-tools の import-osmborder
generate-osmborderOpenStreetMapの境界を生成する。レガシーイメージのため非推奨。
代替:openmaptiles-tools の import-osmborder
import-wikidatawikiデータをインポートする。レガシーイメージのため非推奨。
代替:openmaptiles-tools の import-wikidata
import-sql旧式のイメージなので、代わりにopenmaptiles-toolsを使うこと。レガシーイメージのため非推奨。
代替:openmaptiles-tools の import-sql
postserveST_AsMVTを使用してOpenGISTilesベクタータイルをPostGISから直接レンダリングする。openmaptiles-toolsにマージされたため、アップデートや新バージョンはそちらを参照すること。

上記の内いくつかのイメージについては前述のGitHub – openmaptiles / openmaptilesのdocker-compose.ymlでサービス定義がされてquickstart.shから利用されています。

Docker イメージdocker-compose.yml での service 名
postgispostgres
import-dataimport-data
openmaptiles-toolsopenmaptiles-tools
postserve
generate-vectortilesgenerate-vectortiles
generate-changed-vectortiles

quickstart.sh がやっていること

quickstart.shは主にmakeコマンドを実行しており、Makefileでは主にdocker-composeコマンドを呼び出すよう定義しています。
quickstart.shが呼び出しているmakeコマンドを上から順に並べ、実際に実行しているdocker-composeコマンドとDockerイメージをまとめると以下のようになります。実際にはもっと様々な処理が行われていますが、docker-composeに焦点を当てると概ねこのような感じです。openmaptiles-toolsイメージが機能の多くを占めており、run時の引数から伺えるように種々の動作を行っているようです。Docker Hubのページには使い方等詳細が掲載されています。

makedocker-compose コマンド(オプション等詳細は割愛)Docker イメージ引数の特徴的な部分
refresh-docker-imagespullopenmaptiles-tools
generate-vectortiles
postgres
destroy-dbdown
rm
init-dirs
download-geofabrik “area=${osm_area}”runopenmaptiles-toolsdownload-osm
clean
allrunopenmaptiles-toolsgenerate-tm2source
generate-imposm3
generate-sql
start-db-preloaded
または
start-db
import-data
up
run
run
postgres
openmaptiles-tools
import-data
import-osm “PBF_FILE=${pbf_file}”runopenmaptiles-toolsimport-osm
import-bordersrunopenmaptiles-toolsimport-borders
import-wikidatarunopenmaptiles-toolsimport-wikidata
import-sqlrunopenmaptiles-toolsimport-sql
analyze-dbrunopenmaptiles-toolspsql.sh
test-perf-nullrunopenmaptiles-toolstest-perf
generate-tilesrungenerate-vectortiles
openmaptiles-tools

generate-metadata
stop-dbstoppostgres
help

また、quickstart.shとmakeについてはmake helpで使い方を見ることができます。

$ make help
==============================================================================
 OpenMapTiles  https://github.com/openmaptiles/openmaptiles 
Hints for testing areas                
  make list-geofabrik                  # list actual geofabrik OSM extracts for download -> <<your-area>> 
  ./quickstart.sh <<your-area>>        # example:  ./quickstart.sh madagascar 
 
Hints for designers:
  make start-maputnik                  # start Maputnik Editor + dynamic tile server [ see http://localhost:8088 ]
  make start-postserve                 # start dynamic tile server                   [ see http://localhost:8090 ]
  make start-tileserver                # start maptiler/tileserver-gl                [ see http://localhost:8080 ]
 
Hints for developers:
  make                                 # build source code
  make list-geofabrik                  # list actual geofabrik OSM extracts for download
  make download-geofabrik area=albania # download OSM data from geofabrik,        and create config file
  make download-osmfr area=asia/qatar  # download OSM data from openstreetmap.fr, and create config file
  make download-bbike area=Amsterdam   # download OSM data from bbike.org,        and create config file
  make psql                            # start PostgreSQL console
  make psql-list-tables                # list all PostgreSQL tables
  make vacuum-db                       # PostgreSQL: VACUUM ANALYZE
  make analyze-db                      # PostgreSQL: ANALYZE
  make generate-qareports              # generate reports                                [./build/qareports]
  make generate-devdoc                 # generate devdoc including graphs for all layers [./layers/...]
  make bash                            # start openmaptiles-tools /bin/bash terminal
  make destroy-db                      # remove docker containers and PostgreSQL data volume
  make start-db                        # start PostgreSQL, creating it if it doesn't exist
  make start-db-preloaded              # start PostgreSQL, creating data-prepopulated one if it doesn't exist
  make stop-db                         # stop PostgreSQL database without destroying the data
  make clean-unnecessary-docker        # clean unnecessary docker image(s) and container(s)
  make refresh-docker-images           # refresh openmaptiles docker images from Docker HUB
  make remove-docker-images            # remove openmaptiles docker images
  make pgclimb-list-views              # list PostgreSQL public schema views
  make pgclimb-list-tables             # list PostgreSQL public schema tables
  cat  .env                            # list PG database and MIN_ZOOM and MAX_ZOOM information
  cat  quickstart.log                  # transcript of the last ./quickstart.sh run
  make help                            # help about available commands
==============================================================================

コメントを残す