postgis-preloadedコンテナ
今回は、OpenMapTilesで使用されているDockerコンテナの一つpostgis-preloadedの内容を確認します。
Dockerイメージとコンテナの確認
OpenMapTilesで、アルバニアのmbtilesを作成すると下記4つのDockerイメージがダウンロードされます。
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
mbtiles作成後は、postgis-preloadedコンテナ(以降、preloadコンテナ)が残っていますので、mbtiles作成中に使用されていたものと思われます。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d4fa49ef364a openmaptiles/postgis-preloaded:5.2 "docker-entrypoint.s…" 23 hours ago Up 23 hours 0.0.0.0:XXX->5432/tcp openmaptiles_postgres_1
openmaptiles-toolsのGitHubのページを確認すると、以下のように各コンテナの説明があります。

import-dataコンテナにてインポートされるデータ(Natural Earth、water polygons、lake centerlines)を事前にロードしたもので、主にテスト用、ユーザー・パスワードは固定といったことが書いてあります。
今回は、このpreloadコンテナについて確認します。
postgis-preloadedコンテナとは
preloadコンテナは、OpenMapTilesのタイル作成時間を短縮するために、一部のデータを事前にPostGISデータベースに格納したコンテナです。
preloadコンテナの特徴を以下に示します。
- コンテナの内容は、PsotgreSQL(PostGIS)のデータベース
- mbtilesの作成時間を短縮することが目的
- NaturlEarthやアルバニアのOSMデータ、OSM派生データ(水系ポリゴンと湖中心線)を収容
図にすると以下のようになります。

preloadコンテナに収容されるデータは、アルバニアのosm.pbfとNaturalEarthのシェープファイルから構成されます。
NatralEarthは、”The Map Update Committee”により提供される著作権が放棄された世界地図データです。以下に特徴を示します。
- 提供データ形式はシェプファイル
- 3種類の縮尺のデータを提供(1千万分の1(ne_10m)、5千万分の1(ne_50m)、1億1千万分の1(ne_110m))
- EPSG4326(世界測地系緯度経度)で提供
NaturalEarthのダウンロードページを以下に示します。

ダウンロードできるデータは、海岸線などの物理的なデータ(Physical)、国境線や海里線などの物理的でないデータ(Cultual)、画像データ(Raster)の3種類です。各データの種類(レイヤ)は、こちらに記載されています。
preloadコンテナの内容確認
では、preloadコンテナの内容を確認しましょう。
1.preloadコンテナの削除
以下のように作成済みのpreloadコンテナを削除します。
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
af396cbf0309 openmaptiles/postgis-preloaded:5.2 "docker-entrypoint.s…" 16 minutes ago Up 16 minutes 0.0.0.0:5432->5432/tcp openmaptiles_postgres_1
$ docker container stop openmaptiles_postgres_1
openmaptiles_postgres_1
$ docker container rm openmaptiles_postgres_1
openmaptiles_postgres_1
2.docker-compose.ymlファイルの編集
preloadコンテナ上のPostGISにデフォルトポート(5432)以外を使ってアクセスしたい場合は、openmaptiles直下にある上記ファイルを編集し、ホスト側のポート番号を指定します。

3.preloadコンテナの起動
makeコマンドを使ってpreloadコンテナを起動します。
$ make start-db-preloaded
Starting postgres docker compose target using openmaptiles/postgis-preloaded image (no recreate if exists)
Creating openmaptiles_postgres_1 … done
Wait for PostgreSQL to start…
docker-compose run --rm --user=1000:1000 openmaptiles-tools pgwait
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
807c01a9566c openmaptiles/postgis-preloaded:5.2 "docker-entrypoint.s…" 12 seconds ago Up 11 seconds 0.0.0.0:XXXX->5432/tcp openmaptiles_postgres_1
4.preloadコンテナへのアクセス
以下のようにpreloadコンテナ上のbashからpsqlを起動してテーブル一覧を表示します。
$ docker exec -it openmaptiles_postgres_1 bash
postgres@807c01a9566c:/$ psql -U openmaptiles
psql (9.6.18)
Type "help" for help.
openmaptiles=# \dt
List of relations
Schema | Name | Type | Owner
ーーーーー+ーーーーーーーーーーーーーーー+ーーーー+ーーーーーーー
public | country_languages | table | openmaptiles
public | country_osm_grid | table | openmaptiles
public | lake_centerline | table | openmaptiles
public | ne_10m_admin_0_bg_buffer | table | openmaptiles
5.psqlによるテーブルごとのデータ件数の確認
以下のSQLを発行し、テーブルごとのレコード件数を確認します。一覧は後述します。
openmaptiles=# select relname, n_live_tup from pg_stat_user_tables where schemanaame='public';
relname | n_live_tup
ーーーーーーーーーーーーーーーーーーーー+ーーーーーー
spatial_ref_sys | 8500
country_osm_grid | 23219
country_languages | 249
ne_10m_admin_0_boundary_lines_land | 462
ne_10m_admin_0_countries | 255
ne_10m_admin_1_states_provinces | 4594
6.pgAdminからのアクセス
PostgreSQLのGUIツールpgAdminからもpreloadコンテナ上のPostGISへアクセスできます。

preloadコンテナに収容されるデータ
データ内容を確認したところ、153テーブルが存在し135テーブルにデータが存在しました。(18テーブルはレコード0件)
テーブル名 | レコード件数 |
---|---|
country_languages | 249 |
wd_names | 553 |
ne_10m_admin_0_bg_buffer | 1 |
ne_10m_admin_0_boundary_lines_land | 462 |
ne_10m_admin_0_countries | 255 |
ne_10m_admin_1_states_provinces | 4594 |
ne_10m_admin_1_states_provinces_lines | 10114 |
ne_10m_populated_places | 7342 |
ne_10m_antarctic_ice_shelves_polys | 159 |
ne_10m_geography_marine_polys | 307 |
ne_10m_glaciated_areas | 1886 |
ne_10m_lakes | 1354 |
ne_10m_ocean | 1 |
ne_10m_rivers_lake_centerlines | 1455 |
ne_50m_admin_0_boundary_lines_land | 361 |
ne_50m_admin_1_states_provinces_lines | 202 |
ne_50m_urban_areas | 2143 |
ne_50m_antarctic_ice_shelves_polys | 64 |
ne_50m_glaciated_areas | 377 |
ne_50m_lakes | 275 |
ne_50m_ocean | 1 |
ne_50m_rivers_lake_centerlines | 462 |
ne_110m_admin_0_boundary_lines_land | 186 |
ne_110m_glaciated_areas | 11 |
ne_110m_lakes | 25 |
ne_110m_ocean | 2 |
ne_110m_rivers_lake_centerlines | 13 |
lake_centerline | 14790 |
country_osm_grid | 23219 |
osm_ocean_polygon | 14516 |
osm_water_polygon | 2230 |
osm_aerialway_linestring | 2 |
osm_landcover_polygon | 20725 |
osm_poi_polygon | 8555 |
osm_landuse_polygon | 6378 |
osm_housenumber_point | 6217 |
osm_shipway_linestring | 24 |
osm_country_point | 1 |
osm_peak_point | 11065 |
osm_highway_polygon | 226 |
osm_aerodrome_label_point | 7 |
osm_route_member | 2779 |
osm_waterway_linestring | 5766 |
osm_railway_linestring | 626 |
osm_city_point | 2607 |
osm_park_polygon | 69 |
osm_aeroway_polygon | 77 |
osm_island_polygon | 90 |
osm_highway_linestring | 137183 |
osm_aeroway_linestring | 47 |
osm_building_polygon | 214152 |
osm_poi_point | 14047 |
osm_island_point | 1 |
osm_aeroway_linestring_gen1 | 47 |
osm_water_polygon_gen1 | 872 |
osm_landuse_polygon_gen1 | 4517 |
osm_park_polygon_gen1 | 69 |
osm_shipway_linestring_gen1 | 24 |
osm_waterway_linestring_gen1 | 760 |
osm_aerialway_linestring_gen1 | 2 |
osm_aeroway_polygon_gen1 | 31 |
osm_highway_linestring_gen1 | 11365 |
osm_landcover_polygon_gen1 | 7357 |
osm_railway_linestring_gen1 | 550 |
osm_aeroway_polygon_gen2 | 23 |
osm_railway_linestring_gen2 | 550 |
osm_waterway_linestring_gen2 | 760 |
osm_shipway_linestring_gen2 | 24 |
osm_park_polygon_gen2 | 69 |
osm_highway_linestring_gen2 | 7479 |
osm_landuse_polygon_gen2 | 2880 |
osm_water_polygon_gen2 | 476 |
osm_aeroway_linestring_gen2 | 47 |
osm_landcover_polygon_gen2 | 3503 |
osm_waterway_linestring_gen3 | 760 |
osm_aeroway_linestring_gen3 | 47 |
osm_park_polygon_gen3 | 69 |
osm_landcover_polygon_gen3 | 1461 |
osm_water_polygon_gen3 | 217 |
osm_railway_linestring_gen3 | 550 |
osm_landuse_polygon_gen3 | 1616 |
osm_aeroway_polygon_gen3 | 13 |
osm_railway_linestring_gen4 | 550 |
osm_water_polygon_gen4 | 87 |
osm_landuse_polygon_gen4 | 604 |
osm_landcover_polygon_gen4 | 1461 |
osm_park_polygon_gen4 | 68 |
osm_landcover_polygon_gen5 | 529 |
osm_railway_linestring_gen5 | 550 |
osm_park_polygon_gen5 | 67 |
osm_landuse_polygon_gen5 | 114 |
osm_water_polygon_gen5 | 33 |
osm_water_polygon_gen6 | 15 |
osm_landuse_polygon_gen6 | 21 |
osm_landcover_polygon_gen6 | 177 |
osm_park_polygon_gen6 | 61 |
osm_landuse_polygon_gen7 | 21 |
osm_park_polygon_gen7 | 52 |
osm_landcover_polygon_gen7 | 37 |
osm_park_polygon_gen8 | 43 |
osm_border_linestring | 1444 |
osm_border_linestring_gen1 | 1444 |
osm_ocean_polygon_gen1 | 14516 |
osm_border_linestring_gen2 | 1444 |
osm_border_linestring_gen3 | 1356 |
osm_border_linestring_gen4 | 469 |
osm_border_linestring_gen5 | 469 |
osm_border_linestring_gen6 | 266 |
osm_transportation_merge_linestring | 917 |
osm_border_linestring_gen7 | 266 |
osm_border_linestring_gen8 | 266 |
osm_border_linestring_gen9 | 266 |
osm_transportation_merge_linestring_gen3 | 917 |
osm_border_linestring_gen10 | 158 |
osm_transportation_merge_linestring_gen4 | 615 |
osm_transportation_merge_linestring_gen5 | 54 |
osm_transportation_merge_linestring_gen6 | 48 |
osm_transportation_merge_linestring_gen7 | 8 |
osm_transportation_name_network | 20402 |
osm_transportation_name_linestring | 12470 |
osm_transportation_name_linestring_gen1 | 28 |
osm_transportation_name_linestring_gen2 | 15 |
osm_transportation_name_linestring_gen3 | 7 |
osm_transportation_name_linestring_gen4 | 7 |
osm_building_block_gen1 | 8565 |
osm_water_lakeline | 7 |
osm_water_point | 408 |
osm_ocean_polygon_gen2 | 14516 |
osm_ocean_polygon_gen3 | 14516 |
osm_ocean_polygon_gen4 | 14516 |
osm_important_waterway_linestring | 296 |
osm_important_waterway_linestring_gen1 | 190 |
osm_important_waterway_linestring_gen2 | 126 |
osm_important_waterway_linestring_gen3 | 105 |
テーブル名の先頭が、”ne_”のテーブルはNatural Earthのデータ、"osm_"はOpenStreetMap(OSM)のデータです。
OSMデータは、アルバニアのデータだけが収容されていると思われます。
OpenJUMPによる地図表示
最後に、OpenJUMPからSQLを発行して地図表示してみます。
小縮尺地図の海ポリゴン(ne_110m_ocan)を表示してみます。

続いて、OSMの公園ポリゴン(osm_park_polygon)を表示してみます。

アルバニアだけが収容されていることがわかります。
以下は、公園の名称(nameカラム)をラベルとして表示した例です。

まとめ
今回は、OpenMapTilesのpreloadコンテナの内容を確認しました。
アルバニアの地図を作成するために必要なデータを予め収容したデータベースと考えるとよさそうです。
アルバニアのmbtrilesが15分ほどで完成する理由は、このpreloadコンテナにあるようです。
一方で、そのために2GBものイメージをダウンロードするのは少々疑問もあります。
quickstart.shの”--empty”オプションを指定すると、preloadコンテナを使わずにすべてのデータをpostgisにインポートしてmbtilesを作成するようです。
処理時間が長くなると思いますが、次回試してみたいと思います。