3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

GZTiles方式:動的GISデータを高品質のまま高速配信する(GISサーバーレス)

3
Last updated at Posted at 2026-05-25

はじめに

2026年4月21日から、「日本の地番図をみんなで整備する」をミッションとして、オープン地番ZooというWeb地図サービスを運用しています。

オープン地番Zooは、公図ポリゴンを編集し、蓄積・公開していくサービスで、サービス開始から1ヶ月になりますが、220万筆の登録データがあります。

本記事では、大量の動的ポリゴンデータを登録・配信するための手法として考案した GZTiles方式(造語)を解説します。

  • 登録:fetch→Queue(.zip)→ SQLite(.db)→ .gz再生成(.gz
  • 配信:タイルインデックスの.json、タイル単位で事前生成された.gz
  • 表示:JSが直接タイルデータ(.gz)をfetch

というシンプルなアーキテクチャです。
※SQLite、PHPが使える環境であれば可能です。

実測値(2026年5月時点)

項目
公図ポリゴン総数 約220万筆
SQLite DBサイズ 2.78 GB
tiles/.gzファイル数 1,675ファイル
tiles/.gz合計サイズ 228 MB
tiles_dissolve/.gzファイル数 119ファイル
tiles_dissolve/.gz合計サイズ 2 MB

OCZのデータ特性

① 増大し続けるデータ

現在の登録数は約220万筆ですが、最終的には数千万筆規模になることを想定しています。配信アーキテクチャは最初からそのスケールに耐えられる設計が必要です。
※1日平均5万筆ほど増加しています。

② 常に差分更新が発生する

OCZはクラウドソーシング型のプロジェクトです。参加者が随時ポリゴンを編集・保存するため、データは常に変化し続けます。更新のたびに全データを再処理するような方式は、データ量が増えるほどサーバー負荷がかかります。また、ローカルで処理しサーバーにUPする方法もデータ量とともに負担が増えると同時にタイムラグが生じます。

③ 形状・属性を劣化させられない

公図ポリゴンは表示するだけでなく、編集にも使用します。一般的なベクトルタイルのようにズームレベルに応じて間引き・簡略化してしまうと、正確な形状が失われ、表示専用のデータにしかなれません。

④ 即座に地図反映が必要

参加者が編集・保存した内容は、すぐに地図上に反映される必要があります。バッチ処理で数時間後に反映されるような設計はユーザー体験を損ないます。

⑤ 普通のレンタルサーバーで動かす

GISサーバーや専用インフラは使用しません。さくらインターネットのスタンダードプランという、ごく一般的なレンタルサーバー上で完結させる必要があります。

既存手法では対応できない理由

これら5つの条件を同時に満たす既存手法は存在しませんでした。

手法 問題点
PMTiles・MVT レンタルサーバー上でTippecanoeを動かしてタイル生成するのは現実的でない。全体再生成が基本設計のため差分更新に不向きで、データ量が増えるほど生成コストが累積的に増大する
FlatGeobuf HTTPの範囲リクエストで高速な部分取得が可能だが、動的に更新されるデータをリアルタイムでサーバー上で再構築するのは困難
動的GeoJSON API DBアクセスのたびに負荷が発生し、数千万筆規模では同時アクセスに耐えられない

これらの課題をすべて回避するために考案したのがGZTiles方式です。

GZTiles方式とは

静的な.gzファイルをタイル単位で事前生成し、JSが直接fetchするアーキテクチャです。
※タイルを管理するindex.jsonあり

  • DBアクセスなし:静的ファイルをfetchするだけ
  • GISサーバー不要:通常のWebサーバー(Apache/nginx)のみで動作
  • ポリゴン形状を完全保持:間引き・簡略化なし
  • 差分更新:管理用index.json、影響タイルの.gzを上書き
  • スケーラブル:データ量が増えても1回の更新処理コストは変わらない

アーキテクチャ設計

ファイル構成

/maps/
  tile_index.json          ← タイルキー インデックス(約34.4 KB)
  dissolve_index.json      ← Dissolveタイルキー インデックス(約2.1 KB)

  tiles/
    14-14520-6447.gz       ← GeoJSONをgzip圧縮(1,675ファイル / 合計228 MB)
    ...

  tiles_dissolve/
    10-881-411.gz          ← Dissolve済みGeoJSON.gz(119ファイル / 合計2 MB)
    ...

タイルキーは {z}-{x}-{y} 形式。tile_index.json はどのタイルデータがあるかのリストで、リストのみを先にDLします(不要なリクエスト防止)。

ズームレベルの選定

GZTiles方式では、表示ズームレベルに応じて2種類のタイル層を使い分けています。

データズームレベル 表示ズームレベル 内容 ファイル数 サイズ
Dissolve層 ZL10 ZL10〜16 クラスターID単位で融合・軽量化(広域表示用) 119 約2 MB
Detail層 ZL14 ZL16〜24 完全な形状を保持(詳細・編集用) 1,675 228 MB

Detail層のズームレベルは、表示精度・リクエスト回数・ファイル数の3点を考慮してZL14を採用しました。ZL15にするとタイル数が4倍に膨らむため、日本全国規模のデータを扱う場合にはZL14が最適と判断しました。

〜ZL13:1ファイルが大きくなる(DL時間、メモリ負荷)
ZL14:ちょうど良い(サイズ・ファイル数)
ZL15〜:ファイル数が多くなる。(ファイル数制限)

さくらインターネット スタンダードプランのファイル設置可能数は300万ファイル公式仕様)です。ZL15以上にするとファイル数が爆発的に増加するため、この上限も選定の根拠の一つとなっています。

.gzファイルの内容

各ファイルは通常のGeoJSON FeatureCollectionをgzip圧縮したものです。タイルをまたぐクラスターは両方のタイルに重複収録し、クライアントのJS側で _fid(フィーチャーID)で重複排除します。

{
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "geometry": { "type": "Polygon", "coordinates": ["..."] },
      "properties": {
        "kuiki_cd": "13101_001_001_0000_00",
        "chiban": "100",
        "_fid": "abc123"
      }
    }
  ]
}

JavaScript実装

読み込みフロー

ページロード
  → tile_index.json fetch
  → 画面内タイルの.gz fetch
  → MapLibre GeoJSONソースにUpdate

キャッシュ戦略

.gzファイルはブラウザのHTTPキャッシュに乗せつつ、展開済みのフィーチャーをJS変数(Mapオブジェクト)にもインメモリキャッシュとして保持します。表示範囲外になったタイルはメモリから削除(evict)しますが、再度その範囲に移動した際はHTTPキャッシュから.gzを再取得・展開するだけで済み、サーバーへのリクエストが発生しません。このキャッシュにより、パン操作のたびに同じファイルをサーバーから取得し直すコストを排除しています。

PMTilesとの比較・使い分け

観点 GZTiles方式 PMTiles
ファイル形式 タイルごとの.gzファイル群 単一の.pmtilesファイル
更新 影響タイルのみ上書き可能 全体再生成が基本
用途 頻繁に更新される編集データ 静的な大規模ベースマップ
クライアント ネイティブfetch API maplibre-pmtilesライブラリ

OCZではベースマップ(公共座標公図・農地ナビ)はPMTiles、ユーザー編集データはGZTilesと使い分けています。更新頻度と更新粒度がキーになります。

運用上の注意点

タイルまたぎクラスターの重複収録

1つのフィーチャーが複数タイルにまたがる場合、全タイルに同じフィーチャーを重複収録します。JS側で _fid をキーにしたSetで重複排除してから地図ソースに追加します。

体感速度

GZTiles方式は、PMTilesなどのベクトルタイルと同様、軽量な静的ファイルのfetchのため、高速な地図表示が可能です。

【OCZ Viewer】
https://office-shirado.github.io/view_ocz/

ぜひ、こちらから体験ください。
※青色:GZTiles(地番図)、赤色:PMTiles(公共座標公図)

まとめ

観点 GZTiles方式
インフラ 通常のWebサーバーのみ・GISサーバー不要
データ品質 形状・属性を完全保持
更新 影響タイルのみ差分再生成
スケーラビリティ データ量が増えても更新コスト一定
同時アクセス 静的ファイル配信のため高耐性

GZTiles方式は特別なインフラを必要とせず、PHPとWebサーバーだけで数百万筆規模のポリゴン配信を実現できます。同じような課題を抱えているWebGISプロジェクトの参考になれば幸いです。

3
2
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
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?