跳转到内容
AI Agent
QGIS
教程

如何在 QGIS 中对地图或影像进行地理配准

Published

一张 1947 年 USGS 旧金山地形图被分成两半:左边是普通扫描图,右边是同一张地图经过地理配准并叠加在 OpenStreetMap 上,海湾大桥延伸到地图边缘之外,标题为 Georeferencing in QGIS。
1947 年旧金山北(San Francisco North)图幅,配准前后。地图:USGS,公有领域。底图:OpenStreetMap 贡献者。

要在 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 秒的变形
没有坐标的扫描图,或地图的照片方法 1,在底图上使用 From Map Canvas免费。预计需要 10 个或更多点
来自 USGS 或其他机构的 GeoPDF直接打开,它已经配准好了免费,零个点
已经读取了点,并且希望有人帮你检查拟合方法 2,AI Agent1 条消息,在我的测试中为 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' 而不是 37°47'30",然后在同样的八个点上运行了两种变换。Polynomial 1 显示 RMSE 为 297 米,其中 762 米落在那个坏点上。薄板样条显示 0.00 米,而地图在那些未被提供给它的点上最多偏了 594 米。

"把坐标按 WGS 84 输入。" 较旧的美国地图上所印的数值通常是 NAD27,图廓注记也是这么写的。在旧金山,同样的经纬度在 NAD27 和 WGS 84 中相差 93 米,其中 92 米是东西方向的。把它们当作 EPSG:4326 输入,整张图幅就会落在一条街之外,而残差看起来完美,因为每个点都一起移动了。在 Enter Map Coordinates 对话框中,把点的 CRS 设置为图廓注记所写的内容:NAD27 对应 EPSG:4267。

"把目标 CRS 留在度(degrees)上。" 你可以这么做,但在经纬度上做平面仿射拟合,与投影地图的绘制方式并不匹配。在同样的八个点上,以 EPSG:4267 为目标时,Polynomial 1 给出的 RMSE 为 2.98 米,而以 NAD27 / UTM zone 10N (EPSG:26710) 为目标时为 0.72 米。选择地图基准面上的投影 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。

分散布点

在每个角附近放一个点,中间再放几个。挤在一个区域里的点只会拟合那个区域,而让图幅的其余部分漂移。我使用了图框的四个角和其中的四个经纬网十字。

上图:Georeferencer 放大到图框的 25 分刻度,刻度上有一个绿点。下图:Enter Map Coordinates 对话框,已输入 -122 25 0 和 37 52 30,并选择了 EPSG:4267 NAD27。
在上边缘的 25' 刻度上点击一次,然后以度、分、秒输入其印出的数值,使用 NAD27。

你添加的每一个点都会写入影像旁边的一个 .points 文件。保留它:下次打开同一张扫描图时,Georeferencer 会自行加载它,你可以修正某个点,而不必从头再来。

选择变换

Settings > Transformation Settings 中存放着最重要的选择。QGIS 3.44 手册 列出了七种变换,以及这些最少点数要求:

变换最少点数用途
Linear2只需要平移和缩放的干净扫描图。写出 world file,不做变形
Helmert2同上,另加旋转
Polynomial 13大多数印刷地图的平面扫描图。直线保持笔直
Projective4倾斜拍摄的地图照片
Polynomial 26卷曲或弯曲的图幅。会在你的点之外使边缘变形
Polynomial 310同上,更强。很少值得使用
Thin plate spline手册中为 10有许多点的破损或手绘地图。会掩盖误差,见上文

我的原则:从 Polynomial 1 开始。只有当残差显示出某种规律时(例如一侧的每个点都朝同一方向拉扯)才改用更灵活的变换,绝不要因为更高的数字看起来更差就这么做。

Transformation Settings 对话框,选择 Polynomial 1,目标 CRS 为 EPSG:26710 NAD27 / UTM zone 10N,输出文件以 _modified.tif 结尾,重采样为 Cubic。
我使用的设置:Polynomial 1,地图自身基准面上的投影 CRS,使用 cubic 重采样以获得更平滑的扫描图。

该对话框上的两个设置能省去日后的麻烦。Resampling method 会改变变形后像素的外观:最近邻保留原始颜色,cubic 在扫描图上观感更好。而且输出默认没有压缩:我那张 9.2 MB 的 JPEG 变成了 187 MB 的 GeoTIFF。如果文件需要传输,打开 Raster creation options 并选择一个压缩配置。

读取残差

当你的点数超过变换所需时,QGIS 会在 GCP 表中显示每个点的残差,并在状态栏中显示平均误差;对于没有坐标的扫描图,两者都以像素为单位。

Georeferencer 窗口,显示 1947 年旧金山北扫描图和八个红色控制点,GCP 表列出源坐标和目标坐标以及 0.15 到 0.46 像素之间的残差,状态栏显示 Transform: Polynomial 1 Mean error: 0.447243。
八个点,Polynomial 1:残差从 0.15 到 0.46 像素,平均误差 0.447 像素,约合地面上 0.9 米。

要判断一个以像素表示的数值,把它换算成米,并与地图本身所能达到的精度进行比较。

  1. 每像素米数。 将比例尺分母乘以一个扫描像素的尺寸。在 300 dpi 下,一个像素为 0.0847 毫米,所以在 1:24,000 的地图上它覆盖 2.03 米。我的 0.447 像素就是 0.9 米。
  2. 地图能承诺什么。 美国国家地图精度标准要求 1:24,000 图幅上 90% 的清晰定义点在 1/50 英寸以内,USGS 给出的数值是 12.2 米。更严格的经验法则是所绘线条的宽度,即图幅上的 0.2 毫米,在 1:24,000 下为 4.8 米。
  3. 拟合从未见过的点。 残差只能说明这些点彼此一致。我把边缘上的八个经纬网刻度排除在拟合之外,并测量结果把它们放在了哪里:平均偏 1.0 米,最差 1.6 米。

所以地理配准给一张只承诺 12 米精度的地图增加了约一米误差。在旧图幅上,限制几乎总是地图本身,而不是你的点击。

随后 Start Georeferencing 在 34 秒内写出了 GeoTIFF 并把它添加到项目中。在 OpenStreetMap 上,1947 年的街道落在今天的街道上:

旧金山 Marina 区和 Fort Mason 的 OpenStreetMap,然后是同一视图叠加 55% 不透明度的已地理配准的 1947 年 USGS 地图,Lombard Street 和海岸线对齐 (after)
旧金山 Marina 区和 Fort Mason 的 OpenStreetMap,然后是同一视图叠加 55% 不透明度的已地理配准的 1947 年 USGS 地图,Lombard Street 和海岸线对齐 (before)
OpenStreetMap1947 年地图
拖动比较
旧金山的 Marina 和 Fort Mason。滑动以将 1947 年的图幅叠加到今天的地图上。

适合使用的情况: 你想要一个经得起推敲的结果,带有残差、.points 文件和任何 GIS 都能读取的 GeoTIFF。

不适合使用的情况: 你只需要一个临时的粗略底图。那种情况下方法 3 更快。

方法 2:由 AI Agent 检查控制点

我们开发了 AI Agent,这是一个免费的 QGIS plugin,带有一个聊天面板,可在你打开的项目中执行这些步骤。本节介绍的是我们自己的工具。它有一个地理配准工具,接收以像素和坐标对表示的控制点,通过 GDAL 拟合 Georeferencer 的某一种变换,并返回每个点相对于地图比例尺判断的、以米为单位的残差。

它也可以在完全没有点的情况下放置一张扫描图,方法是读取其地名并与参考地图匹配:AI Agent 指南 中一张爱丁堡的旧地图以 5.9 米的中位误差落位。这需要可读的地名,而非常古老的图幅往往做不到。对于印有经纬网的地图,用点更稳妥,而且读取它们很快:没有坐标的影像在 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 个操作。AI Agent 读取了 layer,在 Python 中拟合这八个点以检查它们,发现第 8 个点距其行号所应在的位置有 925 米,于是把它排除,并用其余七个点在 NAD27 / UTM zone 10N 中写出了 GeoTIFF。

它在运行自己的 Python 检查之前询问过一次。它的回答给出 RMSE 为 0.73 米,最大值为 0.95 米,对照 4.8 米的容差,并补充说这衡量的是点之间的一致性,而非地图的绝对精度。

QGIS 中已地理配准的 1947 年旧金山地图以 72% 不透明度叠加在 OpenStreetMap 上,右侧的 AI Agent 面板说明第 8 个点因偏差约 925 米而被排除,以及 0.73 米的 RMS 误差和 4.8 米的容差。
一条消息,99 秒:第 8 个点的笔误被发现并剔除,其余七个点的 RMSE 为 0.73 米,结果叠加在底图上。

我用和我自己的结果相同的方式检查了它的 GeoTIFF,用那八个它从未见过的边缘刻度:平均偏 1.0 米,最差 1.6 米,与 Georeferencer 相同。区别在于那个笔误。在 Georeferencer 中,我得自己从残差列中发现它,而如果用薄板样条,我根本发现不了。

它还把点以 .points 文件的形式留在输出旁边,所以如果你想手动移动某个点,可以在 Georeferencer 中打开同样的拟合。每条消息都会在面板中留下一个检查点,点击一次即可撤销整个运行。免费方案每月有 10 条消息,无需 API key,也无需信用卡。

适合使用的情况: 你已经有了点,并希望一步完成拟合、异常值检查和结论,或者你要批量地理配准图幅。

不适合使用的情况: 地图既没有可读的地名,也没有你能读取的点,例如手绘草图。这时在方法 1 中手动放点是唯一的途径。

在 QGIS 中免费试用 AI Agent

方法 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 为零不能证明任何事:薄板样条总能达到它,而在我的测试中,它在一张偏了 594 米的地图上也做到了。
  • 把残差换算成米(像素 × 一个像素对应的地面尺寸),并与地图承诺的精度比较,1:24,000 的 USGS 图幅为 12.2 米。
  • 用你排除在拟合之外的点检查结果。在 1947 年旧金山图幅上,我的结果平均偏 1.0 米。
  • 按图廓注记所指明的基准面输入这些点。在旧金山,NAD27 与 WGS 84 相差 93 米,所以 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 个。实践中使用大约两倍于最少值的点数,分布到各个角,并另外留几个作为检查点。我为 Polynomial 1 使用了 8 个,另用 8 个来检查。

Polynomial、Helmert 还是薄板样条:该选哪个?

对于只需要旋转和缩放的干净、平整扫描图,用 Helmert。对于几乎所有印刷地图,用 Polynomial 1,因为它还能吸收扫描仪带来的一点错切。只有在处理有许多良好点位的破损或手绘地图时才用薄板样条,并且要用你未使用的点来检查它,因为它的残差永远是零。

什么样的 RMSE 算好?

相对于地图所能达到的精度而言很小的那个。把它换算成米,并与 0.2 毫米乘以比例尺分母(1:24,000 下为 4.8 米)或与地图的官方标准(USGS 1:24,000 图幅为 12.2 米)比较。在干净的扫描图上小于一个像素是正常的。某个点的残差远高于其他点,通常是笔误或点错了,而不是地图不好。

如何对 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 影像,或 把扫描图转成矢量

在 QGIS 中免费试用 AI Agent