The latest release of DeepPVMapper was a good starting point, but it did not reflect all the information available regarding rooftop PV in France. First, the unique snapshot did not include any temporal information, which was latently available as multiple coverages had been done. Second, DeepPVMapper is bound to rooftop PV below 36 kWp, which does not encompass all of rooftop PV and in particular installations such as carports or large industrial systems, which are increasingly being deployed.
On the other hand, other sources provided information regarding rooftop PV. The first additional source was the coverage provided by the French Rooftop Photovoltaic dataset (FRPV, Thébault et al., 2025). This map computed a probability of presence of a rooftop PV system over all French buildings. Finally, an additional source are the annotations that are features in OpenStreetMap (OSM). The crowdsourced data of OSM offers high per-record quality — installations are verified by human mappers — but its coverage is inherently uneven.
The question underlying the construction of OpenPVMapper is how to aggregate these sources, into a single dataset, incorporating as much information as possible regarding rooftop PV systems in France?
OpenPVMapper cross-checks two independent, large-scale mapping efforts and integrates a third, smaller but highly reliable source:
The base layer: a two-stage deep learning pipeline deployed
on all 96 mainland départements from national aerial imagery. OpenPVMapper
integrates all 209 départemental mappings, resulting in a total of 803,953.
Each detection features a first_seen attribute, corresponding to the
imagery date. Each installation features its technical characteristics.
Bounded to installations ≤ 36 kWp, and, taken alone, its precision
is the weakest of the three sources (∼45%) — corroboration is what makes
it trustworthy at scale.
An independent detection dataset (Thébault et al., 2025) covering 95 of 96 départements (705,120 candidate buildings), reporting a per-building PV probability rather than a ready-to-use detection. A promotion threshold of 0.5 — calibrated on ∼1,200 manually-labelled parcels with a precision/recall trade-off analysis — decides which parcels are promoted as new installation candidates.
66,293 installations manually mapped and tagged by human contributors, concentrated mainly in the south-west. Modest in scale — it is never the leading source in any region — but because this geometry is human-verified (∼98% precision on its own), it is treated as the most reliable available source whenever it overlaps an existing detection.
Combining heterogeneous sources into one coherent database happens in three steps. First, deduplication: installations are matched across sources by geometric overlap and centroid proximity; 8,659 duplicate pairs were identified and merged this way. Second, geometry supersession: when two sources describe the same real-world installation, one polygon is kept as the reference, following a fixed hierarchy.
Third, enrichment: combining sources adds information no single one carries alone.
Successive DeepPVMapper imagery vintages are matched to give each installation a first_seen
/ last_seen span, and every installation records which sources corroborate it — a
direct, per-record proxy for confidence. The result is a single, uniform schema regardless of which
source(s) identified a given installation, documented in full alongside the Zenodo release.
The pipeline is designed to be evolutive. Additional sources could fit within that framework to improve the data quality and coverage.
An independent, manually-annotated campaign quantifies the database's precision. 1,862 installations — stratified both by source combination and by power class, and annotated blind against high-resolution imagery — were used to estimate precision directly, reweighted by each stratum's true population share.
The database's overall precision is approximately 74–75%. Corroboration is the main driver of this figure: precision is as low as 71.5% for installations confirmed by a single source, rising to 96.9% with two independent sources and 98.2% with all three — nearly all the gain happens between one source and two. This matters because standalone precision varies widely by source (DeepPVMapper ∼45%, FRPV ∼78%, OpenStreetMap ∼98%): combining independent, differently-biased sources is what lifts the weakest of the three to a reliable result, more than any single source's own accuracy.
Recall is validated indirectly, by comparing the database's connected capacity against Enedis's public grid-connection registry. Overall, about 67% of all capacity below 250 kWp is covered in the dataset, and in detail, 40% of the capacity between 100 and 250 kWp, and 97% of the capacity below 36 kWp.
OpenPVMapper provides the highest coverage in the capacity segment that is the least documented in public data: installations below 36 kWp, thereby addressing a real gap in official PV statistics.
Merging three different sources increased data coverage and provided a harmonized description of the systems. DeepPVMapper features about 800k systems (alongside tilt, azimuth and installed capacity estimation), FRPV 700k pointwise detections and OSM about 66k polygons. OpenPVMapper features 1.1M detections, alongside their technical characteristics, first detection year, and source redundancy.
Coverage redundancy also had a second effect: sharply increasing data quality, where a detection corroborated by 2 or more sources had a precision of 97%, approaching the quality of OpenStreetMap labels (98%) and sharply improving the precision of the individual detections (about 75%).
Future improvements include improving the coverage in the 100-250 kWp segment and integrating crowdsourced validation into the dataset to improve the overall quality. Want to contribute? See the Contribute page!
OpenPVMapper is released under an open licence (CC-BY 4.0) and can be accessed on Zenodo and HuggingFace.
@article{kasmi2026openpvmapper,
title={OpenPVMapper: A Multi-source, Nationwide Database of Rooftop Photovoltaic Systems in France},
author={Kasmi, Gabriel},
journal={arXiv preprint arXiv:2607.25153},
year={2026}
}