跳转到内容
QGIS
教程
GeoAI

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

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

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

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

栅格转矢量的含义

栅格是像素网格。矢量是一组带有坐标和属性的点、线和多边形。将一种转换为另一种,意味着要判断边界位于哪里,而像素网格本身除了每个单元格的边缘之外,并没有其他边界。

下面的每种方法,区别只在于它把什么视为边缘。Polygonize 使用两个相邻像素数值不同的位置,等高线使用选定的高程,而分割模型使用对象停止的位置。这就是为什么只有最后一种方法适用于照片。

选择你的方法

你拥有的数据可行的方法成本
分类或专题栅格(土地覆盖、重新分类后的坡度、掩膜)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 描绘工具
正射影像、无人机或卫星影像分割模型。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 的参数表
下面所有默认值的参考来源:2026 年 8 月 23 日截取的 QGIS 3.44 gdal:polygonize 文档。默认菜单路径为 Raster,然后是 Conversion。

打开工具

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

选择波段

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

命名字段

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

决定是否使用 8-connectedness

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

保存为真实文件

默认输出是临时 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 分类会产生 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 分类中,500 m2 相当于五个像素,大约从这里开始,斑点噪声会减少,而要素开始成形。下图在同一栅格上使用了 2,000 m2,因为在 500 m2 时,保留下来的狭长碎片在简化后会彼此交叉。与其复制这两个数字,不如查看你自己的面积直方图。如果栅格在一个斑块内部留下了其他分类的单像素,执行这一步后使用 native:deleteholes 可以移除它们。

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

4. Smoothnative: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 像素都有自己的多边形轮廓,因此整个画面看起来像网格。layer 面板条目显示 ndvi_polygonized,共 39801 个要素
2025 年 8 月 11 日 Sentinel-2 场景中的 NDVI,按照 NDVI 产品发布时的方式存储为经过缩放的整数,然后直接执行 polygonize。40,000 个像素生成了 39,801 个多边形,因为几乎没有两个像素拥有相同数值。

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

MinimumMaximumValue
-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 使用等高线

对于高程,不要执行 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 的等高线会因为表面噪声而变得杂乱。应在生成等高线之前平滑栅格,而不是之后平滑线。平滑线会让它们彼此交叉。

扫描纸质地图:QGIS 没有 ArcScan

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

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

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

如果一张图上只有少量要素,开启捕捉后手动数字化仍然是最好的选择。少于大约五十个要素时,我不会专门构建描绘工作流。

Polygonize 不适用的场景

对正射影像执行 polygonize 会得到噪声,因为没有可以进行阈值化的内容。红色屋顶和红色汽车可能具有相似的像素值。灰色屋顶和灰色道路也可能具有相似的像素值。分类存在于你的头脑中,而不在文件中。

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

工具需要安装的内容GPU账户影像离开你的机器输出结果成本
DeepnesssourcePlugin manager,然后安装其 Python 包和 ONNX 模型可选,CPU 可用Polygon layer、边界框或栅格免费
Geo-SAMPlugin manager,然后从其设置对话框安装依赖和模型权重可选,点击操作在 CPU 上运行Polygon layer,可为像素级或简化结果免费
samgeo在你自己的环境中安装 Python 包,没有 QGIS 面板推荐GeoJSON、Shapefile 或由你自行加载的 GeoPackage免费
MapflowsitePlugin manager是,你上传的 GeoTIFF 或指定的瓦片服务Polygon 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 界面。你需要编写 Python。
  • Mapflow 提供固定的模型目录,包括建筑物、森林、道路和施工现场,因此无法找到一个从未训练过的对象。
  • Bunting Labs AI Vectorizer 会在你进行数字化时跟随线稿。它不会找出一个区域内的所有对象。
  • AI Segmentation,我们的工具,在两种云端模式下都会将影像发送到服务器。只有小型本地模型会留在你的机器上。

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

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

任何工具产生的原始模型输出,都需要像 polygonize 输出一样进行过滤。在巴黎市中心的一次运行中,我们从 635 个多边形中保留了 82 个,而这 82 个仍然覆盖了 84% 的建筑面积。建筑物轮廓指南完整介绍了这一步过滤流程,QGIS 中的 SAM 文章则介绍了这些模型擅长识别哪些对象。

在 QGIS 中免费试用,无需银行卡

两分钟版本

打开栅格的属性,查看波段类型和数值范围。整数类型且不同数值少于一百个,直接前往 Raster > Conversion > Polygonize (Raster to Vector),然后执行 Dissolve、按面积过滤和 Simplify。浮点类型且有数千个不同数值,先执行 Reclassify by table。照片则不适用以上任何方法,下一步应查看 QGIS AI plugin 对比

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