なぜMBTilesをPMTilesに変換するのか
MBTilesは、地図タイルのセット全体を1つのファイルにまとめる標準的な方法として10年以上使われており、TileMill、Mapbox Studio、QGISといったツールも今なお標準の出力形式としてこれを採用しています。しかし、MBTilesファイルの正体はSQLiteデータベースです。つまり、たった1枚のタイルを読み取るだけでも、モバイルアプリに組み込まれたライブラリであれ、サーバー上で動くタイル配信プロセスであれ、SQLiteエンジンが必要になります。
PMTilesはこの要件を完全に取り除きます。PMTilesは1つのフラットなバイナリファイルで、すべてのタイルが既知のバイト位置に格納されており、クライアントが一度だけダウンロードしてキャッシュできる小さなディレクトリを通じてアドレス指定されます。ブラウザや地図ライブラリは、通常のHTTPレンジリクエストを使って個々のタイルを取得するだけなので、PMTilesファイルはS3やCloudflare R2、GitHub Pagesのような静的ファイルホストから直接配信でき、タイルサーバーもデータベースもバックエンドのプロセスも一切必要ありません。
このツールは、インストールなしでこの2つの形式を橋渡しします。MBTilesファイルをドロップすると、埋め込まれたSQLiteデータベースからタイルテーブルを直接読み取り、2つの形式間の座標の違いを補正したうえで、有効なPMTilesファイルをバイト単位で組み立てます。これらの処理はすべて、ブラウザのタブの中だけで完結します。
変換の仕組み
PMTilesファイルを書き出せる既存のJavaScriptやWebAssemblyのライブラリは存在しません。公式の「pmtiles」パッケージはリーダー専用で、HTTP経由でアーカイブを読み取ることを目的に作られており、書き出す機能はありません。そこでこの変換ツールでは、公開されているPMTiles v3のバイナリ仕様をもとに、フォーマットを直接実装しています。ファイルのオフセット、ズーム範囲、範囲(bounds)を保持する127バイトのヘッダー、タイルの位置情報をまとめたgzip圧縮のディレクトリ、そしてタイル自体の生バイトデータの3つです。
正しく変換するうえで特に重要な点が2つあります。1つ目は座標の向きです。MBTilesはタイルの行を南を基準に数える「TMS」順で格納しますが、PMTilesは現在の多くのWeb地図と同じく北を基準に数えます。そのため、この変換ツールは標準の計算式を使って、すべてのタイルのY座標を反転させてから使用します。2つ目はタイルのアドレス指定方式です。PMTilesはタイルをz/x/yで直接アドレス指定するのではなく、ヒルベルト曲線(空間充填曲線の一種)によって各タイルに1つのIDを割り当てます。これが選ばれているのは、地理的に近いタイル同士をファイル内でも近い位置にまとめておけるためで、その結果、地図ビューアはごく少ないHTTPリクエストで小さな範囲を読み込めるようになります。すべてのタイルはこのIDでソートされ、その順序のままファイルに書き込まれ、リーダーが二分探索で任意のタイルを見つけられるよう圧縮されたディレクトリに索引付けされます。
この変換ツールが出力するファイルは、公式の「pmtiles」リーダーライブラリ自体を使って検証されています。これはMapLibre GLが実際のアーカイブを開く際に使っているのと同じコードで、書き出されたすべてのタイルが読み戻したときにバイト単位で完全に一致することを確認済みです。これは小規模なタイルセットだけでなく、非常に多くのタイル数のためにフォーマットのディレクトリ分割が必要になるほど大規模なアーカイブでも確認されています。
手順ガイド

パソコンから.mbtilesファイルを選択するか、「サンプルを試す」をクリックすると、その場で生成された小さな合成タイルセットを読み込めます。

MBTilesファイルから元のタイルが読み込まれ、地図上に描画されます。変換の前に、正しいタイルセットが読み込まれたことを確認できます。

「PMTilesに変換」をクリックします。変換処理はすべてブラウザ内で完結し、すべてのタイルを読み込み、それぞれのヒルベルト曲線上の位置を計算し、PMTilesファイルを組み立てます。

変換されたタイル数、ズーム範囲、タイル形式、地理的な範囲、出来上がったPMTilesファイルのサイズをまとめたサマリーが表示されます。

「.pmtilesをダウンロード」をクリックすると、完成したファイルをパソコンに保存できます。
実際の活用例
MBTilesからPMTilesへの移行が実際に効果を発揮する場面を紹介します。
- 静的ファイルホストでのタイル公開。 PMTilesは、HTTPレンジリクエストを使ってS3、Cloudflare R2、GitHub Pages、あるいはどんな単純なファイルホストからでも直接配信できます。タイルサーバーのプロセスを一切動かす必要はありません。これは、MBTilesのSQLiteファイル単体では実現できないことです。
- 古いMBTilesエクスポートの刷新。 何年も前にTileMill、Mapbox Studio、QGISから書き出されたタイルパッケージは、今でもMBTilesのままであることが多くあります。これをPMTilesに変換すれば、元のデータからタイルを再生成することなく、現在の地図スタック(MapLibre、Protomapsなど)でそのまま使えるようになります。
- 小規模な地図プロジェクトのインフラ削減。 1つの静的なPMTilesファイルにまとめることで、ほぼ静的な小規模タイルセットを配信するためだけに専用のタイルサーバーを運用・維持する必要がなくなります。小規模なサイトや社内ツールでは、ホスティング費用や管理すべき構成要素の削減につながります。
- フィールドアプリ向けのオフライン地図パッケージの準備。 現地でのデータ収集やオフライン優先の地図アプリでは、ローカルストレージからPMTilesを直接読み込むケースが増えています。既存のMBTiles形式のベースマップを変換しておけば、オフラインアプリと同じ画像を使うWeb地図の両方で、単一のファイル形式に統一できます。
- クラウドネイティブな形式でのタイルセットのアーカイブ。 PMTilesのタイルはデータベースへの問い合わせではなくバイト範囲でアドレス指定されるため、アーカイブしたPMTilesファイルは、何年後であっても特定のデータベースエンジンをインストールすることなく、内容を確認したり、一部だけ取得したり、配信したりできます。
よくある質問
PMTilesとは何ですか。MBTilesとはどう違うのですか。
どちらも地図タイルのセット全体を1つのファイルにまとめる形式ですが、MBTilesはSQLiteデータベースであり、たった1枚のタイルを読むだけでもSQLiteエンジンが必要です。PMTilesは単純なバイナリファイルとして設計されており、Webサーバー(あるいはS3やGitHub Pagesのような静的ファイルホストでさえも)が通常のHTTPレンジリクエストを使って個々のタイルを配信できます。タイルサーバーもデータベースも一切動かす必要はありません。
このツールは本当にPMTiles形式を自前で実装しているのですか。それとも既存のライブラリを呼び出しているだけですか。
PMTiles v3のバイナリ形式を直接実装しています。具体的には、127バイトのヘッダー、ヒルベルト曲線によるタイルIDでアドレス指定されるgzip圧縮のタイルディレクトリ、そしてタイルデータ本体の部分です。このツールを作る過程で調べた限り、ブラウザ上で動作しPMTilesファイルを書き出せるJavaScriptライブラリは他に見当たりませんでした。公式の「pmtiles」パッケージはリーダー専用だからです。そのため、公開されている仕様書をもとにゼロから実装する必要がありました。
出力結果が正しいことは、実際にどうやって検証されているのですか。
このツールが生成するすべてのファイルは、公式の「pmtiles」npmパッケージ自身のリーダーで読み戻すことでテストされています。これはMapLibreなど他のツールが実際のPMTilesアーカイブを開く際に使っているのと同じコードで、すべてのタイルがバイト単位で完全に一致することを確認しています。この検証は、小さなファイルだけでなく、フォーマットの「リーフディレクトリ」への分割が必要になるほど大規模なアーカイブに対しても行っています。
この変換でY座標が重要になるのはなぜですか。
MBTilesは南を基準に数える「TMS」順で、タイルの行を上下に格納します。一方、PMTilesは(現在の多くのWeb地図と同様に)北を基準に数えます。そのため、この変換ツールは出力ファイル内での位置を計算する前に、標準の計算式 y_new = 2^z − 1 − y_old を使って、すべてのタイルのY座標を反転させます。これにより、タイルが正しい位置に配置されます。
ラスター画像だけでなく、ベクタータイルにも対応していますか。
はい。この変換ツールは、MBTilesのメタデータテーブルから「format」フィールドを読み取り、PNG、JPEG、WebPのラスタータイルと、PBF/MVTのベクタータイルを区別します。そして、PMTilesのヘッダーに正しいタイルタイプを設定するので、MapLibre GLのような後段のツールが正しくレンダリングできます。
メタデータ(名前、説明、著作権表示、ベクターレイヤー情報)は引き継がれますか。
はい。名前、説明、著作権表示、そしてベクタータイルセットの場合はMBTilesのメタデータテーブルにある「vector_layers」のスキーマが、PMTilesのメタデータブロックにコピーされます。このメタデータブロックは、ファイル内にプレーンなJSONとして格納されます。
サイズやタイル数に上限はありますか。
アップロードできるファイルサイズは100MBまでです。非常に大きなタイルパッケージ(数万枚単位のタイル)は、すべてのタイルを読み込み、ヒルベルト曲線上の位置に基づいてハッシュ化し、再度書き出すという処理をブラウザのタブの中だけで行うため、処理に時間がかかります。
ファイル内でのタイルの並び順はどうなりますか。
タイルは書き込まれる前にヒルベルト曲線上のタイルIDでソートされます。そのため、地図上で互いに近い位置にあるタイルは、ファイル内でも近い位置に配置されます。これにより、PMTilesのリーダーは、タイル1枚ごとに1回リクエストを送るのではなく、ごく少ないHTTPレンジリクエストで小さな地図範囲を取得できます。
自分のMBTilesファイルはどこかにアップロードされますか。
いいえ。SQLiteデータベースの読み取り、タイル位置の計算、ディレクトリの圧縮、最終的なPMTilesバイト列の組み立てまで、すべてWebAssembly版のSQLiteを使ってブラウザ内でローカルに行われます。ファイルがお使いの端末から外部に送信されることはありません。
変換処理は、WebAssembly版のSQLiteを使ってすべてブラウザ内で行われます。ファイルがサーバーにアップロードされることは一切ありません。地図タイル © OpenStreetMap contributors。
地図タイル © OpenStreetMap の貢献者、Protomapsで描画(ホスティング:KONAKTIVE)、予備としてCARTO。
