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

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

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。](/_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 classification 会产生 10 m 的阶梯。

这是正确的输出。工具准确绘制了栅格所表达的内容。只是它看起来不像地图,而 polygonize 内部没有任何设置可以改变这一点。修复方法是按以下顺序运行四个矢量几何算法。
1. Dissolve(native: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 会移除所有孔洞。

栅格连续时先进行 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。植被掩膜可以由三行组成:
| 最小值 | 最大值 | 数值 |
|---|---|---|
| -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 使用 Contours
对于高程,不要使用 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 的 Contours 会因为表面本身有噪声而变得嘈杂。应在 Contour 步骤之前平滑栅格,而不是之后平滑线。平滑线会使它们彼此相交。
扫描纸质地图:QGIS 没有 ArcScan
如果你来自 ArcGIS,正在寻找 QGIS 中 ArcScan 的对应工具,那么 QGIS 没有这样的工具。交互式栅格描绘,也就是你在扫描图上点击一条线、工具随后跟随它,这确实是一个缺口。我宁愿直接说明这一点,也不愿让你继续寻找菜单。
人们实际使用的工具,大致按效果排序如下:
- GRASS,大多数 QGIS 安装程序都会附带。 先将扫描图阈值化为二值栅格,使用 r.thin 细化,然后运行 r.to.vect,并将要素类型设置为
line。GRASS 文档警告,这会在交点和悬挂分支处创建过多节点,因此需要预留清理时间。免费,并且适用于干净的线状图件。 - Potrace 或 AutoTrace,在 QGIS 外部使用。 将位图转换为矢量,然后将结果导回并进行地理配准。适合高对比度扫描图,但不了解任何地理信息。
- Bunting Labs AI Vectorizer(QGIS repository listing)。这是一个 QGIS plugin,在你数字化时自动补全线条,主要面向地质图、竣工图和规划图。限制是:它会将栅格块发送到其服务器,没有超出试用期的免费额度,而且其公开价格从每月 29 美元起,价格读取时间为 2026 年 8 月 23 日。
对于一张图纸上的少量要素,开启 snapping 后手动数字化仍然是最佳选择。少于大约五十个要素时,我不会建立描绘工作流。
Polygonize 不适用的情况
对正射影像运行 Polygonize 会得到噪声,因为没有任何内容可供阈值化。红色屋顶和红色汽车可能具有相似的像素值。灰色屋顶和灰色道路也可能具有相似的像素值。分类存在于你的认知中,而不在文件里。
从摄影影像中提取对象,需要使用已经学习过对象外观的模型。这些工具会直接写入矢量,因此 polygonize 根本不会参与。以下是你需要安装的工具,以及它们对你的要求。
| 工具 | 需要安装的内容 | GPU | 账户 | 影像是否离开你的电脑 | 输出结果 | 成本 |
|---|---|---|---|---|---|---|
| Deepness(source) | Plugin manager,然后安装其 Python packages 和 ONNX model | 可选,CPU 可运行 | 否 | 否 | Polygon layer、bounding boxes 或 raster | 免费 |
| Geo-SAM | Plugin manager,然后在其自身的设置对话框中安装 dependencies 和 model weights | 可选,点击操作在 CPU 上运行 | 否 | 否 | Polygon layer,可为像素级或简化结果 | 免费 |
| samgeo | 在你自己的环境中安装 Python package,没有 QGIS 面板 | 推荐 | 否 | 否 | GeoJSON、Shapefile 或由你自行加载的 GeoPackage | 免费 |
| Mapflow(site) | Plugin manager | 否 | 是 | 是,你上传的 GeoTIFF 或你指定的 tile service | 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 interface。你需要编写 Python。
- Mapflow 提供固定的模型目录,包括建筑物、森林、道路和施工现场,因此无法找到从未被训练识别的对象。
- Bunting Labs AI Vectorizer 会在你数字化时跟随线状图件,但不会找到一个区域内的所有对象。
- AI Segmentation,我们的工具,在两种云端模式下都会将影像发送到服务器。只有小型本地模型会留在你的电脑上。
成本和免费额度读取时间为 2026 年 8 月 23 日。

其中任何工具生成的原始模型结果,都需要像 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。


