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

要在
中将栅格转换为矢量多边形,请打开 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.thin 加 r.to.vect,或在 QGIS 之外使用描绘工具。QGIS 核心功能没有能很好完成这项工作的工具 | 免费,但速度慢。已有付费 AI 描绘工具 |
| 正射影像、无人机或卫星影像 | 分割模型。Polygonize 不适用 | 免费 plugin 需要 NVIDIA 显卡。云端 plugin 提供免费额度,之后需要订阅 |
大多数读者只需要第一行,看完下面两个小节就可以停下。
Polygonize,默认答案
QGIS 算法是 Polygonize (raster to vector),id 为 gdal:polygonize,它封装了 GDAL 工具 gdal_polygonize。它会为每个共享相同数值的连通像素区域创建一个多边形,并将该数值写入属性。

打开工具
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](/_next/image?url=%2Fblog%2Fraster-to-vector-qgis%2F02_polygonize_dialog.jpg&w=3840&q=75)
这里有两点可以帮你节省时间。
为不想要的分类设置 NoData 值。GDAL 使用波段的有效性掩膜,因此 NoData 像素会被跳过,不会变成包围其他所有内容的巨大背景多边形。这是 polygonize 输出最常见的投诉,原因在于栅格属性,而不是工具设置。

确保波段是整数类型。gdal:polygonize 始终写入整数型字段,因此它会在输入时将浮点波段转换为整数。根据你的栅格存储数值的方式不同,这会导致两种不同的失败,而且都不会发出警告。Float32 应先通过 Reclassify by table,下一节会介绍这一点。
阶梯状问题,以及修复方法
Polygonize 描绘的是像素边界,仅此而已。因此,斜向的田地边缘会变成一串直角阶梯,每个像素对应一级,而 10 m Sentinel 分类会产生 10 m 的阶梯。

这是正确的输出。工具正在准确绘制栅格表达的内容。它只是看起来不像一张地图,而且 polygonize 内部没有任何设置可以改变这一点。修复方法是按以下顺序运行四个矢量几何算法。
1. Dissolve(native: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. Simplify(native:simplifygeometries)。容差默认值为 1.0,单位是 layer 单位。将其设置为大约一个像素大小,阶梯就会折叠为直线段,同时边界移动的距离小于读者可察觉的程度。方法下拉菜单提供 Douglas-Peucker(基于距离)、Visvalingam(基于面积)和 snap to grid。提高容差时,Visvalingam 能更好地保留小要素的形状。
4. Smooth(native:smoothgeometry)。只对真正弯曲的对象使用,例如溪流、海岸线和植被斑块。Offset 默认值为 0.25,iterations 控制圆润程度。将 Maximum node angle to smooth 设置为 90,任何比这个角度更尖的角都会保持锐利,从而避免工具把建筑物和地块的角落变圆。
如果你还希望斑块内部没有空洞,native:deleteholes 可以移除小于最小面积的空洞,而 0.0 会移除所有空洞。

栅格连续时先进行 Reclassify
对连续栅格执行 Polygonize 会以两种方式之一出错,具体取决于数值的存储方式。
存储为经过缩放的整数,这正是 NDVI 产品实际发布时的方式,你会得到几乎每个像素一个多边形,因为几乎没有两个像素共享同一个数值。我们在一幅 Sentinel-2 场景中测得 40,000 个像素生成了 39,801 个多边形。
存储为 -1 到 1 之间的原始浮点数,转换为整数会在描绘开始前将每个值压平为 -1、0 或 1。同一场景最终得到 238 个多边形,分为两个分类。这看起来像一个干净的结果,但事实并非如此:你的数据已经丢失。
坡度、高程、温度或原始反射率波段也是如此。工具在两种情况下都没有失败。它描绘的是整数值之间的边界,而连续栅格没有可供描绘的有用整数值。

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

高级参数中有两个默认值需要修改。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 的字段。

如果希望每个顶点都包含高度,请勾选 Produce 3D vector。如果是打印地图,则保持关闭,因为许多软件会静默丢弃 Z 值。
它的姊妹算法 gdal:contour_polygon 会生成两个高程之间的填充带,而不是线,并在每个多边形上写入 ELEV_MIN 和 ELEV_MAX。对于分层设色地图或淹没范围,这才是你需要的算法,也省去了手动对重新分类后的 DEM 执行 polygonize。

来自 lidar DEM 的等高线会因为表面噪声而变得杂乱。应在生成等高线之前平滑栅格,而不是之后平滑线。平滑线会让它们彼此交叉。
扫描纸质地图:QGIS 没有 ArcScan
如果你来自 ArcGIS,正在寻找 ArcScan 的 QGIS 对应工具,那么答案是没有。交互式栅格描绘,也就是在扫描图上点击一条线,然后由工具跟随它,是一个确实存在的空白。我宁愿直接说明这一点,也不愿让你继续寻找菜单。
人们实际使用的工具,大致按效果排序如下:
- GRASS,大多数 QGIS 安装程序都会附带。 将扫描图阈值化为二值栅格,使用 r.thin 细化,然后运行带有要素类型
line的 r.to.vect。GRASS 文档警告说,这会在交叉点和悬挂分支处创建过多节点,因此需要预留清理时间。免费,并且适用于干净的线稿。 - Potrace 或 AutoTrace,在 QGIS 之外使用。 将位图转换为矢量,然后导回并进行地理配准。适合高对比度扫描图,但不了解任何地理信息。
- Bunting Labs AI Vectorizer(QGIS repository listing)。这是一个 QGIS plugin,会在你进行数字化时自动补全线条,目标明确地面向地质图、竣工图和规划图。限制是:它会将栅格分块发送到其服务器,试用期之外没有免费额度,其公布的价格从每月 29 美元起,价格读取于 2026 年 8 月 23 日。
如果一张图上只有少量要素,开启捕捉后手动数字化仍然是最好的选择。少于大约五十个要素时,我不会专门构建描绘工作流。
Polygonize 不适用的场景
对正射影像执行 polygonize 会得到噪声,因为没有可以进行阈值化的内容。红色屋顶和红色汽车可能具有相似的像素值。灰色屋顶和灰色道路也可能具有相似的像素值。分类存在于你的头脑中,而不在文件中。
从摄影影像中提取对象,需要使用学习过对象外观的模型。这些工具会直接写入矢量,因此 polygonize 根本不会介入。下面介绍需要安装什么,以及它们会要求你做什么。
| 工具 | 需要安装的内容 | GPU | 账户 | 影像离开你的机器 | 输出结果 | 成本 |
|---|---|---|---|---|---|---|
| Deepness(source) | Plugin manager,然后安装其 Python 包和 ONNX 模型 | 可选,CPU 可用 | 否 | 否 | Polygon layer、边界框或栅格 | 免费 |
| Geo-SAM | Plugin manager,然后从其设置对话框安装依赖和模型权重 | 可选,点击操作在 CPU 上运行 | 否 | 否 | Polygon layer,可为像素级或简化结果 | 免费 |
| samgeo | 在你自己的环境中安装 Python 包,没有 QGIS 面板 | 推荐 | 否 | 否 | GeoJSON、Shapefile 或由你自行加载的 GeoPackage | 免费 |
| Mapflow(site) | Plugin manager | 否 | 是 | 是,你上传的 GeoTIFF 或指定的瓦片服务 | Polygon layer | 按 credits 计费,付费 |
| Bunting Labs AI Vectorizer | Plugin 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 日。

任何工具产生的原始模型输出,都需要像 polygonize 输出一样进行过滤。在巴黎市中心的一次运行中,我们从 635 个多边形中保留了 82 个,而这 82 个仍然覆盖了 84% 的建筑面积。建筑物轮廓指南完整介绍了这一步过滤流程,QGIS 中的 SAM 文章则介绍了这些模型擅长识别哪些对象。
延伸阅读AI Segmentation for QGIS:完整指南
两分钟版本
打开栅格的属性,查看波段类型和数值范围。整数类型且不同数值少于一百个,直接前往 Raster > Conversion > Polygonize (Raster to Vector),然后执行 Dissolve、按面积过滤和 Simplify。浮点类型且有数千个不同数值,先执行 Reclassify by table。照片则不适用以上任何方法,下一步应查看 QGIS AI plugin 对比。
如果你只需要建筑物,我们的免费建筑物轮廓工具可以在浏览器中从开放数据提取建筑物,完全不需要 plugin。


