GIS
mapbox
foss4g
vectortile
ベクタータイル
FOSS4GDay 13

ベクター/ラスタータイルの生成と配信

この記事は FOSS4G Advent Calendar 2018 の13日目の記事です


はじめに

ここでは マピオン において、地図タイルの生成と配信で使用しているプロプライエタリソフトウェアとその内部で利用している FOSS4G を紹介します


利用している FOSS4G


Mapbox Vector Tile

通称 MVT

Mapboxが提唱するオープンなベクタータイルの仕様

vector-tile-spec

マピオン ではこの仕様に沿ってベクタータイルを生成し活用している


node-mapnik

GeoJSON から MVT への変換で使用している

初期の頃は MVT のフォーマットである Protocol buffers を直に作っていた

今は PostGISST_AsMVT が追加されたのでそれを使うのがよい


node-mapbox-gl-native

ベクタータイルからラスタータイルへの変換で使用している


作成した(主な)プロプライエタリソフトウェア


mvt-plant

Postgres(PostGIS)に格納された位置データからベクタータイルを大量に作り出す node モジュール

内部で node-mapnik を使用している

出力先はS3 or MBTiles or ローカル




tile-plant.png

使い方

const plant = new MvtPlant(config);

await plant.run();



raster-plant

ベクタータイルからラスタータイルを大量に作り出す node モジュール

内部で node-mapbox-gl-native を使用している

出力先はS3 or MBTiles or ローカル

図(mvt-plantと同じ)




tile-plant.png

使い方

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-mapniknode-mapbox-gl-native を使用している




gl-server.png