Panel pose from solar glint¶
A glass-fronted PV panel is partly a mirror. Sentinel-2 views close to nadir, so a fixed panel reflects the sun into the sensor only when its tilt and azimuth happen to bisect the sun and the satellite at the roughly 10:30 local overpass. That is a narrow, geometry-predictable condition, which makes it useful twice over: a flash is physical evidence that something specular is on that roof, and the set of dates on which it flashed inverts to a single panel orientation.
The country survey¶
The interactive version below adds per-installation detail, the tilt and azimuth histograms, and the validation rate by size.
Three things in that plot are worth stating plainly.
Nothing measured crosses due south, and that is the sensor, not the roofs. Sentinel-2 crosses this latitude at a fixed local time, so over two full years the sun's azimuth at the moment of every overpass never once swings west of south. A panel facing southwest, west, north or northeast cannot glint into this sensor no matter how long you wait, so the shaded wedge covering that arc is not measured emptiness -- it is missing measurement. Installations facing that way are invisible to this method, not absent, so the plot shows only what was actually measured rather than assuming the population is mirror-symmetric about the south axis and filling the rest in.
The population is dispersed, and bimodally so. Tilt ranges from 2.5 to 28.6 degrees with an interquartile range of 6.3 to 18.8, and it splits into a shallow cluster around 3 to 6 degrees (ground and utility mounts) and a broad hump at 15 to 21 degrees (typical fixed-pitch rooftop). The single densest tilt-and-azimuth bin holds under 10 percent of the fitted population.
Most installations never produce a fittable pose. Of the installations at or above 1,000 m2, 51 percent showed no glint signal at all and another 25 percent glinted once, or on dates that disagree, which detects presence but carries no orientation information. Only 23.6 percent reach this plot.
What glint is and is not good for¶
Glint is a reward-only signal in this pipeline. A candidate with two or more mutually
consistent spike dates gets a rank_score boost; a candidate with none is left exactly
where it was. The reason is in the sensitivity curve below: real installations frequently
do not glint, so absence is not evidence.
Two properties of that curve drive how the signal is used:
- Detection scales with size, cleanly and monotonically. Larger arrays get more chances at a glint, not brighter ones; spike amplitude is roughly constant at 2.2 to 3.1 times baseline across every size class.
- Geometric validation plateaus, it does not keep climbing. Utility plants above 50,000 m2 are the easiest to detect but validate no better than mid-size arrays, because large plants mix orientations and often track the sun, which a single-plane fit cannot explain. The orientation fit is a rooftop and fixed-tilt tool.
Dividing the validated rate by the 8.7 percent control floor gives a per-bucket likelihood
ratio, which is what the rank_score multiplier is derived from: roughly 1.9 times for
500 to 1,000 m2, 3.5 times for 1,000 to 5,000, 3 times above that, and
1 times below 500 m2, where the instrument is blind and the pipeline
therefore never spends a query.
Seeing it¶
The glint image gallery shows six real installations glinting in high-resolution imagery, plus the same phenomenon rendered from raw Sentinel-2 data, one example per size bucket.
For how the detector works, the tile-batched fetch strategy, and the dense-urban self-referenced mode, see Solar glint.
Reproducing¶
pixi run python scripts/glint_validate_pakistan.py sample # stratified 500-target sample
pixi run python scripts/glint_validate_pakistan.py pull # ~2 years of scene stats, resumable
pixi run python scripts/glint_validate_pakistan.py analyze # summary and aggregate CSVs
.pixi/envs/default/bin/python scripts/build_pv_pose_country2000.py # the pose page above
The pull is network-bound and survives Planetary Computer outages by resuming per target.
Full report and CSVs: results/glint_validation_pakistan/.