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

要在
中绘制屋顶光伏,先从别人已经绘好的数据开始。打开 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 单位取面积。

方法 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=plant 加 plant:source=solar,是另一个查询。漏掉它,你的 layer 里会缺掉所有电站。
Go to the registry for kilowatts
德国 Marktstammdatenregister 每天以 XML 发布,但 30 kW 及以下的机组隐去坐标,屋顶只能落到邮编。法国登记库止于 IRIS 区,36 kW 以下全部折叠为汇总行。

三个开放数据集可用作训练数据或基准。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 环境。

在 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 或更高,然后从面板登录。
五种方法并排对比
| QuickOSM | Raster calculator | SCP | Deepness | AI 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=plant 加 plant:source=solar。用模型时,电站也输入 solar panel,因为它检测每块板子,而不是场站。
能数出装了多少块板吗?
不能从影像数。检测给出轮廓和面积,组件数量和千瓦数来自登记库,而在法国只到 IRIS 区。
建筑足迹指南 完整讲了过滤步骤,QGIS 中的 SAM 一文 讲了这类模型擅长找哪些对象。QGIS AI 中心 对比了各 plugin,产品页是 AI Segmentation。


