跳转到内容
AI Segmentation
QGIS
教程

QGIS识别屋顶光伏:5种方法对比

同一片郊房屋顶的三联对比:原始航拍影像、叠加OpenStreetMap太阳能发电机稀疏轮廓的屋顶、以及每个阵列都被检测为独立多边形的屋顶。

要在中绘制屋顶光伏,先从别人已经绘好的数据开始。打开 Vector > QuickOSM > QuickOSM…,在 key 框中填入 generator:source,在 value 框中填入 solar,在你的区域上运行。OpenStreetMap 带有该标签的对象有 6,143,024 个,读取于 3 September 2026,因此在调查完善的城镇,两分钟即可完成。覆盖稀疏的地方需要你自己检测阵列,具体方法取决于你的波段和像素尺寸。

网上的说法错在哪里

三个答案反复出现,每一个都会浪费你一天时间才发现不行。

“用 Sentinel-2。” 它的像素是 10 m,而一块板只有 1 到 2 m 长,所以整个屋顶都落在一个像素里。Sentinel-2 能找到地面电站,但永远找不到屋顶。

“用 SCP 给正射影像做分类。” plugin 自己的 FAQ 排除了这种输入:“You cannot use orthophotos with less than 4 bands”。大多数人手里的是 RGB 正射影像或底图,而这正是 SCP 不能用的唯一输入。

“检出之后再数板子。” Clark 和 Pacifici 发现单个组件“difficult to distinguish even at 15.5 cm resolution”。影像能给你阵列和面积,组件数量和千瓦数要去登记库查。

简短答案

你的输入方法花费
OpenStreetMap 已经调查完善的区域方法 1,QuickOSM免费
带近红外波段的多光谱影像方法 2,Raster > Raster Calculator…免费,QGIS 核心
四个或更多波段,且有时间画训练区方法 3,Semi-Automatic Classification Plugin免费 plugin
20 cm 左右的 RGB 正射影像,且有 GPU 或耐心方法 4,Deepness 加其 Solar PV 模型免费
画布上显示的任何 raster,任何机器方法 5,云端分割模型每月免费 3 km²,之后 €39

我如何对比它们

五个标准:所需波段、方法失效以下的分辨率、你的影像是否离开本机、拿到第一个多边形之前的花费、输出是多边形还是像素。价格、plugin 版本和标签计数均读取于 3 September 2026。我们构建其中之一,也就是方法 5。

还有一项工作我会交给别处。要统计全国装机容量,公用事业登记库胜过这里的每一种方法,因为它知道千瓦数,而影像永远不知道。

开始之前

地面分辨率决定一切。Bradbury 等人在 30 cm 上构建参考 PV 数据集,因为“solar panels are typically between 1 and 2 meters in length”,这样每块板上有几个像素。这能分辨阵列,分辨不了里面的组件。Clark 和 Pacifici 发现单个面板“difficult to distinguish even at 15.5 cm resolution”。已发表的屋顶 PV 工作集中在 10 cm 到 31 cm 之间。10 m 的 Sentinel-2 只做电站,从不做屋顶。

在投影坐标系下工作,因为下面有两步要按 layer 单位取面积。

Four crops of aerial imagery side by side, labelled: a real rooftop PV array, a dark flat roof, a run of roof skylights, and a solar thermal collector panel.
Four crops at the same scale. Only the first is photovoltaic. Every automatic method here confuses at least two of the other three.

方法 1:拿现成的测绘成果

QGIS 在 3.0 中移除了自带的 OSM 下载器,并指向 QuickOSM,所以先装它。

Query the generators

Vector > QuickOSM > QuickOSM…,key 填 generator:source,value 填 solar,按你的范围或地名运行。屋顶阵列带有 power=generator,常带 generator:method=photovoltaic

Query the plants separately

地面电站标注为 power=plantplant:source=solar,是另一个查询。漏掉它,你的 layer 里会缺掉所有电站。

Go to the registry for kilowatts

德国 Marktstammdatenregister 每天以 XML 发布,但 30 kW 及以下的机组隐去坐标,屋顶只能落到邮编。法国登记库止于 IRIS 区,36 kW 以下全部折叠为汇总行。

The QuickOSM dialog in QGIS with key generator:source and value solar, and the resulting solar generator polygons drawn over aerial imagery of a small town.
One QuickOSM query, key generator:source, value solar. Where a local mapper has been through, this is the whole job.

三个开放数据集可用作训练数据或基准。Bradbury 等,四个加州城市 30 cm 上 19,863 个标注 PV 多边形,CC0。BDAPPV,28,807 个法国安装含掩膜,CC BY 4.0。DeepSolar 数出美国本土 147 万套系统,但发布的是人口普查区计数,不是多边形。

用它,当: 有人调查过你的区域,或你要的是容量而不是形状。

不用它,当: 覆盖零散,而这只有看了才知道。

方法 2:在 raster 计算器里阈值分割

Raster > Raster Calculator…,算法 id 为 native:rastercalc。板子发暗,在近红外中比深色屋顶暗得多,所以红光和 NIR 波段之间的归一化指数在大多数场景都能分开。然后 gdal:sieve 去掉斑点,gdal:polygonize 生成多边形。

在三波段 RGB 上这会失败,因为深色屋顶和板子的值重合。常用补救是纹理。grass:r.texture 计算 13 种 GLCM 测度,阵列在对比度上偏高、在逆差距矩上偏低。GRASS 随 Windows 安装包一起发布,不随 macOS 包发布。

用它,当: 你有近红外波段,且是单一干净场景。

不用它,当: 影像是 RGB,或阈值要在不同日期拍摄的镶嵌图中通用。

方法 3:用 SCP 做监督分类

Semi-Automatic Classification Plugin 会增加 SCP 菜单和 SCP Dock。建 Band set,在板子和每种易混物上画 ROI,然后用 Maximum Likelihood、Minimum Distance、Spectral Angle Mapping、Random Forest、Support Vector Machine 或 Multi-layer Perceptron 分类。8.5.0 是 QGIS 3.x 会装到的版本,GPL v3,下载 2,644,482 次。

它自己的 FAQ 排除了大多数人手里的输入。“You cannot use orthophotos with less than 4 bands”,因为低于四个波段算法分不开类别。

用它,当: 你有四个或更多波段,想要可重复、可记录的分类。

不用它,当: 你的输入是 RGB 正射影像或底图。

方法 4:在 Deepness 里跑本地模型

Deepness 在 QGIS 内跑 ONNX 模型,免费,Apache 2.0,它的模型库自带 Solar PV Segmentation 模型,20 cm/px,由 Kleebauer 等训练、Fraunhofer 托管。指向你的正射影像即可得到板子掩膜,无需账号,什么都不离开本机。

速度是短板。有用户测过同一模型:“80+ minutes for a digital Orthophoto tile (20 cm resultion, 5000 points in each direction)”,在 CPU 上,该 issue 仍未关闭。除此之外,没有维护良好的开放屋顶 PV 模型。

用它,当: 什么都不能离开本机,且你的正射接近 20 cm。

不用它,当: 你没有 NVIDIA 卡,却要覆盖一个区。

方法 5:云端分割模型

分割模型学过阵列的样子,所以在方法 2 和方法 3 分不开深色屋顶的地方,它能分开。我们构建其中之一,AI Segmentation。本节讲我们自己的工具。

在画布显示的任何 raster 上画一个区,输入 solar panel,每个阵列以项目 CRS 下的多边形返回,带面积和置信度分数。模型跑在我们在欧洲的服务器上,所以不需要显卡,也不需要 Python 环境。

A farm building roof on aerial imagery in QGIS, with five separate solar panel groups each outlined as its own coloured polygon and the bare roof between them untouched.
One run on a farm roof. Five array groups, each its own polygon, the bare roof between them left alone.

在 5 July 到 1 September 2026 之间,我们团队之外的 47 人运行 solar panel 104 次,15.6% 的瓦片返回为空。在 96 次导出运行中,模型找到 40,088 个候选,他们保留 14,245 个,即 35.5%,覆盖 496,931 m² 板子。

输入 solar panel,不要输入 solar farm。后者要的是整个场站,模型会回答一个均匀面或空白。在现有少量运行中,它让 24 个瓦片中的 21 个为空。

最适合: 在任何机器上,做一个区范围的屋顶阵列。

不适合: 数组件。密集阵列返回为一个面,所以在 QGIS 里拆分,或除以你已知的组件占地。住宅组件约 1.7 m 乘 1.1 m。

价格: 每月 3 km² 免费,无需卡。Pro 为每月 €39,不含增值税。

运行在: 我们的服务器,在欧洲。

安装: plugin 管理器,QGIS 3.22 或更高,然后从面板登录。

五种方法并排对比

QuickOSMRaster calculatorSCPDeepnessAI Segmentation
所需波段NIR 有帮助四个或更多三个三个
影像留在本地
GPU推荐
输出OSM 多边形Raster 掩膜类别 raster板子掩膜每个阵列一个多边形
花费免费免费免费免费免费额度,之后 €39

记住什么

先查 OpenStreetMap,因为调查完善的城镇两分钟收工,没有检测能胜过到过现场的绘图者。

如果影像不能离开本机,只有 Deepness 和它的本地 Solar PV 模型可选。

在 RGB 底图上,raster 计算器和 SCP 出局,因为两者都不能仅按值把板子和深色屋顶分开。

30 cm 左右能分辨阵列,没有分辨率能分辨里面的组件,所以只画面积,永远不要从影像数板子。

千瓦数来自公用事业登记库,永远不是来自图片,而法国和德国登记库都会模糊小型屋顶机组的位置。

Try it free in QGIS, no card needed

大家常问的问题

QGIS 能自己检测太阳能板吗?

不行。QGIS 核心只有阈值分割和面矢量化,需要光谱差异,所以 RGB 底图给不了你任何东西。检测来自 plugin,本地用 Deepness,云端用我们的。

需要什么分辨率的影像?

按 Bradbury 等,30 cm 左右能分辨阵列。单个组件在 15.5 cm 下仍然难分,所以按阵列和面积规划,不要数板子。

如何区分太阳能板和深色屋顶?

在三波段上,仅按值分不开。用近红外波段、用 grass:r.texture 这类纹理测度,或用学过阵列样子的模型。

地面光伏电站也能找到吗?

能,在 OpenStreetMap 中是另一个查询,power=plantplant:source=solar。用模型时,电站也输入 solar panel,因为它检测每块板子,而不是场站。

能数出装了多少块板吗?

不能从影像数。检测给出轮廓和面积,组件数量和千瓦数来自登记库,而在法国只到 IRIS 区。

建筑足迹指南 完整讲了过滤步骤,QGIS 中的 SAM 一文 讲了这类模型擅长找哪些对象。QGIS AI 中心 对比了各 plugin,产品页是 AI Segmentation