10
5

More than 5 years have passed since last update.

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

Posted at

この記事は 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

10
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
5