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 7.2 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. In the size-stratified sample, 51 percent of the installations at or above 1,000 m2 showed no glint signal at all, and another 26 percent glinted once or on dates that disagree. That detects presence but carries no orientation information. Only 23.2 percent reach this plot.
Corrected 2026-10-22: one pass counted once
Neighbouring Sentinel-2 tiles overlap, so one satellite pass can arrive as two copies. The fit had counted a glint seen in both copies as two dates that agree. That was enough on its own to validate a pose for 10 of the 346 fitted installations (9 ground-mount, 1 rooftop), and they are gone now. None of the remaining fits moved. The page also now includes the second regional top-up of 442 installations, which had been merged into the survey data without the page being rebuilt.
France: the whole population¶
France's survey fits every OSM-mapped installation of 1,000 m2 or more rather than a sample: 1,277 poses from 6,337 installations, 20.2%, against Pakistan's 23.2% at the same size. It is on the France atlas, where every point names its OSM installation and the CSV download carries each one's id and coordinates. Numbers and caveats: France.
India: a second cluster¶
India's survey is a spread sample of 2,000 installations of 1,000 m2 or more, with 312 fitted, and it is the first to read every installation over 50,000 m2 in parts. Its poses split in two: a south-facing cluster like France's, and an east-facing one at low tilt, mostly south of 20 degrees N, resting on April to June dates. High-resolution imagery of the plants behind the east-facing fits mostly shows north-south rows, the layout of single-axis trackers, against east-west rows behind the south-facing ones. A tracker fit is its roll at overpass, not a fixed tilt. It is on the India atlas. Numbers and caveats: India.
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/.