跳转到内容
QGIS
教程
GeoAI

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。

QGIS 3.44 的 Polygonize 文档页面,显示 INPUT、BAND、FIELD 和 EIGHT_CONNECTEDNESS 参数
下面每个默认值的来源:QGIS 3.44 的 gdal:polygonize 文档,拍摄于 2026 年 8 月 23 日。

打开工具

栅格 > 转换 > 栅格矢量化 (栅格转矢量),或者在工具箱的 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。
在 Drome 山谷的 10 m ESA WorldCover 裁剪数据上,真正重要的四个参数。DN 已重命名为 landcover_code,输出直接写入 GeoPackage。

有两点可以帮您节省时间。首先,为不需要的类别设置 NoData 值:GDAL 随后会读取波段的有效性掩膜并跳过这些像素,而不是围绕所有内容生成一个巨大的背景多边形。这是 polygonize 输出最常见的抱怨,而它是栅格属性,不是工具设置。

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

其次,注意波段类型。gdal:polygonize 始终写入整数型字段,因此它会在读入时将浮点波段转换为整数,这会根据栅格存储值的方式产生两种失败结果。两种情况都不会发出警告。Float32 波段应先经过方法 3。

阶梯状边缘与碎斑:先滤除碎斑,再把简化当作整体 Coverage

Polygonize 会追踪像素边界,因此对角线状的田地边缘会变成直角阶梯,每个像素形成一级。10 m 的 Sentinel 分类数据会产生 10 m 的阶梯。

约 1:1,500 比例尺下,覆盖 10 m 土地覆盖栅格的 Polygonize 输出。粉色农田位于绿色树木覆盖和黄色草地之间,每条对角边界都是由单像素阶梯组成的折线。
来自 ESA WorldCover 栅格的原始 gdal:polygonize 输出,共 3,551 个多边形。沿任意对角线数一数阶梯:每一级都是一个 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,221200,6564.9 MB0%0
Polygonize,8 连通7,284200,6564.7 MB0%0
滤除 5 px 碎斑,然后 polygonize3,886168,0603.6 MB0.94%0
滤除 10 px 碎斑(默认值),然后 polygonize2,660155,9203.2 MB1.75%0
滤除 50 px 碎斑,然后 polygonize1,001122,4402.4 MB5.36%0
滤除 10 px 碎斑,然后以 10 m 简化2,66057,8961.5 MB4.11%169 ha
滤除 10 px 碎斑,然后以 10 m 简化 Coverage2,66084,9841.9 MB2.63%0

滤除碎斑优于 $area 过滤,原因相同。删除所有小于 500 m² 的多边形,会移除 5,263 个碎斑,也就是 5 像素阈值滤除的那些,但会留下 94 ha 的空洞;滤除碎斑则把这些像素交给最大的相邻斑块,因此地图保持无缝覆盖。在我们研究语料库中提到 Polygonize 的 51 个 QGIS YouTube 教程里,没有一个在它之前运行滤除碎斑。

同一块 1.2 km 见方土地覆盖多边形的三个面板。左:原始 polygonize,边缘呈阶梯状,有许多单像素碎斑。中:先滤除碎斑,再逐个多边形简化,共享边缘处出现黑色细缝。右:先滤除碎斑,再作为 Coverage 简化,共享边缘干净,没有细缝。
Drôme Crest 西南方向 1.2 km 见方的范围,河流位于上边缘。ESA WorldCover 2021,10 m。中间面板:黑色标记 10 m 逐多边形简化在相邻多边形之间产生的缝隙和重叠。测量于 2026 年 9 月 23 日。

在 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% 的建筑面积。

QGIS 中 Google Satellite 影像上的郊区街道。道路右侧六栋房屋的屋顶以红色勾勒,左侧房屋上方还有更多多边形。
基于模型的 Google Satellite 影像提取结果,拍摄于 2026 年 8 月 23 日。每个屋顶都是独立多边形,可以像任何矢量要素一样编辑。Polygonize 无法生成这种结果:像素值中没有任何信息能区分屋顶和车道。

还有五个插件可以完成这项工作,我们的工具位于最后一行。成本和免费额度数据截至 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 这类本地插件可以满足这一点。

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

方法 3:先重分类,再 polygonize

对连续栅格运行 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,以缩放后的整数存储,直接进行 polygonize。40,000 个像素生成 39,801 个多边形。

坡度、高程、温度和原始反射率波段都会出现同样的问题。该工具追踪整数值之间的边界,而连续栅格没有值得追踪的边界。因此,请使用 Reclassify by table(按表格重分类),id 为 native:reclassifybytable,自行创建类别。

打开按表格重分类

打开工具箱、栅格分析。连续栅格作为输入。

输入类别表

包含三列:最小值、最大值、新值。NoData 可以使用 -inf、inf 和 nan。植被掩膜可以使用三行。

最小值最大值值
-inf0.21
0.20.52
0.5inf3

设置输出数据类型

在高级参数中,输出数据类型(Output data type)默认是 Float32。将其设置为 Byte 或 Int16,这样 polygonize 才能正常工作。

检查范围边界

范围边界(Range boundaries)默认使用 min < value <= max,这决定了恰好为 0.2 的像素归入哪里。请根据类别定义选择边界含义。

Polygonize 结果

对重分类后的栅格运行方法 1,然后执行四个清理步骤。

QGIS Reclassify by Table 对话框,处理 Float32 NDVI 栅格:Output data type 设置为 Byte,Range boundaries 设置为 min 小于 value 且 value 小于等于 max,以及三行类别表。
修正后的表格中的三行植被掩膜。值得修改的两个默认值位于其下方:Output data type,此处为 Byte;以及 Range boundaries。

适用于: 您可以用数字说明一个类别在哪里结束、下一个类别在哪里开始。

不适用于: 您想要的是一个对象,而不是一个数值范围。

方法 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 转换为多边形的步骤。

QGIS Contour 对话框,处理 Copernicus DEM 30 m:间隔为 10,属性名称为 ELEV,未勾选 Produce 3D vector。
Copernicus DEM 30 m 图幅上的 gdal:contour,范围覆盖 Drome。栅格单位间隔为 10,高程写入 ELEV,Produce 3D vector 关闭。
同一丘陵范围的两个面板:棕色 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 的等高线会很嘈杂,因为表面本身就很嘈杂。请在生成等高线之前平滑栅格,不要事后平滑线条:平滑后的线条会彼此交叉。

适用于: 您想要的是一个等级,例如高程、深度、降雨量或浓度。

不适用于: 栅格已经保存了类别。

方法 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 中心会并列比较这些插件。如果您只需要建筑物,我们的免费建筑物轮廓工具可以在浏览器中从开放数据提取建筑物,无需插件。