この記事は FOSS4G Advent Calendar 2018 の13日目の記事です
はじめに
ここでは マピオン において、地図タイルの生成と配信で使用しているプロプライエタリソフトウェアとその内部で利用している FOSS4G を紹介します
利用している FOSS4G
Mapbox Vector Tile
通称 MVT
Mapboxが提唱するオープンなベクタータイルの仕様
vector-tile-spec
マピオン ではこの仕様に沿ってベクタータイルを生成し活用している
node-mapnik
GeoJSON から MVT への変換で使用している
初期の頃は MVT のフォーマットである Protocol buffers を直に作っていた
今は PostGIS に ST_AsMVT が追加されたのでそれを使うのがよい
node-mapbox-gl-native
ベクタータイルからラスタータイルへの変換で使用している
作成した(主な)プロプライエタリソフトウェア
mvt-plant
Postgres(PostGIS)に格納された位置データからベクタータイルを大量に作り出す node モジュール
内部で node-mapnik を使用している
出力先はS3 or MBTiles or ローカル
図
使い方
const plant = new MvtPlant(config);
await plant.run();
raster-plant
ベクタータイルからラスタータイルを大量に作り出す node モジュール
内部で node-mapbox-gl-native を使用している
出力先はS3 or MBTiles or ローカル
図(mvt-plantと同じ)
使い方
const plant = new RasterPlant(config);
await plant.run();
ポイント
ローカルで利用できるものはローカルに置く
タイル境界付近でラベルが切れる問題はバッファを取って対処
const image = sharp(buffer, {
raw: {
width: width+bufferSize*2,
height: height+bufferSize*2,
channels: 4
}
}).extract({ left: bufferSize, top: bufferSize, width: width, height: height });
imageminでファイルサイズを最適化
const minBuffer = await imageminPngquant({quality: 100})(buffer);
map-center
地図運用で必要な作業を一手に担う node CLI
- 位置情報DBの構築とアップデート
- ベクタータイルの全生成
- ラスタータイルの全生成
- ベクタータイルの差分更新
- ラスタータイルの差分更新
- など
内部で mvt-plant
raster-plant
を使用している
使い方
// ベクタータイルを生成する場合
$ PROCESS_LIST=vtile \
TILE_GENERATOR_THREAD_COUNT=4 \
TILE_GENERATOR_PROCESS_COUNT= \
TILE_GENERATOR_LOG_LEVEL=debug \
TILE_GENERATOR_TILE_IDS=./tile/sample-tile_ids.sqlite \
TILE_GENERATOR_BUCKET_VECTOR=sample-tiles \
TILE_GENERATOR_USER_VECTOR=mapion \
TILE_GENERATOR_TILESET_NAME=honjo-v20181212 \
TILE_GENERATOR_TILE_HOST=localhost \
TILE_GENERATOR_SEQ_HOST=localhost \
TILE_GENERATOR_SEQ_NAME_VECTOR=seq_vector \
DB_USER=**** \
DB_PW=**** \
...
./index.sh
// 設定はdotenvを使用
// TILE_GENERATOR_PROCESS_COUNTを指定するとその数だけプロセスが立ち上がり並列で実行される
// TILE_GENERATOR_PROCESS_COUNTを指定しない(空欄)とCPUの数が設定される(マシンのリソースを最大限活用する)
// ラスタータイルを生成する場合
$ PROCESS_LIST=rtile \
TILE_GENERATOR_THREAD_COUNT=1 \
TILE_GENERATOR_PROCESS_COUNT= \
TILE_GENERATOR_LOG_LEVEL=debug \
TILE_GENERATOR_TILE_IDS=./tile/sample-tile_ids.sqlite \
TILE_GENERATOR_BUCKET_RASTER=sample-tiles \
TILE_GENERATOR_USER_RASTER=mapion \
TILE_GENERATOR_TILESET_NAME=honjo-v20181212 \
TILE_GENERATOR_SEQ_HOST=localhost \
TILE_GENERATOR_SEQ_NAME_RASTER=seq_raster \
...
./index.sh
// 設定はdotenvを使用
// TILE_GENERATOR_PROCESS_COUNTを指定するとその数だけプロセスが立ち上がり並列で実行される
// TILE_GENERATOR_PROCESS_COUNTを指定しない(空欄)とCPUの数が設定される(マシンのリソースを最大限活用する)
ポイント
現状、日本全国のベクタータイル(z4-z18)生成に36時間ほどかかるが、サーバを増やせばその分早くなる
同じく、日本全国のラスタータイル(z5-z19)生成には33時間ほどかかるが、サーバを増やせばその分早くなる
gl-server
ベクタータイルやラスタータイルなどを配信するアプリケーションサーバ
- ベクタータイルの配信
- ラスタータイルの配信
- スタイルファイルの配信
- フォントファイルの配信
- スプライトファイルの配信
- StaticMapの配信
- 複数のベクタータイルを合成して配信
- 複数のフォントファイルを合成して配信
- JWT による認証機能
内部で node-mapnik と node-mapbox-gl-native を使用している