ベクトルタイルの作り方~メモ~

今更ですが、ベクトルタイルの作成方法について整理しておきます。
以前とやり方が違っているので、自分用メモです。

環境

OS:Rocky Linux 9
準備として必要なパッケージをインストールします。

適当な作業用ディレクトリを作成しそこへ移動します。
その後、以下のコマンドを実行して、必要なパッケージ類をインストールします。
足りないものは適宜追加してください。

ここからは、githubにインストール手順が記載されていますので、合わせて確認してください。
https://github.com/mapbox/tippecanoe#installation

次に、mvtを作成するためのプログラムソースであるtippecanoe(「ティペカヌー」と読むらしい)をgithubからダウンロードします。

gitコマンドで展開された作成されたtippecanoeディレクトリへ移動して、コンパイルとインストールを行います。
公式では、下記のmakeを行う際、「-j」オプションを指定してmakeの並列実行を指定していますが、私の試した環境では敢えて「-j」無しでmakeを行いました。理由については後述します。

makeの際にオプションで-jを指定するとコンパイルが速くなりますが、プアなマシンでやると固まってしまう場合があります。
また、オブジェクト作成時の依存関係が原因と思われるエラーが発生し、これもまた正常にコンパイル/リンクが出来ない場合があります。

今回、私の環境では、マシンが固まる現象が発生したため「-j」を外してmakeを実行しました。
時間は掛かりますが、正規の方法ですので問題はありません。

mvtを作成するにはそこそこのリソースを必要とするケースが多いと思われ、出来ればCPUやメモリなどのリソースに余裕がある環境で「-j」を付けてコンパイルをすることが望ましいです。

これで必要なパッケージとかはインストールされているのですが、パスを切っておかないとだめです。

Rocky 9 のデフォルト環境設定なのか、/usr/local/binへのパスが設定されていませんでした。必要な方は設定しておいてください。
ちなみに、デフォルト設定を変更したい人はこちらを参考にしてください。

mbtilesとpbfの作り方

mbtilesの作り方

-rg デフォルトでも構いませんが、データによって値を設定すると良さそうです。

pbfの作り方

コマンドは以下の通りです。

実際に、この方法で作成することは出来ますが、Mapbox GL JSではこの方法で作成したpbfは扱えないという記載が見受けられました。
tippecanoeは、pbfを作成する際にデフォルトで圧縮を行っている(後で重要になる)そうです。
そこで、圧縮を行わない設定を追加します。

① –no-tile-compression : 圧縮を行わない。
② –no-tile-compression :タイルが大きすぎる場合は、フィーチャ間の最小間隔を広げて 500K 未満に縮小しようとします。 検出された間隔は、ズーム レベル全体に適用されます。
③ –no-tile-size-limit : 作成するタイルサイズの制限を解除します。
④ -j ‘{“*”:[“all”,[“<“,”対象属性”,1000]]}’ :フィルタリング条件
⑤ -e output_dir :出力先ディレクトリ

なんか②と③が打ち消しあっている様な感じにも思えなくもないのですが、③は確実に機能している様でした。

④で対象となるフィーチャーをフィルタリングしています。
これを行わないと、ランダムにフィーチャーがドロップ(間引き)されます。

属性による対象地物の指定方法

-jオプションについて、もう少し説明します。
こんな感じで指定しています。

「*」 :対象のファイルを指定している。ここでは全てを意味します。
    対象ファイルを分けて条件を変更することも可能なのでしょう。
「all」:フィルター演算子。allは全ての条件を満たすことを意味する。
    他に、「in」「none」などがある。
「>=」:演算子の指定。
「比較対象」:フィーチャーの属性を指定。
「比較条件」が1000以上のデータを対象とする。

オプションの設定はたくさんあって理解するのが大変です。
気が向いたら、追記してみようと思います。

参考:https://github.com/mapbox/tippecanoe#cookbook

Web配信におけるデータ圧縮

先程の方法で作成したpbfファイルは、オプションを指定することで非圧縮ファイルになっています。
mapbox GL JSで扱う場合には、非圧縮が条件になるため仕方ありません。

でも、それは mapbox GL JSが扱う際に圧縮されていると不味いということで、通信中に圧縮されていることは特に関係ありません。

ということで、配信するサーバでApacheを利用している場合は、以下の方法を検討してみると良いでしょう。

Apacheの配信データを圧縮する。

/etc/httpd/conf.dに以下のファイルを作成する。

他にも必要に応じて設定を行う。
httpdの再起動もしくはリロードを行えばOK

Rocky Linux 8/9 に AWS S3をマウントする。

概要

Rock Linux 8で保存しているデータのバックアップを取るために、S3へデータ転送を行うことにしました。
マウントしてファイルの転送は可能です。
転送速度の問題が主になりますが、課題が無い訳ではありません。
取り敢えず、マウントしてファイル共有出来るという感じです。

手順リスト

  • Step-1:S3の準備
  • Step-2:ユーザ準備
  • Step-3:awscliのインストール
  • Step-4:goofysのインストール
  • Step-5:検証

Step-1:S3の準備

AWSのS3バケットを作成します。

バケット名とリージョンを指定して作成します。
その他の設定については、特に影響は無いみたいです。
当初、「このバケットのブロックパブリックアクセス設定」にある「パブリックアクセスをすべて ブロック」になっているので気になったのですが、ユーザのアクセス権限が優先されるらしく、設定次第で実質的にはパブリックでのアクセスも可能なのでしょう。(恐いなぁ~と思う人は、嘘だと思って試してみると良いでしょう。)

Step-2:ユーザ準備

S3へアクセスするためにIAMでユーザを登録します。
既存のユーザでも構いません。
ユーザに対し以下を設定します。

アクセス権限:AmazonS3FullAccess
アクセス権限タブ→アクセス権限の追加でAmazonS3FullAccessを追加します。

認証情報タブ→アクセスキーの作成でアクセスキーを新規に作成します。
アクセスキーIDとシークレットアクセスキーが発行されます。
シークレットアクセスキーは、このタイミングだけしか表示することが出来ませんので大切に保管してください。
CSVファイルとしてダウンロードすることも可能なので、ダウンロードしておいても良いでしょう。

Step-3:awscliのインストール

多分、CentOS 8/Rocky Linux 8から有効だと思いますが、以下の方法でawscliをインストールします。

これで行けるかと思ったのですが、タイミング悪くRocky 9ではdnfでインストールが出来ませんでした。
Pythonで対象モジュールのインストールが必要となるのですが、インストールしてもダメでした。単純なバグですが。。。面倒なので直接インストールする場合は下記を参考にインストールします。
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html#getting-started-install-instructions

インストールの確認は以下のコマンドです。

awscliのインストールが完了したら、先に作成したS3へアクセスするための初期設定を行います。

AWSへのアクセスIDとシークレットキーを指定します。
出力フォーマットはjson形式を指定します。
出力形式を指定しないと、この後の動作が上手く動作しません。

Step-4:goofysのインストール

まずは、golangとfuseをインストールします。

次にgoofysをインストールするのですが、最新版は以下でインストールすることが出来ます。

以下のコマンドでインストール出来たことを確認します。

Step-5:マウントする。

まずはマウントポイントを作成します。

これで準備は完了です。

実際にマウントしてみます。
コマンド形式はmountコマンドと同じですね。

課題

/etc/fstabへ静的マウントの方法が分かっていません。
出来そうなんだけど、検証中です。
TBD