跳至內容
QGIS
教学
GeoAI

在 QGIS 中将栅格转换为矢量:每种方法,以及各自适用的场景

三个面板:以彩色像素网格绘制的土地覆盖栅格、通过 polygonize 追踪为阶梯状的相同边界,以及经过 dissolve、面积过滤、简化和平滑后再次显示为平滑绿色线条的相同边界。
三个面板:以彩色像素网格绘制的土地覆盖栅格、通过 polygonize 追踪为阶梯状的相同边界,以及经过 dissolve、面积过滤、简化和平滑后再次显示为平滑绿色线条的相同边界。

要在 中将栅格转换为矢量多边形,请打开 Raster > Conversion > Polygonize (Raster to Vector),选择波段,命名输出字段,然后运行。你会得到一个多边形,对应每个由共享同一数值的相连像素组成的区域,并且该数值会写入属性表。对于分类栅格,这是正确的答案;对于照片,则是错误的答案。人们遇到的大多数问题,都源于不知道自己手上的栅格属于哪一种。

我们在 TerraLab 开发了一个名为 AI Segmentation 的 QGIS plugin。它位于本页最后一张表中的一行,描述方式与其他工具相同。

栅格转换为矢量的含义

栅格是由像素组成的网格。矢量是一组带有坐标和属性的点、线和多边形。将一种转换为另一种,意味着确定边界所在的位置,而像素网格除了自身单元格的边缘之外,并没有其他边界。

下面的每种方法,区别只在于它将什么视为边缘。Polygonize 使用两个相邻像素数值不同的位置,contour 使用选定的高程,而 segmentation model 使用对象结束的位置。这正是只有最后一种方法适用于照片的原因。

选择你的方法

你拥有的数据可行的方法代价
分类或专题栅格(土地覆盖、重新分类后的坡度、掩膜)Raster > Conversion > Polygonize (Raster to Vector)免费,属于 QGIS 核心功能
连续栅格(NDVI、坡度、反射率波段)先使用 Reclassify by table,然后 polygonize免费,属于 QGIS 核心功能
DEM 或任何高程表面Raster > Extraction > Contour,或 Contour Polygons免费,属于 QGIS 核心功能
扫描纸质地图或规划图GRASS r.thinr.to.vect,或在 QGIS 外部使用描绘工具。QGIS 核心功能没有能很好完成这项工作的工具免费,但速度较慢。存在付费 AI 描绘工具
正射影像、无人机或卫星影像segmentation model。Polygonize 不适用免费 plugin 需要 NVIDIA 显卡。云端 plugin 有免费额度,之后需要订阅

大多数读者只需要第一行,看完下面两个章节就可以停止。

Polygonize,默认答案

QGIS 算法是 Polygonize (raster to vector),id 为 gdal:polygonize,它封装了 GDAL 工具 gdal_polygonize。它会为每个共享同一数值的相连像素区域创建一个多边形,并将该数值写入属性。

QGIS 3.44 文档中的 GDAL 栅格转换页面,显示 Polygonize (raster to vector) 条目、默认菜单,以及包含 INPUT、BAND、FIELD 和 EIGHT_CONNECTEDNESS 的参数表
以下所有默认值的参考来源:QGIS 3.44 中关于 gdal:polygonize 的文档,拍摄于 2026 年 8 月 23 日。默认菜单路径为 Raster,然后是 Conversion。

Open the tool

Raster > Conversion > Polygonize (Raster to Vector)。它也位于 GDAL 下的 Processing Toolbox、Raster conversion 中。

Pick the band

除非你的分类位于其他位置,否则选择 Band 1。该工具一次只能使用一个波段,因此 RGB 栅格必须先转换为单一分类波段。

Name the field

默认值为 DN。将它重命名为一个六个月后你仍然看得懂的名称,例如 landcover_code

Decide on 8-connectedness

默认关闭,因此像素必须共享完整边界才能连接。打开后,对角接触的像素也会连接。在细窄的对角线状要素上,关闭该选项会将一个要素拆成一串多边形。

Save to a real file

默认输出是临时 layer。对于大型栅格,这会生成数万个要素,因此应直接写入 GeoPackage。

QGIS Polygonize (Raster to Vector) 对话框。输入 layer 显示为 Land cover 10 m [EPSG:32631],Band number 为 Band 1 (Palette),要创建的字段名为 landcover_code,Use 8-connectedness 未勾选,输出写入 GeoPackage。
在一幅 Drome valley 的 10 m ESA WorldCover 裁剪栅格上,真正重要的四个参数。字段已从 DN 重命名为 landcover_code,输出直接写入 GeoPackage,而不是临时 layer。

这里有两件事可以帮你节省时间。

为不想要的分类设置 NoData 值。GDAL 使用波段的有效性掩膜,因此 NoData 像素会被跳过,不会变成包围其他所有内容的巨大背景多边形。这是 polygonize 输出最常见的抱怨,而它属于栅格属性,不是工具设置。

gdal.org 上的 gdal_polygonize 参考页面,显示概要以及 -8、-nomask 和 -mask 选项
QGIS 算法底层使用的 GDAL 工具,拍摄于 2026 年 8 月 23 日。有效性掩膜行为来自 -nomask 标志。

确保波段为整数类型。gdal:polygonize 始终写入整数型字段,因此它会在输入过程中将浮点波段转换为整数。根据栅格存储数值的方式不同,这会导致两种不同的问题,而且两种情况都不会发出警告。Float32 应先经过 Reclassify by table,下一节会介绍这一点。

阶梯状问题,以及修复方法

Polygonize 会追踪像素边界。仅此而已。因此,斜向的田地边缘会变成一段段直角阶梯,每个像素对应一级,而 10 m Sentinel classification 会产生 10 m 的阶梯。

约 1:1,500 比例下覆盖 10 m 土地覆盖栅格的 Polygonize 输出。粉色农田斑块位于绿色树木覆盖和黄色草地之间,每条对角边界都是一段一像素宽的方形阶梯。
来自 ESA WorldCover 栅格的原始 gdal:polygonize 输出,共 3,551 个多边形。沿任意对角线数一数阶梯,每一级都是一个 10 m 像素。

这是正确的输出。工具准确绘制了栅格所表达的内容。只是它看起来不像地图,而 polygonize 内部没有任何设置可以改变这一点。修复方法是按以下顺序运行四个矢量几何算法。

1. Dissolvenative:dissolve)。将 dissolve 字段设置为刚才创建的分类字段。相邻的同类多边形会合并为每个分类一个要素。应在几何仍然精确时首先运行此步骤,因为合并简化后的边缘会沿每条共享边界留下狭长碎片。如果你希望每个斑块保持独立,而不是每个分类生成一个多部件要素,请在高级参数中勾选 Keep disjoint features separate

2. 按面积过滤native:extractbyexpression,位于矢量选择中)。表达式:

$area > 500

单位是 layer CRS 的单位,因此应使用投影 CRS,否则这个数字没有意义。根据你的数据,将阈值设置为真实斑块的大小。在 10 m classification 中,500 m2 相当于五个像素,大致是噪点停止、要素开始出现的位置。下图在同一栅格上使用了 2,000 m2,因为使用 500 时,剩余的狭长碎片在简化后会相互穿过。请查看你自己的面积直方图,不要直接复制这两个数字。如果栅格在斑块内部留下了其他分类的单像素,native:deleteholes 可以在此步骤之后移除它们。

3. 简化native:simplifygeometries)。默认容差为 1.0,单位为 layer units。将其设置为大约一个像素大小,阶梯就会收缩为直线段,边界移动的距离小到读者无法察觉。方法下拉菜单提供 Douglas-Peucker(基于距离)、Visvalingam(基于面积)和 snap to grid。提高容差时,Visvalingam 能更好地保留小要素的形状。

4. 平滑native:smoothgeometry)。只用于真正弯曲的对象,例如溪流、海岸线和植被斑块。Offset 默认值为 0.25,iterations 控制圆滑程度。将 Maximum node angle to smooth 设置为 90,任何比该角度更尖的拐角都会保持尖锐,从而避免工具将建筑物和地块的角落磨圆。

如果你还希望得到没有内部空隙的实心斑块,native:deleteholes 可以移除低于最小面积的孔洞,而 0.0 会移除所有孔洞。

清理后的相同土地覆盖范围。多边形轮廓现在以平滑曲线跨过仍然可见的像素网格,小型噪点多边形已经消失。
相同范围、相同符号化效果,在 Dissolve、2,000 m2 面积过滤、deleteholes、10 m Simplify,以及 Maximum node angle 设为 90 的 Smooth 之后。数量从 3,551 降至 724,阶梯看起来变成了曲线。

栅格连续时先进行 Reclassify

对连续栅格运行 Polygonize 会以两种方式之一出错,具体是哪一种取决于数值的存储方式。

以缩放后的整数存储,这正是 NDVI 产品实际发布的方式,你会几乎为每个像素得到一个多边形,因为几乎没有两个像素拥有相同的数值。我们在一幅 Sentinel-2 场景中测得 40,000 个像素生成了 39,801 个多边形。

以 -1 到 1 之间的原始浮点数存储,转换为整数会在开始追踪前将所有数值压平为 -1、0 或 1。同一场景最后得到 238 个、分属两个分类的多边形。这看起来像一个干净的结果,但事实并非如此:你的数据已经丢失。

坡度、高程、温度或原始反射率波段也是同样的情况。工具在两种情况下都没有失败。它追踪的是整数值之间的边界,而连续栅格没有可供追踪的有用整数值。

约 1:1,000 比例下农田上空 NDVI 栅格的近景,深绿色林地斑块与浅色田地相邻。每个 10 m 像素都有自己的多边形轮廓,因此画面呈现为网格。图层面板条目显示为 ndvi_polygonized,包含 39801 个要素。
2025 年 8 月 11 日 Sentinel-2 场景中的 NDVI,按 NDVI 产品发布时使用的方式存储为缩放后的整数,然后直接进行 polygonize。40,000 个像素生成 39,801 个多边形,因为几乎没有两个像素拥有相同数值。

先使用 Reclassify by table 将连续表面转换为分类,id 为 native:reclassifybytable。重新分类表包含三列,最小值、最大值和新值,并接受 -infinfnan 作为 NoData。植被掩膜可以由三行组成:

最小值最大值数值
-inf0.21
0.20.52
0.5inf3
QGIS Reclassify by Table 对话框,输入 layer 为 Float32 NDVI 栅格,Advanced Parameters 已展开,显示 Range boundaries 设置为 min less than value less than or equal to max,Output data type 设置为 Byte。固定表格编辑器位于上方,包含三行:负无穷到 0.2 得到 1,0.2 到 0.5 得到 2,0.5 到正无穷得到 3。
输入固定表格的三行植被掩膜。高级部分中有两个值得修改的默认值:Output data type,此处设置为 Byte,以及 Range boundaries。

高级参数中有两个默认值需要修改。Output data type 默认为 Float32,因此将其设置为 Byte 或 Int16,polygonize 才能正常工作。Range boundaries 默认为 min < value <= max,它决定了数值恰好为 0.2 的像素落在哪一侧。

然后对重新分类后的栅格运行 polygonize,并执行上面的清理步骤。

DEM 使用 Contours

对于高程,不要使用 polygonize。请在 Raster > Extraction > Contour 中使用 Contour,id 为 gdal:contour。Interval 默认值为 10.0,单位为栅格单位,高程默认写入名为 ELEV 的字段。

QGIS Contour 对话框,输入 layer 为 Copernicus DEM 30 m,等高线间隔设置为 10,属性名称为 ELEV,Advanced Parameters 已展开并显示 Produce 3D vector 未勾选。
在 Drome 上方的 Copernicus DEM 30 m 瓦片上运行 gdal:contour。间隔为栅格单位中的 10,高程写入 ELEV,Produce 3D vector 保持关闭。

如果你希望每个顶点都带有高度,请勾选 Produce 3D vector。如果是用于打印地图,则保持关闭,因为许多软件会静默丢弃 Z 值。

它的同系列算法 gdal:contour_polygon 会生成两条高程之间的填充带,而不是线,并在每个多边形上写入 ELEV_MINELEV_MAX。如果你要制作分层设色图或淹没范围图,这就是应该使用的工具,也能避免手动将重新分类后的 DEM polygonize。

同一丘陵范围的两个面板。左侧是在灰色山体阴影上以 10 m 绘制的棕色等高线,50 m 等高线以更粗的线显示,并标注 400、450、500、550、600 和 650。右侧显示相同地形的填充带,从山谷中的绿色过渡到山顶的棕色。
相同 DEM、相同的 10 m 间隔、两个算法。gdal:contour 生成可根据 ELEV 标注的线。gdal:contour_polygon 生成带有 ELEV_MIN 和 ELEV_MAX 的填充带,这正是分层设色图所需要的结果。

来自 lidar DEM 的 Contours 会因为表面本身有噪声而变得嘈杂。应在 Contour 步骤之前平滑栅格,而不是之后平滑线。平滑线会使它们彼此相交。

扫描纸质地图:QGIS 没有 ArcScan

如果你来自 ArcGIS,正在寻找 QGIS 中 ArcScan 的对应工具,那么 QGIS 没有这样的工具。交互式栅格描绘,也就是你在扫描图上点击一条线、工具随后跟随它,这确实是一个缺口。我宁愿直接说明这一点,也不愿让你继续寻找菜单。

人们实际使用的工具,大致按效果排序如下:

  • GRASS,大多数 QGIS 安装程序都会附带。 先将扫描图阈值化为二值栅格,使用 r.thin 细化,然后运行 r.to.vect,并将要素类型设置为 line。GRASS 文档警告,这会在交点和悬挂分支处创建过多节点,因此需要预留清理时间。免费,并且适用于干净的线状图件。
  • PotraceAutoTrace,在 QGIS 外部使用。 将位图转换为矢量,然后将结果导回并进行地理配准。适合高对比度扫描图,但不了解任何地理信息。
  • Bunting Labs AI VectorizerQGIS repository listing)。这是一个 QGIS plugin,在你数字化时自动补全线条,主要面向地质图、竣工图和规划图。限制是:它会将栅格块发送到其服务器,没有超出试用期的免费额度,而且其公开价格从每月 29 美元起,价格读取时间为 2026 年 8 月 23 日。

对于一张图纸上的少量要素,开启 snapping 后手动数字化仍然是最佳选择。少于大约五十个要素时,我不会建立描绘工作流。

Polygonize 不适用的情况

对正射影像运行 Polygonize 会得到噪声,因为没有任何内容可供阈值化。红色屋顶和红色汽车可能具有相似的像素值。灰色屋顶和灰色道路也可能具有相似的像素值。分类存在于你的认知中,而不在文件里。

从摄影影像中提取对象,需要使用已经学习过对象外观的模型。这些工具会直接写入矢量,因此 polygonize 根本不会参与。以下是你需要安装的工具,以及它们对你的要求。

工具需要安装的内容GPU账户影像是否离开你的电脑输出结果成本
DeepnesssourcePlugin manager,然后安装其 Python packages 和 ONNX model可选,CPU 可运行Polygon layer、bounding boxes 或 raster免费
Geo-SAMPlugin manager,然后在其自身的设置对话框中安装 dependencies 和 model weights可选,点击操作在 CPU 上运行Polygon layer,可为像素级或简化结果免费
samgeo在你自己的环境中安装 Python package,没有 QGIS 面板推荐GeoJSON、Shapefile 或由你自行加载的 GeoPackage免费
MapflowsitePlugin manager是,你上传的 GeoTIFF 或你指定的 tile servicePolygon layer按 Credits 计费,付费
Bunting Labs AI VectorizerPlugin manager是,以栅格块形式发送写入你正在数字化的 layer 中的顶点试用,之后每月 29 美元
AI Segmentation,我们的工具Plugin manager两种云端模式都会离开你的电脑,小型本地模型不会项目 CRS 中的 Polygon layer,包含 label、class、score、area_m2 和 perimeter_m免费额度,之后每月 39 欧元,不含增值税

每种工具各有一个限制。

  • Deepness 运行你提供给它的模型,因此你必须先找到或训练一个模型。
  • Geo-SAM 接受点击和框选,一次处理一个对象。
  • samgeo 没有 QGIS interface。你需要编写 Python。
  • Mapflow 提供固定的模型目录,包括建筑物、森林、道路和施工现场,因此无法找到从未被训练识别的对象。
  • Bunting Labs AI Vectorizer 会在你数字化时跟随线状图件,但不会找到一个区域内的所有对象。
  • AI Segmentation,我们的工具,在两种云端模式下都会将影像发送到服务器。只有小型本地模型会留在你的电脑上。

成本和免费额度读取时间为 2026 年 8 月 23 日。

QGIS 中 Google Satellite 影像上的郊区街道。道路右侧的六个房屋屋顶被红色轮廓勾勒并填充,左侧房屋上方还有更多不同颜色的多边形。
在 QGIS 中基于模型的提取结果,覆盖 Google Satellite 影像,拍摄于 2026 年 8 月 23 日。每个屋顶都是自己的多边形,可以像其他矢量要素一样编辑。Polygonize 无法生成这样的结果,因为像素值中没有任何内容可以将屋顶与车道区分开。

其中任何工具生成的原始模型结果,都需要像 polygonize 输出一样进行过滤。在一次覆盖巴黎市中心的运行中,我们从 635 个多边形中保留了 82 个,而这 82 个仍然包含 84% 的建筑面积。building footprints guide 将完整介绍这一过滤步骤,SAM in QGIS post 则介绍这些模型擅长找到哪些对象。

Try it free in QGIS, no card needed

两分钟版本

打开栅格的属性,查看波段类型和值域。整数类型且不同值少于一百个,意味着可以直接前往 Raster > Conversion > Polygonize (Raster to Vector),然后依次运行 Dissolve、按面积过滤和 Simplify。浮点类型且包含数千个不同值,意味着应先使用 Reclassify by table。照片则完全不适用这些方法,接下来应该查看 QGIS AI plugin comparison

如果你只需要建筑物,我们的免费 building footprints 工具可以直接在浏览器中从开放数据中提取建筑物,完全不需要 plugin。