IIIF Georeference Extension JSONからXYZタイルを生成し、TileServer GLで配信、MapLibre GL JSで表示するまでの手順をまとめます。

OSM上に東京大学鳥瞰図をオーバーレイ表示
概要
IIIF Georeference JSON
│
▼
┌───────────────────────┐
│ iiif-georef-tiles │
│ (XYZタイル生成) │
└───────────────────────┘
│
▼
┌───────────────────────┐
│ mb-util │
│ (mbtiles変換) │
└───────────────────────┘
│
▼
┌───────────────────────┐
│ TileServer GL │
│ (タイル配信) │
└───────────────────────┘
│
▼
┌───────────────────────┐
│ MapLibre GL JS │
│ (地図表示) │
└───────────────────────┘
必要環境
- Docker / Docker Compose
- Python 3.x
- GDAL (
gdal_translate,gdalwarp,gdal2tiles.py) - Pillow (
pip3 install pillow) - mb-util
GDALのインストール
# macOS (Homebrew)
brew install gdal
# Ubuntu/Debian
sudo apt install gdal-bin python3-gdal
mb-utilのインストール
pip3 install mbutil
1. プロジェクト構成
wtms/
├── docker-compose.yml
├── data/ # mbtilesファイル
├── styles/ # カスタムスタイル(オプション)
├── frontend/ # MapLibreビューア
└── docs/
2. Docker Compose設定
docker-compose.yml:
services:
tileserver:
image: maptiler/tileserver-gl:latest
container_name: wtms-tileserver
ports:
- "8888:8080"
volumes:
- ./data:/data
- ./styles:/styles
restart: unless-stopped
frontend:
image: nginx:alpine
container_name: wtms-frontend
ports:
- "8889:80"
volumes:
- ./frontend:/usr/share/nginx/html:ro
restart: unless-stopped
3. IIIF画像からXYZタイルを生成
iiif-georef-tilesを使用します。
Canvas形式とManifest形式の両方に対応しています。
# リポジトリをクローン
git clone https://github.com/nakamura196/iiif-georef-tiles.git
cd iiif-georef-tiles
# XYZタイル生成(Canvas形式またはManifest形式のURLを指定)
python3 scripts/iiif_georef_to_tiles.py IIIF_GEOREF_URL> --output-dir ../tiles_output
例:東京大学鳥瞰図
python3 scripts/iiif_georef_to_tiles.py https://nakamura196.github.io/iiif_geo/canvas.json --output-dir ../tiles_output
Canvas形式とManifest形式の両方を入力として受け付けます。Manifest形式の場合は自動的に最初のCanvasを抽出します。
処理の流れ:
- IIIF Georeference JSONを取得(Manifest形式の場合は自動でCanvasを抽出)
- IIIF Image APIから画像をダウンロード(
full/maxでサーバー最大サイズを取得) - 全GCPを埋め込み(gdal_translate)
- 座標変換(gdalwarp、多項式次数はJSONから取得)
- XYZタイル生成(gdal2tiles.py)
4. XYZタイルをmbtilesに変換
TileServer GLで配信するため、XYZタイルをmbtiles形式に変換します。
重要 : --scheme=xyz オプションを指定してください。指定しないとY座標が反転し、南半球に表示されてしまいます。
python3 -c "from mbutil import disk_to_mbtiles; disk_to_mbtiles('tiles_output/tiles', 'data/tokyo_utokyo.mbtiles', image_format='png', scheme='xyz')"
メタデータの追加
mb-utilで生成したmbtilesにはメタデータがないため、手動で追加します:
sqlite3 data/tokyo_utokyo.mbtiles 'EOF'
INSERT INTO metadata (name, value) VALUES ('name', '東京帝國大學鳥瞰圖');
INSERT INTO metadata (name, value) VALUES ('format', 'png');
EOF
注意 : scheme=xyzなどのメタデータは追加しないでください。mbutilは内部的にTMS形式でY座標を保存しており、TileServer GLはデフォルトでTMS形式として認識します。scheme=xyzを追加すると座標変換がスキップされ、タイルが正しく表示されなくなります。
5. TileServer GLを起動
docker compose up -d
確認
- TileServer GL: http://localhost:8888/
- TileJSON: http://localhost:8888/data/tokyo_utokyo.json
- データ一覧: http://localhost:8888/data.json

TileServer GLのトップページ

データ詳細ページ(TileJSON情報)
6. MapLibre GL JSで表示
TileServer GLからタイルを取得してMapLibreで表示します。
const TILESERVER_URL = 'http://localhost:8888';
// OSMベースマップ
const map = new maplibregl.Map({
container: 'map',
style: {
version: 8,
sources: {
'osm': {
type: 'raster',
tiles: ['https://tile.openstreetmap.org/{z}/{x}/{y}.png'],
tileSize: 256
}
},
layers: [{
id: 'osm-layer',
type: 'raster',
source: 'osm'
}]
},
center: [139.768, 35.711],
zoom: 16
});
// TileServerからオーバーレイを追加
map.on('load', () => {
map.addSource('overlay', {
type: 'raster',
url: `${TILESERVER_URL}/data/tokyo_utokyo.json`
});
map.addLayer({
id: 'overlay-layer',
type: 'raster',
source: 'overlay',
paint: {
'raster-opacity': 0.8
}
});
});
不透明度の調整
スライダーで不透明度を調整することで、ベースマップとの比較が容易になります。
| 不透明度100% | 不透明度50% |
|---|---|
![]() | ![]() |
基本コマンド
# 起動
docker compose up -d
# 停止
docker compose down
# ログ確認
docker compose logs -f tileserver
# 再起動(mbtilesファイル追加後)
docker compose restart tileserver
エンドポイント
| URL | 説明 |
|---|---|
| http://localhost:8888/ | TileServer GLトップページ |
| http://localhost:8888/data.json | データソース一覧 |
| http://localhost:8888/data/{name}.json | TileJSON |
| http://localhost:8888/data/{name}/{z}/{x}/{y}.png | タイル取得 |
| http://localhost:8889/ | MapLibreビューア |

