🌏
ベクターデータからPMTilesを生成する方法
はじめに
GIS界隈ではCloud Optimizedが重要なキーワードになっています。Cloud Optimizedとは、特別なサーバ実装を必要とせず、大きな位置情報データの一部分を配信することを可能とするファイル形式の総称です。本記事は、Cloud Optimized形式のうち、PMTiles(ベクトルタイル)の生成方法に焦点を当てた記事になります。具体には、国土交通省がG空間情報センターを通じてオープンデータとして公開している、3D都市モデルPLATEAUの建築物データ(LOD1)からPMTilesを生成する方法について説明します。なお、別の記事で「ラスターデータからPMTilesを生成する方法」という記事も書いていますので、あわせてご覧ください。
PMTilesの特徴
- 単一ファイル形式のタイルデータ
- ラスタータイル、ベクトルタイルともに対応
- 地球規模のタイルマップの保存
- S3 のようなストレージとHTTP Range Requestsのみを使用
PC環境
OS:Windows 10 Pro
CPU:Intel Core i7-9700
メモリ:32GB
前提条件
- ベクターデータからPMTilesの生成は、手元にMBTilesがあるならProtomaps公式のgo-pmtilesを使用したほうが良さそうです。
- 一方で、手元にGeoJSONやFlatGeobufがあるならfeltのtippecanoeを使用したほうが良さそうです。
- 今回は、後者のfeltのtippecanoeを用いた、PMTilesの生成方法について説明します。
環境構築
- OSGeo4W(GDAL)がインストール済みであること。
- GDALのバージョンは、GDAL 3.6.3(released 2023/03/07)です。
- WSL2(Ubuntu-20.04)がインストール済みであること。
- feltのtippecanoeがインストール済みであること。
- Windows 10へのtippecanoeのインストール方法は下記のとおりです。
-
ただし、上記に記載の
git clone https://github.com/mapbox/tippecanoe.git
の箇所をgit clone https://github.com/felt/tippecanoe.git
への変更が必要です。 -
tippecanoeのバージョンはv2.23.0です。
-
下記のサイトより3D都市モデルPLATEAUの建築物データのファイルジオデータベース(以下、FGDB)をダウンロードし、解凍済みであること。
FGDBからFlatGeobufを生成
- FGDBからFlatGeobufの生成にはGDALのogr2ogrを使用します。
- FGDBには複数のレイヤが含まれているので、下記のコマンドでFGDBのレイヤ名を調べます。
- OSGeo4W Shellを起動し、cdコマンドでFGDBの格納されているフォルダ(11100_saitama-shi.gdb)まで移動して、
ogrinfo 11100_saitama-shi.gdb
を実行すると以下のとおりレイヤ名が取得できます。
D:\GIS\PLATEAU-2020\fgdb\11100_saitama-shi_fgdb>ogrinfo 11100_saitama-shi.gdb
INFO: Open of `11100_saitama-shi.gdb'
using driver `OpenFileGDB' successful.
Layer: lod2_Building (3D Unknown (any))
Layer: lod1_Building (3D Multi Polygon)
Layer: lod0_Building (3D Multi Polygon)
Layer: lod2_BuildingPart (3D Multi Polygon)
Layer: lod1_BuildingPart (3D Multi Polygon)
Layer: lod2_RoofSurface (3D Multi Polygon)
Layer: lod2_WallSurface (3D Multi Polygon)
Layer: lod2_GroundSurface (3D Multi Polygon)
Layer: lod2_OuterCeilingSurface (3D Unknown (any))
Layer: lod2_OuterFloorSurface (3D Unknown (any))
Layer: lod1_Road (3D Multi Polygon)
Layer: lod1_TinRelief (3D Multi Polygon)
Layer: lod0_UrbanPlan (3D Multi Polygon)
Layer: lod0_AreaClassification (3D Multi Polygon)
Layer: lod0_DistrictAndZones (3D Multi Polygon)
Layer: lod1_LandUse (3D Multi Polygon)
- 今回使用するデータは、建築物データ(LOD1)ですので、レイヤ名が「lod1_Building」のデータを使用します。
- OSGeo4W Shellで
ogr2ogr -f FlatGeobuf 出力ファイル 入力ファイル レイヤ名
を指定してogr2ogrを実行します。
ogr2ogr -f FlatGeobuf 11100_saitama-shi_lod1_Building.fgb 11100_saitama-shi.gdb lod1_Building
FlatGeobufからPMTilesを生成
- FlatGeobufからPMTilesの生成にはfeltのtippecanoeを使用します。
- WSLを起動して、以下のコマンドを実行します。
tippecanoe -o 11100_saitama-shi_lod1_Building.pmtiles 11100_saitama-shi_lod1_Building.fgb -pf -pk -P
- tippecanoeのオプション
-P:並列読み込み
ただし、下記の記事によると、-Pオプションが有効なのは、GeoJSONSeqのみのようです。
-pf:地物数制限を無視する(1タイルあたり200,000フィーチャに制限しない)
-pk:ファイルサイズ制限を無視する(1タイルあたり500Kバイトに制限しない)
-z, -Z:ズームレベル指定
- なお、ズームレベルを指定する場合は以下のとおりになります。
- -Z10 -z18とすると、ズームレベル10-18の範囲でタイルを生成します。
- 指定しない場合は自動的に設定されます。大文字のZが最小ズーム、小文字のzが最大を示すことに注意が必要です。
tippecanoe -o 11100_saitama-shi_lod1_Building.pmtiles -Z10 -z18 11100_saitama-shi_lod1_Building.fgb -pf -pk -P
複数のFlatGeobufから複数のPMTilesを生成
- 複数のFlatGeobufから複数のPMTilesの生成には、以下のシェルスクリプトが便利です。
process_fgb_files.sh
#!/bin/bash
for input_file in *.fgb; do
output_file="${input_file%.fgb}.pmtiles"
echo "Processing ${input_file} ..."
tippecanoe -o "${output_file}" "${input_file}" -pf -pk -P
done
echo "All files processed."
read -p "Press any key to continue . . . " -n1 -s
# 改行コードを Windows 形式(CR+LF)から Unix/Linux 形式(LF)に変換
dos2unix ./process_fgb_files.sh
# 実行権限を付与
chmod +x process_fgb_files.sh
# スクリプトを実行
./process_fgb_files.sh
生成したPMTilesの確認
- 生成したPMTilesの確認には、PMTiles Viewerが便利です。
- PMTilesをドラッグ&ドロップすると、フィーチャが地図上に表示されます。
おまけ
- 上記の方法で生成したPMTilesとMapLibre GL JSで作成したデモサイトを下記のGitHubにて公開しています。
参考文献
Discussion