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のページを確認すると、以下のように各コンテナの説明があります。

GitHub上の各イメージの説明

import-dataコンテナにてインポートされるデータ(Natural Earth、water polygons、lake centerlines)を事前にロードしたもので、主にテスト用、ユーザー・パスワードは固定といったことが書いてあります。
今回は、このpreloadコンテナについて確認します。

postgis-preloadedコンテナとは

preloadコンテナは、OpenMapTilesのタイル作成時間を短縮するために、一部のデータを事前にPostGISデータベースに格納したコンテナです。
preloadコンテナの特徴を以下に示します。

  • コンテナの内容は、PsotgreSQL(PostGIS)のデータベース
  • mbtilesの作成時間を短縮することが目的
  • NaturlEarthやアルバニアのOSMデータ、OSM派生データ(水系ポリゴンと湖中心線)を収容

図にすると以下のようになります。

preloadコンテナのイメージ

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のダウンロードページを以下に示します。

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へアクセスできます。

pgAdminからpreloadコンテナ上のPostGISを参照

preloadコンテナに収容されるデータ

データ内容を確認したところ、153テーブルが存在し135テーブルにデータが存在しました。(18テーブルはレコード0件)

テーブル名レコード件数
country_languages249
wd_names553
ne_10m_admin_0_bg_buffer1
ne_10m_admin_0_boundary_lines_land462
ne_10m_admin_0_countries255
ne_10m_admin_1_states_provinces4594
ne_10m_admin_1_states_provinces_lines10114
ne_10m_populated_places7342
ne_10m_antarctic_ice_shelves_polys159
ne_10m_geography_marine_polys307
ne_10m_glaciated_areas1886
ne_10m_lakes1354
ne_10m_ocean1
ne_10m_rivers_lake_centerlines1455
ne_50m_admin_0_boundary_lines_land361
ne_50m_admin_1_states_provinces_lines202
ne_50m_urban_areas2143
ne_50m_antarctic_ice_shelves_polys64
ne_50m_glaciated_areas377
ne_50m_lakes275
ne_50m_ocean1
ne_50m_rivers_lake_centerlines462
ne_110m_admin_0_boundary_lines_land186
ne_110m_glaciated_areas11
ne_110m_lakes25
ne_110m_ocean2
ne_110m_rivers_lake_centerlines13
lake_centerline14790
country_osm_grid23219
osm_ocean_polygon14516
osm_water_polygon2230
osm_aerialway_linestring2
osm_landcover_polygon20725
osm_poi_polygon8555
osm_landuse_polygon6378
osm_housenumber_point6217
osm_shipway_linestring24
osm_country_point1
osm_peak_point11065
osm_highway_polygon226
osm_aerodrome_label_point7
osm_route_member2779
osm_waterway_linestring5766
osm_railway_linestring626
osm_city_point2607
osm_park_polygon69
osm_aeroway_polygon77
osm_island_polygon90
osm_highway_linestring137183
osm_aeroway_linestring47
osm_building_polygon214152
osm_poi_point14047
osm_island_point1
osm_aeroway_linestring_gen147
osm_water_polygon_gen1872
osm_landuse_polygon_gen14517
osm_park_polygon_gen169
osm_shipway_linestring_gen124
osm_waterway_linestring_gen1760
osm_aerialway_linestring_gen12
osm_aeroway_polygon_gen131
osm_highway_linestring_gen111365
osm_landcover_polygon_gen17357
osm_railway_linestring_gen1550
osm_aeroway_polygon_gen223
osm_railway_linestring_gen2550
osm_waterway_linestring_gen2760
osm_shipway_linestring_gen224
osm_park_polygon_gen269
osm_highway_linestring_gen27479
osm_landuse_polygon_gen22880
osm_water_polygon_gen2476
osm_aeroway_linestring_gen247
osm_landcover_polygon_gen23503
osm_waterway_linestring_gen3760
osm_aeroway_linestring_gen347
osm_park_polygon_gen369
osm_landcover_polygon_gen31461
osm_water_polygon_gen3217
osm_railway_linestring_gen3550
osm_landuse_polygon_gen31616
osm_aeroway_polygon_gen313
osm_railway_linestring_gen4550
osm_water_polygon_gen487
osm_landuse_polygon_gen4604
osm_landcover_polygon_gen41461
osm_park_polygon_gen468
osm_landcover_polygon_gen5529
osm_railway_linestring_gen5550
osm_park_polygon_gen567
osm_landuse_polygon_gen5114
osm_water_polygon_gen533
osm_water_polygon_gen615
osm_landuse_polygon_gen621
osm_landcover_polygon_gen6177
osm_park_polygon_gen661
osm_landuse_polygon_gen721
osm_park_polygon_gen752
osm_landcover_polygon_gen737
osm_park_polygon_gen843
osm_border_linestring1444
osm_border_linestring_gen11444
osm_ocean_polygon_gen114516
osm_border_linestring_gen21444
osm_border_linestring_gen31356
osm_border_linestring_gen4469
osm_border_linestring_gen5469
osm_border_linestring_gen6266
osm_transportation_merge_linestring917
osm_border_linestring_gen7266
osm_border_linestring_gen8266
osm_border_linestring_gen9266
osm_transportation_merge_linestring_gen3917
osm_border_linestring_gen10158
osm_transportation_merge_linestring_gen4615
osm_transportation_merge_linestring_gen554
osm_transportation_merge_linestring_gen648
osm_transportation_merge_linestring_gen78
osm_transportation_name_network20402
osm_transportation_name_linestring12470
osm_transportation_name_linestring_gen128
osm_transportation_name_linestring_gen215
osm_transportation_name_linestring_gen37
osm_transportation_name_linestring_gen47
osm_building_block_gen18565
osm_water_lakeline7
osm_water_point408
osm_ocean_polygon_gen214516
osm_ocean_polygon_gen314516
osm_ocean_polygon_gen414516
osm_important_waterway_linestring296
osm_important_waterway_linestring_gen1190
osm_important_waterway_linestring_gen2126
osm_important_waterway_linestring_gen3105

テーブル名の先頭が、”ne_”のテーブルはNatural Earthのデータ、”osm_”はOpenStreetMap(OSM)のデータです。
OSMデータは、アルバニアのデータだけが収容されていると思われます。

OpenJUMPによる地図表示

最後に、OpenJUMPからSQLを発行して地図表示してみます。
小縮尺地図の海ポリゴン(ne_110m_ocan)を表示してみます。

OpenJUMPにて表示したne_110m_ocanを表示

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

osm_park_polygonを表示

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

公園名称も表示

まとめ

今回は、OpenMapTilesのpreloadコンテナの内容を確認しました。
アルバニアの地図を作成するために必要なデータを予め収容したデータベースと考えるとよさそうです。
アルバニアのmbtrilesが15分ほどで完成する理由は、このpreloadコンテナにあるようです。

一方で、そのために2GBものイメージをダウンロードするのは少々疑問もあります。
quickstart.shの”–empty”オプションを指定すると、preloadコンテナを使わずにすべてのデータをpostgisにインポートしてmbtilesを作成するようです。
処理時間が長くなると思いますが、次回試してみたいと思います。

前の記事

OpenMapTilesのファイル

次の記事

mbtiles作成の時間計測