QGIS 栅格转矢量:5 种方法与阶梯边缘修复
发布于 更新于

要在 QGIS 中将栅格转换为矢量多边形,请打开 栅格 > 转换 > 栅格矢量化 (栅格转矢量)(Raster > Conversion > Polygonize),选择波段,为输出字段命名,然后运行。您会得到一个多边形,对应一组共享同一数值且彼此连通的像素,并且该数值会写入属性表。对于分类栅格,这是正确的方法;对于照片,则不是。还有四种方法可以处理 polygonize 无法读取的栅格。
方法 2 是我们开发的插件,因此请相应看待这一节。它和其他四种方法一样,只有五行介绍。
简短答案
打开栅格的属性,查看两项内容:波段类型和不同值的数量。它们会帮您选择方法。
| 输入数据 | 方法 | 成本 |
|---|---|---|
| 分类栅格(土地覆盖、坡度重分类、掩膜) | 方法 1,栅格 > 转换 > 栅格矢量化 (栅格转矢量) | 免费,QGIS 核心功能 |
| 正射影像、无人机或卫星影像 | 方法 2,分割模型 | 免费插件需要 NVIDIA 显卡。云端插件有免费额度,之后需要订阅 |
| 连续栅格(NDVI、坡度、反射率波段) | 方法 3,按表格重分类,然后 polygonize | 免费,QGIS 核心功能 |
| DEM 或任何高程表面 | 方法 4,栅格 > 提取 > 等值线,或等值线多边形 | 免费,QGIS 核心功能 |
| 扫描纸质地图或规划图 | 方法 5,GRASS r.thin 加 r.to.vect | 免费,但速度慢。已有付费 AI 追踪工具 |
下面的每个菜单路径、算法 id 和默认值,都在 2026 年 8 月 23 日依据 QGIS 3.44 文档 和 GDAL 稳定版文档 进行了检查。菜单路径假设使用默认 QGIS 布局,插件可以改变该布局。
方法 1:Polygonize
请使用投影 CRS。下面有两个步骤会使用距离或面积作为图层单位,而在经纬度中,这些数字没有意义。
该算法是 Polygonize (raster to vector),id 为 gdal:polygonize,它封装了 GDAL 工具 gdal_polygonize。

打开工具
栅格 > 转换 > 栅格矢量化 (栅格转矢量),或者在工具箱的 GDAL、栅格转换下找到它。
选择波段
除非类别存储在其他位置,否则选择波段 1。该工具一次只处理一个波段,因此需要先将 RGB 栅格缩减为单一类别波段。
命名字段
默认值是 DN。请重命名,例如使用 landcover_code,而不是 DN。
决定是否使用 8 连通
默认关闭,因此像素必须共享完整边界才能连接。打开后,对角相接的像素也会连接。保持关闭时,一条细的对角线要素会被拆成一串多边形。在下面的 WorldCover 测试中,打开它使多边形数量减少了 21%,顶点数量则丝毫未变:它只是对像素分组,并不会让边缘变平滑。
保存为真实文件
默认输出是临时图层。在 10 m 土地覆盖数据上,100 km² 生成了 9,221 个多边形和 4.9 MB 的 GeoPackage,因此请直接写入文件。
![QGIS Polygonize 对话框:Land cover 10 m [EPSG:32631]、Band 1 (Palette)、字段 landcover_code、未勾选 8-connectedness,输出到 GeoPackage。](/_next/image?url=%2Fblog%2Fraster-to-vector-qgis%2F02_polygonize_dialog.jpg&w=3840&q=75&dpl=dpl_3iZ5h4r4WPCgG5pdnCakwvmZazoh)
有两点可以帮您节省时间。首先,为不需要的类别设置 NoData 值:GDAL 随后会读取波段的有效性掩膜并跳过这些像素,而不是围绕所有内容生成一个巨大的背景多边形。这是 polygonize 输出最常见的抱怨,而它是栅格属性,不是工具设置。

其次,注意波段类型。gdal:polygonize 始终写入整数型字段,因此它会在读入时将浮点波段转换为整数,这会根据栅格存储值的方式产生两种失败结果。两种情况都不会发出警告。Float32 波段应先经过方法 3。
阶梯状边缘与碎斑:先滤除碎斑,再把简化当作整体 Coverage
Polygonize 会追踪像素边界,因此对角线状的田地边缘会变成直角阶梯,每个像素形成一级。10 m 的 Sentinel 分类数据会产生 10 m 的阶梯。

这是正确的输出,polygonize 内部没有任何设置可以改变它。解决方法是在 polygonize 之前做一个栅格步骤,之后再做一个 Coverage 步骤。在 Drôme 的 Crest 周边 10 km 见方的 ESA WorldCover 数据上,polygonize 返回了 9,221 个多边形和 200,656 个顶点,其中 57% 的多边形小于五个像素。先以 10 个像素的阈值滤除碎斑,多边形数量降到 2,660 个,只有 1.75% 的像素改变了类别。
常见的矢量修复方法随后会破坏地图。QGIS 的简化一次只处理一个多边形,所以相邻的两个多边形会以不同方式简化它们的共享边:在 10 m 容差下,这在 10,000 ha 的范围内产生了 88 ha 的缝隙和 81 ha 的重叠。简化 Coverage 把图层当作一张整体网格处理,没有留下任何缝隙或重叠。
| 10 km 见方范围内的步骤 | 多边形 | 顶点 | GeoPackage | 类别改变的像素 | 缝隙与重叠 |
|---|---|---|---|---|---|
| Polygonize,默认 4 连通 | 9,221 | 200,656 | 4.9 MB | 0% | 0 |
| Polygonize,8 连通 | 7,284 | 200,656 | 4.7 MB | 0% | 0 |
| 滤除 5 px 碎斑,然后 polygonize | 3,886 | 168,060 | 3.6 MB | 0.94% | 0 |
| 滤除 10 px 碎斑(默认值),然后 polygonize | 2,660 | 155,920 | 3.2 MB | 1.75% | 0 |
| 滤除 50 px 碎斑,然后 polygonize | 1,001 | 122,440 | 2.4 MB | 5.36% | 0 |
| 滤除 10 px 碎斑,然后以 10 m 简化 | 2,660 | 57,896 | 1.5 MB | 4.11% | 169 ha |
| 滤除 10 px 碎斑,然后以 10 m 简化 Coverage | 2,660 | 84,984 | 1.9 MB | 2.63% | 0 |
滤除碎斑优于 $area 过滤,原因相同。删除所有小于 500 m² 的多边形,会移除 5,263 个碎斑,也就是 5 像素阈值滤除的那些,但会留下 94 ha 的空洞;滤除碎斑则把这些像素交给最大的相邻斑块,因此地图保持无缝覆盖。在我们研究语料库中提到 Polygonize 的 51 个 QGIS YouTube 教程里,没有一个在它之前运行滤除碎斑。

在 QGIS 中,整个清理流程分四步,请按此顺序进行。
滤除栅格碎斑
在 polygonize 之前运行 栅格 > 分析 > 滤除碎斑(Raster > Analysis > Sieve),id 为 gdal:sieve。阈值以像素为单位,默认是 10,在 10 m 栅格上相当于 1,000 m²。每个小于该阈值的斑块都会取其最大相邻斑块的值。类别改变的比例随阈值增大:阈值为 10 时是 1.75% 的像素,阈值为 100 时是 8.19%。
Polygonize 滤除碎斑后的栅格
按上面的方法 1 运行。不需要融合:polygonize 已经为每个斑块写入一个多边形。
简化 Coverage
在工具箱的 矢量 Coverage 下,找到 简化 Coverage(Simplify coverage),id 为 native:coveragesimplify,QGIS 3.36 起提供。容差以图层单位计,默认是 1。在 10 m 栅格上,5 m 容差没有移除任何顶点,10 m 容差移除了 45% 的顶点,所以请从一个像素的容差开始。对于没有共享边的孤立斑块,例如 NoData 之上的单一类别,仍然使用普通的简化。
平滑,但只用于曲线
对真正弯曲的对象使用 native:smoothgeometry,例如溪流、海岸线和植被斑块。偏移量默认值为 0.25,迭代次数决定平滑程度。将平滑的最大节点角(Maximum node angle to smooth)设置为 90,可以保留较尖的角,从而保护建筑物和地块的转角。
我们如何测量。 数据为 ESA WorldCover 2021 v200,图幅 N42E003,以 Crest(44.728 N,5.022 E)为中心的 10 km 见方范围,于 2026 年 9 月 23 日用最近邻法重投影到 EPSG:32631,分辨率 10 m。“类别改变的像素”是把多边形重新栅格化到同一网格,再与原始栅格比较。缝隙与重叠分别是没有多边形覆盖的面积,以及被两个多边形同时覆盖的面积。Polygonize、滤除碎斑、简化和简化 Coverage 这几行,已用 QGIS 3.44.7(GDAL 3.12,GEOS 3.14)自带的工具重新运行,得到相同的数量。只有一个窗口、一种土地覆盖产品和一种像素大小:30 m 或 1 m 的栅格会让每个数字都发生变化。
适用于: 栅格以整数形式保存类别。
不适用于: 波段是浮点数、照片或高程。
方法 2:用于照片的分割模型
分割模型已经学习了对象的外观,因此可以在照片中找到对象,即使没有任何像素值能够将它们区分开来。我们开发了其中一个模型:AI Segmentation。本节介绍我们自己的工具。
对同一张正射影像运行 polygonize,您会得到噪声。红色屋顶和红色汽车的像素值可能相似,灰色屋顶和灰色道路也是如此。类别存在于您的认知中,而不是文件中。
从插件管理器安装
不需要 GPU,不需要 Python 环境,也不需要下载模型权重。
创建账户
需要账户。先使用免费额度,之后每月 €39,不含增值税。
选择模式
两种云端模式都会将影像发送到服务器。小型本地模型会留在本机。
运行整个范围
返回的是工程 CRS 中的多边形图层,每个要素都包含 label、class、score、area_m2 和 perimeter_m。
过滤输出
原始模型输出需要像 polygonize 输出一样进行清理。在巴黎市中心的一次运行中,我从 635 个多边形中保留了 82 个,而这 82 个多边形包含了 84% 的建筑面积。

还有五个插件可以完成这项工作,我们的工具位于最后一行。成本和免费额度数据截至 2026 年 8 月 23 日。
| 工具 | 安装内容 | GPU | 账户 | 影像是否离开本机 | 输出结果 | 成本 |
|---|---|---|---|---|---|---|
| Deepness(源码) | 插件管理器,然后安装其 Python 包和 ONNX 模型 | 可选,CPU 也能运行 | 否 | 否 | 多边形图层、边界框或栅格 | 免费 |
| Geo-SAM | 插件管理器,然后从设置对话框安装依赖和模型权重 | 可选,点击操作使用 CPU 运行 | 否 | 否 | 多边形图层,可为像素级或简化结果 | 免费 |
| samgeo | 在您的环境中安装 Python 包,没有 QGIS 面板 | 推荐 | 否 | 否 | 由您自行加载的 GeoJSON、Shapefile 或 GeoPackage | 免费 |
| Mapflow(官网) | 插件管理器 | 否 | 是 | 云服务上是,您上传的 GeoTIFF 或指定的切片服务。也提供企业本地部署选项 | 多边形图层 | 按积分计费 |
| Bunting Labs AI Vectorizer | 插件管理器 | 否 | 是 | 是,以栅格块形式发送 | 将顶点写入正在数字化的图层 | 试用,之后每月 29 美元 |
| AI Segmentation(我们的工具) | 插件管理器 | 否 | 是 | 两种云端模式都会发送,本地小型模型不会 | 工程 CRS 中的多边形图层,包含 label、class、score、area_m2 和 perimeter_m | 免费额度,之后每月 €39,不含增值税 |
每个工具各有一个限制。
- Deepness 运行的是您提供的模型,因此您必须先找到或训练一个模型。
- Geo-SAM 接受点击和边界框,一次处理一个对象。
- samgeo 没有 QGIS 界面。您需要编写 Python。
- Mapflow 提供建筑物、森林、道路和施工现场的现成模型。
- Bunting Labs AI Vectorizer 会在您数字化时跟随线条。
- AI Segmentation 是我们的工具,在两种云端模式下都会将影像发送到服务器。只有小型本地模型会留在本地。
适用于: 输入是照片,并且对象数量多到不适合手动画出。
不适用于: 影像不能离开本机,Deepness 或 Geo-SAM 这类本地插件可以满足这一点。
方法 3:先重分类,再 polygonize
对连续栅格运行 Polygonize,会根据值的存储方式产生两种失败结果。
存储为缩放后的整数,这是 NDVI 产品的常见方式,您几乎会为每个像素得到一个多边形。我在一景 Sentinel-2 场景中测得 40,000 个像素生成了 39,801 个多边形。
存储为 -1 到 1 之间的原始浮点数时,转换为整数会在追踪开始前将所有值压平为 -1、0 或 1。同一场景最后得到 238 个、属于两个类别的多边形。结果看起来很干净,但值已经丢失。

坡度、高程、温度和原始反射率波段都会出现同样的问题。该工具追踪整数值之间的边界,而连续栅格没有值得追踪的边界。因此,请使用 Reclassify by table(按表格重分类),id 为 native:reclassifybytable,自行创建类别。
打开按表格重分类
打开工具箱、栅格分析。连续栅格作为输入。
输入类别表
包含三列:最小值、最大值、新值。NoData 可以使用 -inf、inf 和 nan。植被掩膜可以使用三行。
| 最小值 | 最大值 | 值 |
|---|---|---|
| -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 结果
对重分类后的栅格运行方法 1,然后执行四个清理步骤。

适用于: 您可以用数字说明一个类别在哪里结束、下一个类别在哪里开始。
不适用于: 您想要的是一个对象,而不是一个数值范围。
方法 4:从 DEM 生成等高线
对于高程,不要使用 polygonize。请在 栅格 > 提取 > 等值线(Raster > Extraction > Contour)中使用 Contour,id 为 gdal:contour。
打开等值线
栅格 > 提取 > 等值线,输入 DEM。
设置间隔
默认值为 10.0,单位是栅格单位,因此公制 DEM 每 10 m 生成一条线。
命名属性
高程默认写入 ELEV。保留该字段,并用它生成标注。
决定是否生成三维矢量
勾选生成三维矢量(Produce 3D vector)后,每个顶点都会包含高程。用于打印地图时请保持关闭,因为很多软件会丢弃 Z 值。
切换到等值线多边形生成填充分带
相邻算法 gdal:contour_polygon(等值线多边形)会生成两个高程之间的填充分带,并在每个多边形上写入 ELEV_MIN 和 ELEV_MAX。这是制作分层设色图或淹没范围图的方法,也省去了手动将重分类 DEM 转换为多边形的步骤。


来自 lidar DEM 的等高线会很嘈杂,因为表面本身就很嘈杂。请在生成等高线之前平滑栅格,不要事后平滑线条:平滑后的线条会彼此交叉。
适用于: 您想要的是一个等级,例如高程、深度、降雨量或浓度。
不适用于: 栅格已经保存了类别。
方法 5:扫描纸质地图
如果您来自 ArcGIS,正在寻找 QGIS 中对应 ArcScan 的工具,那么 QGIS 没有这样的工具。QGIS 中确实缺少交互式栅格追踪,也就是您在扫描图上点击一条线、工具自动跟随它的功能。与其让您在菜单中寻找,我更愿意直接说明这一点。迁移过来后还有哪些变化,请看 QGIS 和 ArcGIS Pro 的区别。
免费方案通过 GRASS 实现,大多数 QGIS 安装程序都会附带它。
对扫描图进行阈值处理
将扫描图转换为二值栅格:线条使用一个值,纸张使用另一个值。
细化线条
r.thin 会将每条笔画缩减为一个像素宽。
矢量化
使用要素类型 line 运行 r.to.vect。GRASS 文档警告,该操作会在交叉点和悬挂分支处创建过多节点,因此需要预留清理时间。
还有两条路线。Potrace 和 AutoTrace 在 QGIS 之外运行:输入位图,输出矢量,然后再对结果进行地理配准。它们适合高对比度扫描图,但不了解地理信息。
在 QGIS 内,Bunting Labs AI Vectorizer(QGIS 插件仓库页面)会在您数字化线条时自动补全,主要面向地质图、竣工图和规划图。它会将栅格块发送到其服务器,没有超过试用期的免费额度,公开价格从每月 29 美元起,数据截至 2026 年 8 月 23 日。
对于少量要素,使用捕捉手动数字化仍然更好。少于大约五十个要素时,我不会专门建立追踪工作流。
适用于: 扫描图包含清晰线条,且有数百个要素。
不适用于: 图纸颜色太浅、有阴影线,或在线条上叠加了注释。
需要记住的内容
| 属性显示的内容 | 方法 |
|---|---|
| 整数波段,不同值少于一百个 | 方法 1,滤除碎斑,polygonize,然后简化 Coverage |
| 照片的三个波段 | 方法 2,分割模型 |
| 浮点波段,不同值有数千个 | 方法 3,按表格重分类,然后使用方法 1 |
| 以米为单位的高程,或任何平滑表面 | 方法 4,等值线或等值线多边形 |
| 完全没有类别值的扫描图 | 方法 5,GRASS,或手动数字化 |
不同值的数量可以决定方法。少于一百个时,说明有人已经对栅格进行了分类,而 polygonize 可以干净地追踪这些类别。
如果有数千个不同值,说明还没有人进行分类,因此您需要在方法 3 中自行绘制阈值,或在方法 2 中将工作交给模型。
阶梯状边缘是正确的输出,polygonize 内部没有任何设置可以移除它。先滤除栅格碎斑,再用简化 Coverage 而不是普通简化,这样相邻多边形才能保留同一条共享边。
每个清理步骤都会移动顶点,因此任何用于报告的面积,都应该从栅格而不是多边形计算。
无论使用什么设置,Polygonize 都无法读取照片,因为类别存在于您的认知中,而不是文件中。
常见问题
栅格转多边形和栅格转矢量是同一回事吗?
不完全是。栅格转矢量包括多边形、线和点。栅格转多边形特指 polygonize 路线,即 栅格 > 转换 > 栅格矢量化 (栅格转矢量),也就是方法 1。方法 4 中的等高线同样属于栅格转矢量,但其输出是线。
为什么 polygonize 会在所有内容周围生成一个巨大的多边形?
背景类别没有设置 NoData 值,因此 GDAL 将其作为真实数据进行追踪。请在栅格属性中为该类别设置 NoData,然后重新运行方法 1。
为什么 polygonize 为几乎每个像素都创建了一个多边形?
栅格是连续的,而不是分类的,因此几乎没有两个相邻像素拥有相同的值。请先进行重分类:方法 3。
如何去除阶梯状边缘?
在 polygonize 之前先滤除栅格碎斑,然后以大约一个像素的容差运行简化 Coverage,最后只对弯曲的要素使用平滑。普通简化逐个多边形处理,会在相邻多边形之间留下缝隙。如果面积要用于报告,请从栅格计算面积。
QGIS 有 ArcScan 的替代工具吗?
没有。QGIS 核心没有交互式栅格追踪功能。方法 5 提供免费方案,即先运行 GRASS r.thin,再运行 r.to.vect;付费方案是 Bunting Labs 插件,每月 29 美元起。
可以对航空照片或卫星图像进行 polygonize 吗?
不可以,输出会像噪点一样,因为红色屋顶和红色汽车可能拥有相同的像素值。请使用分割模型:方法 2。
如何去除 polygonize 生成的细小多边形?
在 polygonize 之前先对栅格运行 栅格 > 分析 > 滤除碎斑。它会把小于阈值的每个斑块并入与其相邻的最大斑块。事后再删除小多边形,留下的只会是空洞。
QGIS 中的栅格转矢量是免费的吗?
方法 1、方法 3 和方法 4 是免费的:polygonize、重分类、等值线以及清理算法都是 QGIS 核心功能。只有照片处理和付费扫描图追踪需要花钱。
建筑物轮廓指南会完整介绍过滤步骤,QGIS 中的 SAM 文章会介绍这些模型擅长查找哪些对象。QGIS AI 中心会并列比较这些插件。如果您只需要建筑物,我们的免费建筑物轮廓工具可以在浏览器中从开放数据提取建筑物,无需插件。
中将栅格转换为矢量多边形,请打开 栅格 > 转换 > 栅格矢量化 (栅格转矢量)(Raster > Conversion > Polygonize),选择波段,为输出字段命名,然后运行。您会得到一个多边形,对应一组共享同一数值且彼此连通的像素,并且该数值会写入属性表。对于分类栅格,这是正确的方法;对于照片,则不是。还有四种方法可以处理 polygonize 无法读取的栅格。

