QGIS 树冠制图:6 种免费与付费方法

要在
中使用多光谱影像绘制树冠,先在 Raster > Raster Calculator… 中建立 NDVI,再用 Reclassify by table 按阈值切分,最后运行 Raster > Conversion > Polygonize (raster to vector)。这样得到的是覆盖范围,而不是单株树木。其他五种方法涵盖 LiDAR、开放数据,以及需要每个树冠一个多边形的情况。
网络上的常见误区
教程和论坛帖子里反复出现三种说法,而每一种都会浪费你一个下午。
“设定 NDVI 阈值,你就得到了树木。” NDVI 区分绿色与非绿色。草坪、小麦田和橡树都是绿色的,所以三者都会落入同一类别。NDVI 给你的是植被覆盖范围,把它称为树冠是一个需要说明依据的判断。
“直接从 LAS 文件生成 canopy height model。” 地面表面来自被分类为地面的点,而 QGIS 3.44 没有负责分类的算法。在未分类的点云上,过滤器会返回空结果,地形也会变成平面。
“安装最新版 Semi-Automatic Classification Plugin。” 9.0.4 版本需要 QGIS 3.99,也就是 QGIS 4 系列。在 QGIS 3.44 上,管理器提供的是 2024 年 11 月发布的 8.5.0,所以在责怪训练样本之前,先检查自己实际安装的是哪个版本。
简短答案
| 你拥有的数据 | 方法 | 成本 |
|---|---|---|
| 带有近红外波段的多光谱影像 | 方法 1,NDVI 后 polygonize | 免费,QGIS 核心功能 |
| LiDAR,或 DSM 与 DTM | 方法 2,canopy height model | 免费,QGIS 核心功能 |
| 需要分离多个类别的影像 | 方法 3,有监督分类 | 免费,一个 plugin |
| 范围很大,接受使用去年的日期 | 方法 4,开放 canopy 数据集 | 免费下载 |
| RGB 影像和 NVIDIA 显卡 | 方法 5,本地 segmentation model | 免费,但需要找到 model |
| RGB 影像、没有显卡、需要树冠 | 方法 6,云端 segmentation model | 免费额度,之后订阅 |
开始之前
使用投影 CRS。这里的每种方法最后都要计算面积,而以度为单位的面积没有实际意义。
先决定你需要的是覆盖范围还是树冠。覆盖范围是一整片表面,可以直接得到百分比。树冠是可计数的对象,这正是街道调查或公园清查所需要的结果。
方法 1:NDVI 阈值
NDVI 将绿色植被与屋顶、道路和水体分开。打开 Raster > Raster Calculator…,输入 ("nir@1" - "red@1") / ("nir@1" + "red@1")。

然后运行 Reclassify by table(native:reclassifybytable、Processing Toolbox、Raster analysis),将阈值以上和以下各设为一行,并将输出数据类型设为 Byte。对结果进行 Polygonize。
**适合场景:**影像带有近红外波段,并且你需要覆盖范围。
**跳过场景:**必须把树木与草坪或农作物区分开。NDVI 做不到,因为三者都是绿色的。
方法 2:从 LiDAR 生成 canopy height model
高度是唯一能把树木与草坪区分开的信号,而 QGIS 可以直接从 LAS 或 LAZ 文件生成两个表面,使用 Export to raster(pdal:exportraster、Point Cloud Conversion)。将 Attribute 设为 Z。对于地形,添加过滤表达式 Classification == 2,这是 QGIS 所使用 ASPRS 类别中的 Ground。对于表面,按 ReturnNumber == 1 过滤。

在 Raster > Raster Calculator… 中用 "dsm@1" - "dtm@1" 做减法,或者在较大的 tile 上使用 grass:r.mapcalc.simple。按你的规范中定义为 canopy 的高度进行重分类,然后 Polygonize。输出会为每个 pixel 携带高度,这是本页其他方法都无法提供的信息。
**适合场景:**你拥有 LiDAR,或一组国家级 DSM 和 DTM。
**跳过场景:**点云没有分类。QGIS 3.44 没有地面分类算法,因此未分类点需要先在 QGIS 外部通过 PDAL 处理。
方法 3:有监督分类
为树木、草地、屋顶和道路绘制训练多边形,然后让分类器为每个 pixel 赋予类别,并对树木类别进行 Polygonize。dzetsaka 是我今天会安装的 plugin。它采用 GPL 许可,版本为 5.0.11,可运行于 QGIS 3.0 至 4.99,并提供包括 Random Forest 和 SVM 在内的 11 种分类器。
Semi-Automatic Classification Plugin 更为知名,也能处理波段组和预处理,但要先检查版本。9.0.4 版本需要 QGIS 3.99,也就是 QGIS 4 系列。在 QGIS 3.44 上,你得到的是 2024 年 11 月发布的 8.5.0。
**适合场景:**canopy 是同一场景中需要提取的多个类别之一。
**跳过场景:**你只需要树木。训练样本所花的时间比方法 1 更多。
方法 4:开放 canopy 数据集
也许已经有人绘制过你的区域。

有四个值得了解。Meta and WRI canopy height map 覆盖全球,自 2026 年 3 月起为第 2 版,pixel 大小为 1.2 m,相对于机载 LiDAR 的平均绝对误差为 3.0 m。ETH Zurich's map 针对 2020 年提供 10 m 分辨率数据,来源为 Sentinel-2 和 GEDI,采用 CC BY 4.0 许可。
另外两个数据集具有区域性或历史性。Copernicus Tree Cover Density layer 以 10 m 分辨率覆盖欧洲,从 2018 年到 2024 年按年提供,下载需要 EU Login。Hansen Global Forest Change 分辨率为 30 m,时间从 2000 年开始,因此适合分析随时间变化的情况。
城市也会发布自己的数据。巴黎提供 219,432 棵树的点数据,墨尔本提供 2021 年的 57,980 个树冠多边形,二者都是可以粘贴到 QGIS 中的 GeoJSON URL。
四个全球 raster 都支持 range requests,因此可以使用 /vsicurl/ 流式读取 tile,而不是下载整个文件。Copernicus 在 https://land.copernicus.eu/cdse/tcd_europe_10m_yearly 提供 WMTS,你需要手动设置年份。它宣传的日期最早可追溯到 1984 年,但几乎没有日期实际包含数据。
**适合场景:**区域很大,并且采集日期不必是你自己的。
**跳过场景:**你上个月才飞行采集了现场,或者你需要树冠。这里的大多数数据是百分比 raster,而不是可计数的对象。
方法 5:本地 segmentation model
Deepness、Geo-SAM 和 samgeo 会在你的设备上运行 segmentation model。任何数据都不会离开设备,也不会产生费用。
**适合场景:**影像不能离开你的设备。
**跳过场景:**你没有 NVIDIA 显卡,或者不想寻找 model、申请 weights 并构建 Python 环境。
方法 6:云端 segmentation model
segmentation model 已经学会了树冠的样子,因此它能把一片林分拆成可计数的对象,而阈值方法只会返回一整片。我们构建了其中一种,AI Segmentation。本节介绍的是我们自己的工具。
在 QGIS 中对已经打开的影像绘制一个区域,然后输入一个词。多边形会以项目 CRS 写入,每个多边形都带有面积和 confidence score。输入 tree 可得到每个树冠一个多边形,输入 tree canopy 可得到作为表面的覆盖范围。

**最适合:**在没有 GPU 的设备上,从 RGB 影像中为每个树冠生成一个多边形。
**价格:**每月免费处理 3 km² 地面范围,另有 50 个 cloud Semi-Auto objects,无需 card。Pro 版本每月 39 欧元,不含 VAT,可处理 200 km² 和 500 个 objects。
**运行环境:**QGIS 3.22 及更高版本,Windows、macOS 或 Linux。model 在欧盟境内的服务器上运行。
**安装:**plugin manager,然后用 email 登录。不需要 packages,也不需要 weights。
**它的优势:**简单的词语表现良好。在 90 天的真实运行中,tree 在 10.5% 的 tiles 上返回空结果,而 orchard 在 716 个 tiles 上的空结果率为 47.3%,因此 plugin 会在你产生费用之前,将第二个词提示为第一个词。
**它的不足:**封闭林分没有可识别的树冠边界,因此 tree 运行会返回一整片,而不是每个树干一个多边形。在这种情况下使用 tree canopy,并接受覆盖范围结果。两种 cloud 模式都会将影像发送到我们的服务器,只有在你自己的设备上运行的 Semi-Auto 不会这样做。
六种方法并排比较
| 你的需求 | 方法 |
|---|---|
| 使用自己的多光谱影像获取覆盖范围 | 方法 1 |
| 获取 canopy 高度,或将树木与草地分开 | 方法 2 |
| 将 canopy 作为多个类别中的一个类别 | 方法 3 |
| 快速、免费处理大范围区域 | 方法 4 |
| 树冠,且数据不离开设备 | 方法 5 |
| RGB 影像中的树冠,无需 GPU | 方法 6 |
需要记住的内容
选择方法之前,先决定你需要覆盖范围还是树冠,因为这是关于交付成果的问题,而不是关于影像的问题。
只要能获得高度数据,高度就胜过颜色,因此只要有 LiDAR,LiDAR canopy height model 就是更好的选择。
NDVI 会把草坪、农作物和橡树视为同一种东西,因此单靠阈值永远无法得到树木。
封闭林分没有可识别的树冠边界,因此本页的每种方法在那里都会返回覆盖范围,没有一种能返回树干数量。
对于整个欧洲范围的覆盖百分比,Copernicus layer 免费且已经完成,因此在该区域运行 model 等于为同一个答案付两次钱。
Try it free in QGIS, no card needed
大家常问的问题
QGIS 不使用 plugin 可以绘制树冠吗?
可以,通过方法 1、2 和 4,也就是 QGIS 核心功能加上数据下载。但你得到的是多边形形式的覆盖范围,永远不是单个树冠。
每棵树一个多边形,还是整个 canopy 一个多边形?
NDVI 或高度 model 的阈值处理会给你覆盖范围。只有 segmentation model 能把林分拆成可计数的树冠,而在方法 6 中,你输入的词决定了最终得到两者中的哪一种。
如何计算 canopy 覆盖百分比?
每个多边形都有自己的面积,因此将面积列求和,再除以你测量的区域面积。这只需要一次字段计算,而且几何数据可以打开检查。
NDVI 和 LiDAR height model 哪个更准确?
height model,而且差距很明显。NDVI 会把草坪和橡树视为同一种东西,而 canopy height model 会通过数米的高度差将它们分开。
这些方法有免费的吗?
方法 1 至 5 除了你自己的数据,以及方法 5 所需的 graphics card 之外,不产生费用。方法 6 每月免费提供 3 km²,之后为每月 39 欧元,不含 VAT。
raster to vector guide 介绍了本页每种方法最后都会进行的 polygonize 和清理步骤,SAM in QGIS post 比较了运行 segmentation model 的 plugins。QGIS AI hub 位于两者之上。


