ジオリファレンスとは

ジオリファレンス(地理参照)とは、画像上の座標を実世界の地理座標に対応づける処理のことです。歴史研究やデジタルアーカイブの分野では、古地図や鳥瞰図といった歴史的な画像資料を現代の地図と重ね合わせる際にこの技術が不可欠となります。

たとえば、江戸時代に描かれた城下町の絵図に描かれた寺社や道の位置を、現在のGoogleマップやOpenStreetMap上で確認したい場合を考えます。絵図上のある点が「緯度35.7151、経度139.7623」に相当するといった対応関係を定義するのがジオリファレンスです。こうした対応点(Ground Control Point, GCP)を複数設定することで、画像全体を地理座標系にマッピングし、現代地図上に重畳表示することが可能になります。

従来、ジオリファレンスはQGISなどの専門的なGISソフトウェアで行われてきましたが、IIIFの拡張仕様によってWebブラウザ上で完結する新しいワークフローが登場しています。

IIIF Georeference Extensionの仕組み

IIIF Georeference Extensionは、IIIF Presentation API 3.0のCanvasに対して地理参照情報を付与するための拡張仕様です。公式仕様は以下で公開されています。

https://iiif.io/api/extension/georef/

この仕様の中核は、georeferencingというmotivationを持つAnnotationです。AnnotationのbodyとしてFeatureCollectionを記述し、その中に画像座標と地理座標の対応関係を定義します。

{
  "@context": [
    "http://iiif.io/api/extension/georef/1/context.json",
    "http://iiif.io/api/presentation/3/context.json"
  ],
  "type": "Canvas",
  "annotations": [
    {
      "type": "AnnotationPage",
      "items": [
        {
          "type": "Annotation",
          "motivation": "georeferencing",
          "body": {
            "type": "FeatureCollection",
            "transformation": {
              "type": "polynomial",
              "options": { "order": 1 }
            },
            "features": [
              {
                "type": "Feature",
                "properties": {
                  "resourceCoords": [6690, 7517]
                },
                "geometry": {
                  "type": "Point",
                  "coordinates": [139.7623, 35.7151]
                }
              }
            ]
          }
        }
      ]
    }
  ]
}

各Featureのproperties.resourceCoordsが画像上のピクセル座標(x, y)を、geometry.coordinatesが地理座標(経度, 緯度)を表します。transformationには座標変換の手法を指定でき、多項式変換(polynomial)やThin Plate Spline変換が利用可能です。

この仕様の優れた点は、ジオリファレンス情報をAnnotationとして表現することで、元の画像データやマニフェストを変更せずに地理情報を後から追加できることです。IIIFの設計思想である「分散的なメタデータの付与」を踏襲しています。

Allmapsを使ったジオリファレンス

Allmapsは、IIIF対応画像に対してブラウザ上でジオリファレンスを行えるオープンソースのツールセットです。

https://allmaps.org/

ジオリファレンスの手順

Allmaps Editorでの作業は、以下の流れで進めます。

  1. 画像の指定: Allmaps Editor(https://editor.allmaps.org/)にアクセスし、IIIF画像のURLまたはマニフェストURLを入力します。IIIF Image APIのinfo.jsonのURLを直接指定することも可能です。

  2. 対応点の設定: 「Georeference」ボタンを押すと、画像と現代地図が並列表示されます。画像上の特定の地点をクリックし、対応する現代地図上の位置をクリックする操作を繰り返して、GCPを設定していきます。対応点は最低3点必要ですが、精度を高めるためには10点以上設定することが推奨されます。

  3. 結果の確認: 「Results」ボタンを押すと、設定した対応点に基づいて画像が現代地図上にオーバーレイ表示されます。Allmaps Viewerでは、透明度を調整しながら重ね合わせの精度を確認できます。

出力データ

Allmapsは、IIIF Georeference Extensionに準拠したAnnotationデータを生成します。このデータはAllmaps APIからURLでアクセスでき、他のビューアやツールで再利用可能です。たとえば以下のようなURLでAnnotationを取得できます。

https://annotations.allmaps.org/images/{image_id}

Allmapsの特筆すべき点は、専門的なGISの知識がなくても直感的にジオリファレンスを行えることと、結果がIIIF標準に準拠したオープンなデータとして公開されることです。

ジオリファレンスビューアの構築

ジオリファレンスされたIIIF画像を閲覧するビューアの構築には、地図ライブラリの選定が重要です。ここでは、LeafletからMapLibre GL JSへの移行事例を通じて、ビューア構築のポイントを解説します。

MapLibre GL JSの利点

MapLibre GL JSは、WebGLベースの地図描画ライブラリです。従来よく使われてきたLeafletと比較して、以下の利点があります。

  • パフォーマンス: WebGLによるGPUアクセラレーションで、大量のマーカー表示や滑らかなズーム・回転が可能
  • ベクタータイル対応: OpenMapTilesなどのベクタータイルを直接描画でき、表現力が高い
  • 多彩な地図スタイル: OpenStreetMap標準地図、航空写真、歴史的地図スタイル(れきちず等)の切り替えが容易

主要機能の実装

実際のビューア実装では、以下のような機能が求められます。

画像の自動回転: 古地図は必ずしも北が上とは限りません。GCPの座標情報から画像の方位角を自動計算し、北を上にした表示に補正する機能が有用です。画像座標系と地理座標系のベクトルの角度差から回転角を算出します。

マーカークラスタリング: 多数のGCPやメタデータポイントを地図上に表示する場合、MapLibre GL JSのクラスタリング機能を使って近接するマーカーを自動的にグループ化し、ズームに応じて展開する表示が効果的です。

複数地図スタイルの切り替え: 歴史地図を扱う場合、現代のOpenStreetMapだけでなく、航空写真や歴史的地図スタイルとの比較が研究上重要になります。スタイル切り替え時にはマーカーやデータレイヤーの状態を保持する実装が必要です。

URLパラメータによる状態管理: ズームレベル、中心座標、回転角度などをURLパラメータとして保存することで、特定の表示状態を他のユーザーと共有できます。

Linked Places Format対応

Linked Places Format(LPF)は、Pelagios Networkが策定した地名辞典データの相互運用フォーマットです。GeoJSONを拡張してJSON-LDの概念を取り入れ、異なるデータセット間での場所情報の共有と連携を実現します。

LPFの構造

LPFでは、各地点をGeoJSONのFeatureとして表現しつつ、@idによるURI識別子とlinks配列による外部リソースへの参照を追加します。

{
  "type": "Feature",
  "@id": "https://example.org/places/denki-jikkenshitsu",
  "properties": {
    "resourceCoords": [6690, 7517],
    "title": "電気実験室",
    "tags": ["工学部"]
  },
  "links": [
    {
      "type": "primaryTopicOf",
      "identifier": "https://maps.app.goo.gl/..."
    },
    {
      "type": "closeMatch",
      "identifier": "http://www.wikidata.org/entity/Q123456"
    }
  ],
  "geometry": {
    "type": "Point",
    "coordinates": [139.7623, 35.7151]
  }
}

linksのtypeには、exactMatch(完全一致)、closeMatch(類似)、primaryTopicOf(関連ページ)、seeAlso(関連情報)などがあり、他の地名辞典やWikidata、Wikipedia等への関連づけが可能です。

ジオリファレンスビューアでのLPF活用

ジオリファレンスビューアにLPFを導入することで、単なるGCPの位置表示に留まらず、各地点に関する豊かなメタデータを提供できます。ポップアップ表示では、地点の名称、タグ、関連リソースへのリンクが表示され、研究者が地点の情報をたどる起点となります。

後方互換性の確保も重要です。従来の独自メタデータ形式とLPF形式が混在するデータでも正しく表示できるよう、IDやラベルの解決に優先順位を設ける実装が推奨されます。

XYZタイルへの変換

IIIF Georeference Extensionで定義されたジオリファレンス情報を使って、IIIF画像をXYZタイル(Webマップで広く使われるタイル形式)に変換することも可能です。これにより、MapLibre GL JSやLeafletなどの一般的な地図ライブラリで、ジオリファレンスされた画像をラスターオーバーレイとして表示できます。

変換の流れ

変換にはGDAL(Geospatial Data Abstraction Library)を使用します。処理は以下のステップで進みます。

  1. JSONの取得: IIIF Georeference Extension JSONからGCPの情報を読み取る
  2. 画像のダウンロード: IIIF Image APIを使って元画像を取得する
  3. GCPの埋め込み: gdal_translateでGCPを画像に付与する
  4. 座標変換: gdalwarpで画像を地理座標系に変換(再投影)する
  5. タイル生成: gdal2tiles.pyでXYZタイルを生成する
  6. ビューア生成: MapLibre GL JSで閲覧できるHTMLを出力する

生成されたタイルは、GitHub PagesやS3などの静的ホスティングサービスで配信できます。--scaleオプションで画像の縮小率、--zoomでタイルのズームレベル範囲を制御できるため、用途に応じたタイルセットの生成が可能です。

Leaflet-IIIFでの座標変換

Leaflet-IIIFを使ってIIIF画像を表示する場合、マニフェストに含まれるアノテーションの座標(xywh形式)を正確に画像上の位置に対応づけるには、Leaflet-IIIFの内部的な座標変換ロジックを理解する必要があります。

座標変換の課題

IIIF Presentation API v3では、アノテーションの対象領域はxywh=x,y,w,h形式で指定されます。これは元画像のピクセル座標ですが、Leaflet-IIIFは画像を複数のズームレベルで縮小管理しているため、単純なmap.unproject()では正しい位置にマッピングできません。

正しい変換方法

Leaflet-IIIFの_fitBoundsメソッドの内部ロジックを再現する方法が正解です。

function imageToLatLng(imgX, imgY) {
    // Leaflet-IIIFの初期ズームレベルを取得
    const initialZoom = iiifLayer._getInitialZoom(map.getSize());
    const offset = iiifLayer._imageSizes.length - 1
                   - iiifLayer.options.maxNativeZoom;
    const imageSize = iiifLayer._imageSizes[initialZoom + offset];

    // 元画像座標を正規化し、縮小画像の座標に変換
    const normX = imgX / iiifLayer.x;
    const normY = imgY / iiifLayer.y;
    const scaledX = normX * imageSize.x;
    const scaledY = normY * imageSize.y;

    // Leaflet座標に変換
    return map.options.crs.pointToLatLng(
        L.point(scaledX, scaledY), initialZoom
    );
}

要点は、元画像のピクセル座標をそのまま使うのではなく、Leaflet-IIIFが内部で管理する「そのズームレベルでの縮小された画像サイズ」に基づいてスケーリングすることです。この方法により、アノテーションの矩形領域をピクセル精度で正確に配置できます。

実用例:歴史地図のデジタル化

ここまで紹介した技術を組み合わせることで、歴史地図のデジタル化と公開に関する包括的なワークフローが構築できます。

ワークフローの全体像

  1. 画像の公開: 歴史地図をIIIF Image APIに対応した画像サーバー(Cantaloupeなど)で公開する
  2. マニフェスト作成: IIIF Presentation API v3のマニフェストを作成し、画像のメタデータを記述する
  3. ジオリファレンス: Allmaps Editorで画像と現代地図の対応点を設定する
  4. メタデータ付与: Linked Places Formatで各地点の名称、分類、外部リソースとの関連を記述する
  5. ビューア公開: MapLibre GL JSベースのジオリファレンスビューアで公開する
  6. タイル配信: 必要に応じてXYZタイルに変換し、一般的な地図サービスに統合する

このワークフローの利点は、すべてのステップがオープンな標準仕様に基づいているため、特定のベンダーやソフトウェアに依存しないことです。Allmapsで作成したジオリファレンスデータは、他の研究者が別のビューアで再利用でき、LPFで記述したメタデータは地名辞典プロジェクト(World Historical Gazetteer、Pleiadesなど)と連携可能です。

今後の展望

IIIF Georeference Extensionの活用は、歴史地図の単なるデジタル化にとどまりません。時間情報を組み合わせた時系列表示、3D地形との重ね合わせ、機械学習による自動GCP検出など、発展の可能性は広がっています。LPFのwhenプロパティを活用すれば、ある建物が「1877年から1923年まで存在した」といった時間軸上の情報を表現でき、歴史的な景観の変遷を可視化する基盤となるでしょう。