如何在 QGIS 中對地圖或影像做地理對位
Published

若要在 QGIS 中對地圖或影像做地理對位,請開啟 Layer > Georeferencer,用 Open Raster 載入掃描檔,點選至少四個你能辨識的點並輸入它們的真實坐標,在 Transformation Settings 中選擇 Polynomial 1 與一個投影目標 CRS,然後按下 Start Georeferencing。QGIS 會寫出一個 GeoTIFF,並將它加入你的專案。
放點是簡單的部分。多數教學略過的是怎麼判讀結果,因為 QGIS 顯示給你的數字,在一張偏差數百公尺的地圖上也可能還是零。我對一張 1947 年舊金山 USGS 地圖做了地理對位,並用擬合從未看過的點來量測每一個結果。以下數字都來自那次測試。
簡短答案
| 你的輸入 | 方法 | 時間或成本 |
|---|---|---|
| 印有坐標的掃描檔(經緯網、方格刻度、角落數值) | 方法 1,輸入印在圖上的數值 | 免費。8 個點,接著在 6,888 x 8,933 px 的掃描檔上做 34 秒的 warp |
| 沒有坐標的掃描檔,或地圖的照片 | 方法 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。
在點任何東西之前,先讀圖框外緣。它會告訴你之後要輸入的三件事:印出數值所用的坐標系統、基準,以及比例尺。我的範例是 1947 年 USGS 的加州舊金山北(San Francisco North, CA)圖幅,比例尺 1:24,000,任何人都可以從 topoView 下載。它的圖框外緣寫著「Polyconic projection. 1927 North American datum」,四角每隔 7'30" 標有經緯度。USGS 的歷史地圖屬於公有領域。
為了讓測試誠實,我拿了 USGS 自己做的該圖幅 GeoTIFF,並移除它的地理對位資訊,所以我載入 QGIS 的是一張單純的 9.2 MB JPEG,6,888 x 8,933 像素。這大約是 300 dpi,也就是每像素對應 2.03 公尺的地面距離。USGS 的地理對位則留在旁邊當作解答。
網路上常見的錯誤說法
「RMSE 越低,結果越好。」 用 thin plate spline 就不是這麼回事。這個轉換會把影像彎曲,直到它精確通過每一個點,所以它的殘差永遠是零。我故意把一個緯度打錯,把 37°47'30" 打成 37°47',然後用同樣八個點跑這兩種轉換。Polynomial 1 顯示 RMSE 為 297 m,其中 762 m 都落在那個錯的點上。Thin plate spline 顯示 0.00 m,而地圖在它沒被給定的點上偏差最多達 594 m。
「用 WGS 84 輸入坐標。」 較舊的美國地圖上印的數值通常是 NAD27,圖框外緣也這麼寫。在舊金山,同一個經緯度在 NAD27 與 WGS 84 之間相差 93 m,其中 92 m 是東西向。把它們當成 EPSG:4326 輸入,整張圖幅就會落在一個街區之外,而殘差看起來完美,因為每個點都一起移動了。在 Enter Map Coordinates 對話框中,把點位的 CRS 設成圖框外緣所寫的那個:NAD27 就是 EPSG:4267。
「把目標 CRS 留在度(degrees)。」 你可以這麼做,但在經緯度上做平面仿射擬合,和投影地圖被繪製的方式並不相符。用同樣八個點,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。
把點位分散開
在每個角落附近放一個,中間再放幾個。全部擠在一區的點只會擬合那一區,讓圖幅其餘部分跑掉。我用的是圖框的四個角落,以及框內的四個經緯網交叉點。

你新增的每一個點都會存進影像旁的 .points 檔。留著它:下次開啟同一張掃描檔時,Georeferencer 會自行載入,你可以修正某個點,而不必從頭來過。
選擇轉換方式
Settings > Transformation Settings 裡有最重要的選擇。QGIS 3.44 手冊 列出七種轉換方式,以及這些最少點數:
| 轉換方式 | 最少點數 | 適用於 |
|---|---|---|
| Linear | 2 | 只需要平移與縮放的乾淨掃描檔。會寫出 world file,不做 warp |
| Helmert | 2 | 同上,再加上旋轉 |
| Polynomial 1 | 3 | 大多數印刷地圖的平坦掃描檔。直線保持直線 |
| Projective | 4 | 以斜角拍攝的地圖照片 |
| Polynomial 2 | 6 | 捲曲或彎折的圖幅。會讓點位之外的邊緣扭曲 |
| Polynomial 3 | 10 | 同上,但更強。很少值得用 |
| Thin plate spline | 手冊說 10 | 點位很多、破損或手繪的地圖。會掩蓋誤差,見上文 |
我的原則:從 Polynomial 1 開始。只有在殘差顯示出某種模式時,才改用更彈性的方法,例如某一側的每個點都往同一個方向偏,而且絕不是因為數字更高的方法看起來比較差就改。

那個對話框上有兩項設定可以省去後續麻煩。Resampling method 會改變 warp 後像素的外觀:nearest neighbour 保留原始色彩,cubic 在掃描檔上讀起來更好。而輸出預設沒有壓縮:我那張 9.2 MB 的 JPEG 變成了 187 MB 的 GeoTIFF。如果檔案要傳出去,請開啟 Raster creation options 並選一個壓縮設定。
讀懂殘差
當你的點數多於該轉換所需,QGIS 會在 GCP 表格中顯示每個點的殘差,並在狀態列顯示平均誤差;對於沒有坐標的掃描檔,兩者都以像素為單位。

要判斷一個像素數字,把它換算成公尺,再和這張地圖本身能提供的精度相比。
- 每像素幾公尺。 將比例尺分母乘以一個掃描像素的大小。在 300 dpi 下,一個像素是 0.0847 mm,所以在 1:24,000 的地圖上它涵蓋 2.03 m。我的 0.447 像素就是 0.9 m。
- 地圖能承諾什麼。 美國國家地圖精度標準要求 1:24,000 圖幅上 90% 的明確點位落在 1/50 英寸之內,USGS 給出的數值是 12.2 m。更嚴格的經驗法則是一條繪製線條的寬度,在圖紙上是 0.2 mm,在 1:24,000 下等於 4.8 m。
- 擬合從未看過的點。 殘差只說明這些點彼此一致。我把邊緣上八個經緯網刻度排除在擬合之外,並量測結果把它們放到了哪裡:平均偏差 1.0 m,最差 1.6 m。
所以地理對位為一張只承諾 12 m 的地圖增加了約一公尺的誤差。在舊圖幅上,限制幾乎總是地圖本身,而不是你的點擊。
接著 Start Georeferencing 在 34 秒內寫出 GeoTIFF,並將它加入專案。在 OpenStreetMap 上,1947 年的街道落在今日的街道上:


適用時機: 你想要一個站得住腳的結果,附有殘差、.points 檔,以及任何 GIS 都能讀取的 GeoTIFF。
不適用時機: 你只是暫時需要一個粗略的背景圖幾分鐘。方法 3 對這種情況更快。
方法 2:由 AI 代理檢查控制點
我們開發了 AI Agent,一個免費的 QGIS plugin,附有聊天面板,會在你的專案中執行這些步驟。本節談的是我們自己的工具。它有一個地理對位工具,接收像素與坐標成對的控制點,透過 GDAL 擬合 Georeferencer 的其中一種轉換,並回傳每個點的殘差(以公尺計),對照地圖比例尺來判斷。
它也能在完全沒有點的情況下放置掃描檔,方法是讀取地名並與參考地圖比對:AI Agent 指南 裡一張愛丁堡的舊地圖,定位後中位數誤差為 5.9 m。這需要可讀的地名,而非常舊的圖幅往往會失敗。對於印有經緯網的地圖,點位是更可靠的路線,而且讀取很快:沒有坐標的影像放進 QGIS 後,像素的欄是 x、列取負值是 y,所以狀態列會顯示游標下的像素。我載入了掃描檔,保留上面測試中第 8 點的錯字,然後送出一則訊息:
幫我把 layer sf-north-1947-scan 做地理對位。它是 1947 年 USGS 的 San Francisco North 圖幅,比例尺 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 點與它那一列應在的位置相差 925 m,於是將它排除,並用其餘七個點在 NAD27 / UTM zone 10N 中寫出 GeoTIFF。
它在執行自己的 Python 檢查之前問了一次。它的回答給出 RMSE 0.73 m、最大值 0.95 m,對照 4.8 m 的容忍值,並補充說這量測的是點與點之間的一致性,而不是地圖的絕對精度。

我用和我的結果相同的方式檢查它的 GeoTIFF,也就是用它從未看過的八個邊緣刻度:平均偏差 1.0 m,最差 1.6 m,和 Georeferencer 一樣。差別在於那個錯字。在 Georeferencer 中,我得自己從殘差欄位看出來;而如果用 thin plate spline,我根本不會發現。
它也會把點位以 .points 檔留在輸出旁,所以如果你想手動移動某個點,同樣的擬合可以在 Georeferencer 中開啟。每一則訊息都會在面板留下一個檢查點,按一下就能撤銷整次執行。免費方案每月有 10 則訊息,不需要 API key,也不需要信用卡。
適用時機: 你已經有點位,想一步完成擬合、離群點檢查與判讀,或者你是一整批圖幅在連續做地理對位。
不適用時機: 地圖既沒有可讀的地名,也沒有你能讀取的點位,例如手繪草圖。這時只能用手在方法 1 中放點。
方法 3:用 plugin 做手繪式套疊
Freehand raster georeferencer plugin,我讀它的文件時版本是 0.8.3,讓你把影像放到地圖上,用手移動、旋轉與縮放,直到它對齊,就像在 Google Earth 裡那樣。結果會立刻顯示在你其他 layer 之上,完成後 plugin 會把影像連同 world file 匯出。
它的 README 對限制說得很清楚:只支援仿射轉換,沒有 rubber sheeting,沒有殘差,而且只接受 BMP、JPEG、PNG 與 TIFF 檔。你不會得到任何告訴你偏差多少的數字。
適用時機: 你需要把一張掃描的平面圖大致擺到位置上,以便描繪幾個地物,或向客戶展示某處以前是什麼樣子。
不適用時機: 有人會在結果上進行量測。請使用方法 1。
重點回顧
- 在 QGIS 3.26 與更新版本中,這個工具位於
Layer > Georeferencer。從四個分散良好的點、Polynomial 1,以及位於地圖自身基準上的投影目標 CRS 開始。 - RMSE 為零什麼都證明不了:thin plate spline 永遠能達到,而在我的測試中,它是在一張偏差 594 m 的地圖上達到的。
- 把殘差換算成公尺(像素 x 單一像素的地面大小),並與地圖承諾的精度相比: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 手冊對 thin plate spline 要求 10 個以上。實務上請用大約兩倍的最少點數,分散到各角落,並多留幾個當檢查點。我用 8 個跑 Polynomial 1,另外 8 個用來檢查。
Polynomial、Helmert 還是 thin plate spline:該用哪一個?
乾淨平坦、只需要旋轉與縮放的掃描檔用 Helmert。幾乎所有印刷地圖都用 Polynomial 1,因為它也能吸收掃描器造成的小幅剪切。thin plate spline 只用於點位很多、破損或手繪的地圖,而且要用你沒用到的點來檢查,因為它的殘差永遠是零。
什麼樣的 RMSE 算好?
比起地圖本身能提供的精度,數值算小就是好。把它換算成公尺,與 0.2 mm 乘以比例尺分母相比(1:24,000 時是 4.8 m),或與該地圖的官方標準相比(USGS 1:24,000 圖幅是 12.2 m)。在乾淨的掃描檔上低於一個像素是正常的。單一一個點的殘差遠高於其他點,通常是打錯字或點錯位置,而不是地圖不好。
我要如何對 PDF 做地理對位?
先確認它是不是已經對位好了。USGS 的地形圖和許多機關的圖說都是 GeoPDF,QGIS 會直接就地開啟:1947 年舊金山那份 PDF 載入時就帶著坐標,不需要控制點,由 GDAL 以 150 dpi 算繪,除非你把 GDAL_PDF_DPI 設得更高。單純的 PDF 沒有坐標:請把頁面以 300 dpi 匯出成 PNG 或 TIFF,然後使用方法 1。
我要如何對一張上面沒有坐標的地圖做地理對位?
使用自地圖繪製以來就沒有移動過的地物,例如道路交叉口、橋樑、教堂與海岸線轉角,並在底圖或你的國家正射影像上以 From Map Canvas 取得它們的坐標。在圖幅上分散放 10 個以上。預期殘差會比有印刷方格時更大,因為舊地圖與今日的世界已不再處處吻合。
QGIS AI hub 彙整了 AI 在 QGIS 裡能做與不能做的事,AI Agent 指南 則涵蓋這個 plugin 的其他部分。舊地圖就定位之後,你可以下載 OpenStreetMap 資料 與今日的街道比對、取得同一區域的 Sentinel-2 影像,或把掃描檔轉成向量。
中對地圖或影像做地理對位,請開啟 

