コンテンツへスキップ
ブログに戻る
AI Agent
QGIS
チュートリアル

QGISで地図や画像をジオレファレンスする方法

Published

2つに分割された1947年のUSGSサンフランシスコ地形図。左は普通のスキャン、右は同じ地図をジオレファレンスしてOpenStreetMapに重ねたもので、ベイブリッジが地図の端を越えて続いており、Georeferencing in QGISというタイトルが付いている。
1947年のサンフランシスコ北図幅、ビフォーアフター。地図:USGS、パブリックドメイン。ベースマップ:OpenStreetMap contributors。

QGISで地図や画像をジオレファレンスするには、Layer > Georeferencerを開き、Open Rasterでスキャンを読み込み、特定できる点を4つ以上クリックして実際の座標を入力し、Transformation SettingsPolynomial 1と投影ターゲットCRSを選び、Start Georeferencingを押します。QGISはGeoTIFFを書き出し、プロジェクトに追加します。

点を置くのは簡単な部分です。多くのチュートリアルが飛ばしているのは結果の判定です。というのも、QGISが表示する数値は、数百メートルずれている地図でもゼロになり得るからです。私は1947年のUSGSサンフランシスコの地図をジオレファレンスし、すべての結果を、フィットに使っていない点で測定しました。以下の数値はそのテストから来ています。

手短な答え

入力方法時間またはコスト
座標が印刷されたスキャン(経緯線、グリッドの目盛り、四隅の値)方法1、印刷された値を入力無料。8点、その後6,888 x 8,933 pxのスキャンで34秒のワープ
座標のないスキャン、または地図の写真方法1、ベースマップ上でFrom Map Canvas無料。10点以上を見込む
USGSや他機関のGeoPDF直接開く、すでに配置されている無料、点は不要
点をすでに読み取っており、フィットの確認を任せたい方法2、AIエージェント1メッセージ、私のテストでは99秒
素早い視覚的なオーバーレイ、精度不要方法3、Freehand raster georeferencer plugin無料のplugin

始める前に

QGIS 3.26以降が必要です。そこではGeoreferencerはLayerメニューにあります。私はQGIS 3.44.7を使いました。古いチュートリアルはRaster > Georeferencerへ案内しますが、それは以前そこにあった場所で、GDAL Georeferencer pluginとして存在していました。

何かをクリックする前に地図の外縁(collar)を読みましょう。そこには後で入力する3つの情報が書かれています。印刷された値の座標系、測地系(datum)、そして縮尺です。私のサンプルは1947年のUSGSサンフランシスコ北、カリフォルニア州の図幅で、1:24,000、誰でもtopoViewからダウンロードできます。その外縁には「Polyconic projection. 1927 North American datum」と書かれ、四隅には7'30"ごとの緯度経度が付いています。USGSの歴史地図はパブリックドメインです。

テストを公平にするため、私はその図幅のUSGS自身のGeoTIFFを入手し、そのジオレファレンス情報を削除しました。そのためQGISに読み込んだのは、6,888 x 8,933ピクセルの普通の9.2 MBのJPEGでした。これは約300 dpi、つまり1ピクセルあたり地上2.03 mです。USGSのジオレファレンス情報は答え合わせ用に取っておきました。

ネット上の情報が間違っているところ

「RMSEが低いほど結果が良い。」 薄板スプラインではそうなりません。この変換は画像を曲げてすべての点を正確に通すため、残差は常にゼロになります。私はわざと1つの緯度を間違えて入力し、37°47'30"ではなく37°47'とし、同じ8点で両方の変換を実行しました。Polynomial 1はRMSE 297 mを示し、そのうち762 mをその不良点に割り当てました。薄板スプラインは0.00 mを示し、地図は与えられていない点で最大594 mずれていました。

「座標はWGS 84で入力する。」 古い米国の地図に印刷された値は多くの場合NAD27で、外縁にそう書かれています。サンフランシスコでは、NAD27とWGS 84で同じ緯度経度は93 m離れており、そのうち92 mは東西方向です。それらをEPSG:4326として入力すると、図幅全体が1ブロック先に着地し、残差は完璧に見えます。すべての点が一緒に動いたからです。Enter Map Coordinatesダイアログで、点のCRSを外縁に書かれたものに設定します。NAD27ならEPSG:4267です。

「ターゲットCRSは度のままでよい。」 それでも構いませんが、緯度経度での平坦なアフィン変換は、投影された地図が描かれた方法と一致しません。同じ8点で、Polynomial 1はターゲットをEPSG:4267にするとRMSE 2.98 m、NAD27 / UTM zone 10N(EPSG:26710)にすると0.72 mでした。地図の測地系に基づく投影CRSを選べば、フィットもメートルで読めます。

方法1:QGIS Georeferencer

これは組み込みツールで、最初に覚えるべきものです。座標が印刷されたスキャンにも、そうでないスキャンにも使えます。

スキャンを開く

Layer > Georeferencer、次にFile > Open Rasterで画像を選びます。JPEG、PNG、TIFFのいずれも使えます。

コントロールポイントを追加する

Add GCP Pointをクリックし、ズームインして正確に特定できる場所をクリックします。地図の枠の角、経緯線の交点、グリッドの目盛りなどです。Enter Map Coordinatesダイアログが開きます。印刷された座標を入力します。スペース区切りの度分秒(-122 25 0)、十進度、投影メートルのいずれも受け付けます。フィールドの下のCRSを、外縁に書かれたものに設定します。

または地図キャンバスから座標を取得する

スキャンに座標がない場合は、まずメインのQGISウィンドウでベースマップを読み込み(ベースマップガイドにクリック手順があります)、From Map Canvasを押してベースマップ上の同じ場所をクリックします。QGISが座標とCRSを自動で入力します。

点を分散させる

各隅の近くに1つずつ、中央にいくつか置きます。1か所に集中した点はその領域にフィットし、図幅の残りはずれてしまいます。私は地図の枠の四隅と、その内側の4つの経緯線の交点を使いました。

上:地図の枠の25分の目盛りにズームしたGeoreferencer、目盛りの上に緑の点。下:-122 25 0と37 52 30が入力され、EPSG:4267 NAD27が選択されたEnter Map Coordinatesダイアログ。
上端の25'の目盛りを1回クリックし、その印刷された値を度分秒で、NAD27で入力したところ。

追加した各点は、画像の隣の.pointsファイルに保存されます。これを残しておきましょう。次に同じスキャンを開くとGeoreferencerが自動で読み込み、最初からやり直す代わりに点を修正できます。

変換を選ぶ

Settings > Transformation Settingsに、最も重要な選択があります。QGIS 3.44マニュアルには7つの変換と、それぞれの最小点数が載っています。

変換最小点数用途
Linear2平行移動と拡大縮小だけが必要なきれいなスキャン。ワールドファイルを書き出し、ワープはしない
Helmert2それに回転を加えたもの
Polynomial 13印刷地図の平坦なスキャンの大半。直線は直線のまま
Projective4斜めから撮影した地図の写真
Polynomial 26反ったり曲がったりした図幅。点より外側の端がゆがむ
Polynomial 310同じだがより強い。ほとんど価値はない
Thin plate splineマニュアルによると10多くの点がある損傷した、または手描きの地図。誤差を隠す。上記参照

私のルール:Polynomial 1から始めます。より柔軟なものへ移るのは、残差にパターンが見えるときだけです。たとえば片側のすべての点が同じ方向に引っ張られている場合などで、より大きな数字の方が悪く見えたからといって移ることは決してしません。

Polynomial 1、ターゲットCRS EPSG:26710 NAD27 / UTM zone 10N、_modified.tifで終わる出力ファイル、Cubicリサンプリングが設定されたTransformation Settingsダイアログ。
私が使った設定:Polynomial 1、投影CRSでの地図自身の測地系、より滑らかなスキャンのためのcubicリサンプリング。

このダイアログの2つの設定が後々の手間を省きます。Resampling methodはワープ後のピクセルの見え方を変えます。最近傍は元の色を保ち、cubicはスキャンでより見やすくなります。また、出力は既定では圧縮されません。私の9.2 MBのJPEGは187 MBのGeoTIFFになりました。ファイルをやり取りする場合は、Raster creation optionsを開いて圧縮プロファイルを選びましょう。

残差を読む

変換に必要な数より多くの点があると、QGISはGCPテーブルに各点の残差を、ステータスバーに平均誤差を表示します。座標のないスキャンではどちらもピクセル単位です。

サンフランシスコ北1947のスキャンと8つの赤いコントロールポイントが表示されたGeoreferencerウィンドウ、ソースと宛先の座標および0.15~0.46ピクセルの残差を並べたGCPテーブル、Transform: Polynomial 1 Mean error: 0.447243と表示されたステータスバー。
8点、Polynomial 1:残差は0.15~0.46ピクセル、平均誤差0.447ピクセル、地上で約0.9 m。

ピクセルの数値を評価するには、メートルに変換し、地図自体が出せる精度と比較します。

  1. 1ピクセルあたりのメートル。 縮尺の分母にスキャンピクセルの大きさを掛けます。300 dpiでは1ピクセルは0.0847 mmなので、1:24,000の地図では2.03 mを覆います。私の0.447ピクセルは0.9 mです。
  2. 地図が保証できる精度。 米国国家地図精度標準(US National Map Accuracy Standards)は、1:24,000の図幅上の明確な点の90パーセントが1/50インチ以内にあることを要求しており、USGSはこれを12.2 mとしています。より厳しい目安は、描かれた線の幅で、図幅上0.2 mm、1:24,000では4.8 mです。
  3. フィットが見ていない点。 残差は点同士が一致していることしか示しません。私は縁に沿った8つの経緯線の目盛りをフィットから外し、結果がそれらをどこに置いたかを測定しました。平均1.0 m、最悪で1.6 mのずれでした。

つまり、ジオレファレンスは、12 mしか保証しない地図に約1メートルの誤差を加えただけです。古い図幅では、ほぼ常に地図が限界であり、あなたのクリックではありません。

Start Georeferencingは34秒でGeoTIFFを書き出し、プロジェクトに追加しました。OpenStreetMap上では、1947年の街路が今日の街路に重なります。

サンフランシスコのマリーナ地区とフォートメイソンのOpenStreetMap、次に同じ表示でジオレファレンスされた1947年のUSGS地図を55パーセントの不透明度で重ねたもの。ロンバード街と海岸線が一致している (after)
サンフランシスコのマリーナ地区とフォートメイソンのOpenStreetMap、次に同じ表示でジオレファレンスされた1947年のUSGS地図を55パーセントの不透明度で重ねたもの。ロンバード街と海岸線が一致している (before)
OpenStreetMap1947年の地図
ドラッグして比較
サンフランシスコのマリーナ地区とフォートメイソン。スライドして1947年の図幅を今日の地図に重ねます。

使うべきとき: 残差、.pointsファイル、どのGISでも読めるGeoTIFFを備えた、説明責任を果たせる結果が欲しいとき。

飛ばすべきとき: 数分間の大まかな背景が欲しいだけのとき。その用途なら方法3の方が速いです。

方法2:AIエージェントが確認するコントロールポイント

私たちはAI Agentを作っています。これは無料のQGIS pluginで、チャットパネルから開いているプロジェクトで手順を実行します。このセクションは私たち自身のツールについてです。ジオレファレンスツールがあり、コントロールポイントをピクセルと座標のペアとして受け取り、GDALを通じてGeoreferencerの変換の1つをフィットし、地図の縮尺に対して判定した各点の残差をメートルで返します。

また、点をまったく使わずにスキャンを配置することもできます。地名を読み取り、参照地図と照合するのです。AI Agentガイドのエディンバラの古い地図は、中央値5.9 mの誤差で配置されました。これには読める地名が必要で、非常に古い図幅ではしばしば失敗します。経緯線が印刷された地図では、点を使う方が確実で、読み取りも素早くできます。座標のない画像はQGIS内でピクセル列をx、行の負数をyとして配置されるので、ステータスバーにカーソル下のピクセルが表示されます。私はスキャンを読み込み、上のテストのタイプミスを点8に残したまま、1つのメッセージを送りました:

layer sf-north-1947-scan をジオレファレンスして。1947年のUSGSサンフランシスコ北図幅で、縮尺1:24,000、座標はNAD27です。スキャン上でこれらのコントロールポイントを読み取りました(ピクセル列、行 → 緯度、経度):1. 1022, 792 → 37°52'30"N, 122°30'W(北西の角)[...] 8. 4632, 5344 → 37°47'N, 122°25'W。この結果は1:24,000の地図に十分な精度ですか?

実行は99秒かかり、パネルには14のアクションとして表示されました。エージェントはlayerを読み、確認のためにPythonで8点をフィットし、点8がその行の示す位置から925 m離れていることを見つけ、それを除外し、残りの7点からNAD27 / UTM zone 10NでGeoTIFFを書き出しました。

それは自身のPythonチェックを実行する前に一度確認を求めました。その回答は、4.8 mの許容値に対してRMSE 0.73 m、最大0.95 mを示し、これは点同士の一致を測るもので、地図の絶対精度ではないと付け加えました。

ジオレファレンスされた1947年のサンフランシスコ地図をOpenStreetMapの上に72パーセントの不透明度で重ねたQGIS、右側のAI Agentパネルには、点8が約925 mずれていたため除外されたこと、RMS誤差0.73 mと許容値4.8 mが説明されている。
1メッセージ、99秒:点8のタイプミスを見つけて除外し、残りの7点でRMSE 0.73 m、結果はベースマップ上に。

私はそのGeoTIFFを自分のものと同じ方法で、それが一度も見ていない8つの縁の目盛りで確認しました。平均1.0 m、最悪で1.6 mのずれで、Georeferencerと同じでした。違いはタイプミスです。Georeferencerでは自分で残差の列を見て気づく必要があり、薄板スプラインではまったく気づけなかったでしょう。

また、出力の隣に.pointsファイルとして点を残したので、手で点を動かしたい場合は同じフィットをGeoreferencerで開けます。各メッセージはパネルにチェックポイントを残し、1クリックで実行全体を元に戻せます。無料プランはAPIキーもカードも不要で、月10メッセージです。

使うべきとき: 点があり、フィット、外れ値チェック、判定を一度に得たいとき、または図幅を連続してジオレファレンスするとき。

飛ばすべきとき: 手描きのスケッチのように、読める地名も読める点もない地図のとき。その場合は方法1で手動で点を置くのが唯一の道です。

QGISでAI Agentを無料で試す

方法3:pluginによるフリーハンドのオーバーレイ

Freehand raster georeferencer plugin(私がドキュメントを読んだ時点でバージョン0.8.3)は、画像を地図上にドロップし、Google Earthでするように手で移動・回転・拡大縮小して位置を合わせられます。結果は他のlayerの上にすぐに表示され、終わったらpluginがワールドファイル付きで画像をエクスポートします。

READMEには限界が明確に書かれています。アフィン変換のみ、ラバーシーティングなし、残差なし、そしてBMP、JPEG、PNG、TIFFファイルのみです。どれだけずれているかを示す数値は得られません。

使うべきとき: いくつかの地物をトレースしたり、顧客に昔の場所を示したりするために、スキャンした図面を大まかに配置したいとき。

飛ばすべきとき: 誰かがその結果で測定するとき。方法1を使いましょう。

覚えておくこと

  • QGIS 3.26以降では、ツールはLayer > Georeferencerにあります。よく分散した4点、Polynomial 1、地図自身の測地系に基づく投影ターゲットCRSから始めましょう。
  • RMSEがゼロであることは何も証明しません。薄板スプラインは常にゼロに達し、私のテストでは594 mずれた地図でそうなりました。
  • 残差をメートルに変換し(ピクセル × 1ピクセルの地上での大きさ)、地図が保証する値と比較します。1:24,000のUSGS図幅では12.2 mです。
  • フィットから外しておいた点で結果を確認します。私のものは1947年のサンフランシスコ図幅で平均1.0 mのずれでした。
  • 点は外縁に書かれた測地系で入力します。サンフランシスコではNAD27はWGS 84から93 m離れているので、1947年のUSGS図幅はEPSG:4267を取ります。

よくある質問

QGISのGeoreferencerはどこにありますか?

QGIS 3.26以降ではLayer > Georeferencerにあります。古いバージョンではRaster > Georeferencerで、GDAL Georeferencer pluginが提供しており、pluginマネージャで有効化する必要がありました。どちらのメニューにも表示されない場合は、pluginまたはカスタマイズプロファイルがメニューを変更している可能性があります。

コントロールポイントはいくつ必要ですか?

最小値はLinearとHelmertが2、Polynomial 1が3、Projectiveが4、Polynomial 2が6、Polynomial 3が10で、QGISマニュアルは薄板スプラインに10以上を求めています。実際には最小値の約2倍を使い、四隅に分散させ、さらにいくつかをチェックポイントとして取っておきます。私はPolynomial 1に8点、確認用にさらに8点を使いました。

Polynomial、Helmert、薄板スプライン:どれを使うべきですか?

回転と拡大縮小だけが必要な、きれいで平坦なスキャンにはHelmert。ほとんどすべての印刷地図にはPolynomial 1。スキャナからの小さなせん断も吸収するからです。薄板スプラインは、多くの良い点がある損傷した、または手描きの地図にのみ使い、その場合は使わなかった点で確認します。残差は常にゼロだからです。

良いRMSEとは何ですか?

地図が出せる精度に比べて小さいものです。メートルに変換し、0.2 mm × 縮尺の分母(1:24,000で4.8 m)または地図の公式標準(USGS 1:24,000図幅で12.2 m)と比較します。きれいなスキャンで1ピクセル未満なら正常です。他の点よりはるかに大きい残差を持つ単一の点は、通常はタイプミスか誤クリックで、悪い地図ではありません。

PDFをジオレファレンスするには?

まず、すでにそうなっているか確認します。USGSの地形図や多くの機関の図面はGeoPDFで、QGISはそのまま開きます。1947年のサンフランシスコのPDFは座標付きでコントロールポイントなしで読み込まれ、GDAL_PDF_DPIを上げない限りGDALによって150 dpiでレンダリングされます。普通のPDFには座標がありません。ページを300 dpiでPNGまたはTIFFにエクスポートし、方法1を使います。

座標が載っていない地図をジオレファレンスするには?

地図が描かれてから動いていない地物を使います。道路の交差点、橋、教会、海岸線の角などで、ベースマップや国のオルソフォト上でFrom Map Canvasを使ってそれらの座標を取得します。10点以上を図幅全体に分散させます。印刷されたグリッドより大きな残差を想定してください。古い地図と現在の世界はもはやどこでも一致するわけではないからです。

QGIS AIハブには、QGIS内でAIにできることとできないことがまとめられており、AI Agentガイドではpluginの残りの部分を扱っています。古い地図を配置したら、OpenStreetMapデータをダウンロードして今日の街路と比較したり、同じ地域のSentinel-2画像を取得したり、スキャンをベクタに変換したりできます。

QGISでAI Agentを無料で試す