🌏

ベクターデータからPMTilesを生成する方法

2023/06/27に公開

はじめに

GIS界隈ではCloud Optimizedが重要なキーワードになっています。Cloud Optimizedとは、特別なサーバ実装を必要とせず、大きな位置情報データの一部分を配信することを可能とするファイル形式の総称です。本記事は、Cloud Optimized形式のうち、PMTiles(ベクトルタイル)の生成方法に焦点を当てた記事になります。具体には、国土交通省がG空間情報センターを通じてオープンデータとして公開している、3D都市モデルPLATEAUの建築物データ(LOD1)からPMTilesを生成する方法について説明します。なお、別の記事で「ラスターデータからPMTilesを生成する方法」という記事も書いていますので、あわせてご覧ください。

https://zenn.dev/shi_works/articles/8b2b71f7d3132c

PMTilesの特徴

  • 単一ファイル形式のタイルデータ
  • ラスタータイル、ベクトルタイルともに対応
  • 地球規模のタイルマップの保存
  • S3 のようなストレージとHTTP Range Requestsのみを使用

https://protomaps.com/docs/pmtiles

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)です。

https://trac.osgeo.org/osgeo4w/

  • WSL2(Ubuntu-20.04)がインストール済みであること。

https://learn.microsoft.com/ja-jp/windows/wsl/install

  • feltのtippecanoeがインストール済みであること。

https://github.com/felt/tippecanoe

  • Windows 10へのtippecanoeのインストール方法は下記のとおりです。

https://gist.github.com/ryanbaumann/e5c7d76f6eeb8598e66c5785b677726e

  • ただし、上記に記載のgit clone https://github.com/mapbox/tippecanoe.gitの箇所をgit clone https://github.com/felt/tippecanoe.gitへの変更が必要です。

  • tippecanoeのバージョンはv2.23.0です。

  • 下記のサイトより3D都市モデルPLATEAUの建築物データのファイルジオデータベース(以下、FGDB)をダウンロードし、解凍済みであること。

https://www.geospatial.jp/ckan/dataset/plateau

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のみのようです。

https://qiita.com/Kanahiro/items/ceeb20c158b4c70b62b6

-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をドラッグ&ドロップすると、フィーチャが地図上に表示されます。

https://protomaps.github.io/PMTiles/

おまけ

  • 上記の方法で生成したPMTilesとMapLibre GL JSで作成したデモサイトを下記のGitHubにて公開しています。

https://github.com/shi-works/plateau-lod1-bldg-pmtiles

参考文献

https://qiita.com/Kanahiro/items/ceeb20c158b4c70b62b6

https://github.com/protomaps/PMTiles

https://github.com/felt/tippecanoe

Discussion