India: the merge cap hid the unmapped parks, and the localized detector lost¶
India was composed and run between 23 September and 11 October 2026, the largest
country this pipeline has attempted: 25,576 cells of 0.1°, about four times Nigeria.
Between 22 and 27 October the compose was widened to every cell within three of that
selection, 29,171 cells in all
(below).
Like Zambia, Nigeria and Vietnam it started with no
calibration quadrats, no national register and no third-party PV dataset to check against.
It was run under the owner's standing instruction to localize the segmentation on the
country's own OpenStreetMap labels and to ship whichever checkpoint scores better on a
held-out region. Here, unlike Vietnam, the localized checkpoint lost, so this page runs on
v5_combined_france. It supersedes an earlier state-level Gujarat page.
Interactive: India PV evidence atlas.
Headline¶
| Verified | 70,523.4 MWp (90% 49,526 to 101,390) |
| Best estimate | 103,036.9 MWp (90% 83,676 to 132,969) |
| Grid | all 29,171 selected cells of 0.1° (97.1% of India's 30,056), 35 of 36 states and union territories (geoBoundaries) |
| Imagery | Sentinel-2 L2A, November 2025 to March 2026 |
| Model | v5_combined_france epoch 25 (the localized v10_combined_india lost; see below) |
Revised the day it was published
This page first went out on 11 October with Best at 75,855.7 MWp (90% 66,332 to 99,761). Later that day two defects in how mapped park outlines enter Best were fixed, both described in the screen section: the Khavda outlines the screen rejects had come back into Best whole, and 101 park outlines had been placed on rooftops. Best fell by 3,584.6 MWp; Verified did not move.
Widened on 28 October
Until 28 October this page read Best 72,271.1 MWp (90% 63,487 to 98,370) on 25,579 cells. The compose widening described below raised it by 434.0 MWp. Most of the rise is Khavda's park outlines, now imaged whole; about 220 MWp is false positives on Himalayan slopes, which the page carries. Verified did not move.
Revised on 29 October
Until 29 October this page read Best 72,705.1 MWp (90% 63,865 to 98,370) and Verified 67,592.6 MWp. Two size rules were keeping real installations out. Model outlines above the 100,000 m² merge cap with no mapped solar nearby were excluded, though most are solar parks OpenStreetMap does not hold yet; they now count at a reviewed share (below), which raised Best by about 25,400 MWp. Mapped outlines above 5 km² that fail the ground screen were dropped from Verified and came into Best at half their detected share; both tiers now carry them at that share (below), which raised Verified by 2,930.8 MWp and Best by about 1,500. Best rose by 26,836.4 MWp in all. Against MNRE's state-wise register, ground-mounted Best is now 0.88 of the registered capacity (below), about 0.64 before.
Revised on 2 November
Until 2 November this page read Best 82,574.1 MWp (90% 70,770 to 107,295). The owner has now judged every outline above the merge cap that the lead screens keep, on the disk review page: 1,346 of the 1,550 queued are parks, so 1,427 count, 577.1 km², up from 81 and 185.0 km² (below). A judged park now also adds to the mapped figure in Best's per-cell floor, which had been hiding 2,274 MWp of the new parks and 854 MWp of the earlier 81. Best rises by 20,462.8 MWp; Verified did not move. Against MNRE's register ground-mounted Best is now 0.91 of the registered capacity, 0.82 on an AC basis.
Revised on 1 November
Until 1 November this page read Best 99,541.5 MWp (90% 80,394 to 128,501). The owner's rule since: a model outline above the merge cap counts only once it is mapped in OpenStreetMap or a person has judged it solar on the imagery the model saw. The 1,650 outlines admitted on 29 October counted at the review sample's share real; now only the 81 the review found to be parks count, each whole, 185.0 of the 569.4 km² credited before (below). Best fell by 16,967.4 MWp; Verified did not move. Against MNRE's register ground-mounted Best was then 0.73 of the registered capacity. The other 1,699 outlines went to the atlas's blob file, each waiting for a verdict.
A precision floor, not an estimate
India has no calibration quadrats, so there is no roofclf half and no instrument
at all below the 400 m² segmentation floor. It has no glint sample, so
p_unmapped is 0 and p_real collapses to the OpenStreetMap-mapped fraction, except
for the model outlines above the merge cap that a person has judged solar, which count
whole. Recall
was deliberately skipped (--recall-reference none). For scale, MNRE puts India's
installed solar at 171.05 GW, of which 125.65 GW is ground-mounted and 33.41 GW
grid-connected rooftop
(MNRE physical progress; the page's heading
says 31 August 2026 and its table 30 September). The household rooftop programme alone
had installed about 14.07 GW across 39.38 lakh systems by 20 July 2026, about 3.6 kW
each
(Energetica India).
A 3.6 kW system is about 20 m² of panel, a fifth of one Sentinel-2 pixel: the same
size regime in which France showed this sensor cannot see rooftop PV.
Localizing the detector, and why v5 ships¶
Labels. 24,810 OpenStreetMap solar features inside India (3,751 rooftop, 20,887 ground, 172 unclassified), out of 53,138 in the country's bounding box. Like Vietnam's, the mapped population is dominated by utility parks.
Holdout, inherited rather than re-picked. Gujarat's Surat-Bharuch-Vadodara box (lon 72.7 to 73.9, lat 21.0 to 23.0), 240 cells. v5 held this box out of its own Gujarat corpus, so both checkpoints are scored out of sample on it, and inheriting it left no free choice. Training chips in the one-cell ring around it were dropped (13 chips).
Corpus and recipe. 5,167 train and 82 val chips (3,872 with PV). India's chips replace
the Gujarat corpus in v5's mix, since they already cover Gujarat, and were weighted x1
(round(7000 / 5,167)), giving 29,740 rows with India at 17.7%. The recipe is v5's
verbatim. Best epoch 13, early-stopped at epoch 21, 6.4 hours on the GTX 1060.
The ship decision, scripts/compare_local_vs_v5.py on the 82 held-out chips:
| v5 | v10 (localized) | |
|---|---|---|
| recall, installations at or above 500 m² | 0.938 (241 of 257) | 0.911 (234 of 257) |
| pixel IoU | 0.686 | 0.663 |
| pixel F1 | 0.814 | 0.798 |
The rule compares recall first, and a difference above 0.02 decides: v5 ships. The margin is seven installations of 257 on one holdout, which is not strong evidence that localization hurts in India. It is evidence that it did not help: v5 already carries Gujarat's chips from outside this box, and India's labels are 84% ground-mount, the population every earlier corpus already covers well. Vietnam's localized checkpoint won on outline quality (IoU 0.724 to 0.762) with recall tied; India's lost on both.
The whole-country comparison, after the atlas (compare_checkpoints_vs_mapped.py, both
checkpoints inferred over all 25,576 cells, scored against the 4,010 dissolved mapped
installations of 400 m² and up that both imaged), finished on 13 October:
| v5 (ships) | v10 (localized) | |
|---|---|---|
| pooled recall over mapped installations | 0.501 (2,011) | 0.441 (1,767) |
| recall, 500 to 50,000 m² | 0.698 (1,314 of 1,883) | 0.606 (1,141) |
| recall above 50,000 m², counting candidates above the cap | 0.937 | 0.936 |
| candidates below the 100,000 m² merge cap | 92,139 | 33,454 |
| median candidate area | 1,601 m² | 5,104 m² |
| total candidate area below the cap | 528.1 km² | 505.5 km² |
| candidates above the cap | 3,242 (2,081 km²) | 4,485 (2,472 km²) |
| rooftop share below the cap | 35.2% | 30.7% |
The script drops candidates above the merge cap, as density does, and India's parks are
mostly found by exactly such candidates, so its own recall for the 2,066 installations above
50,000 m² reads 0.32 and 0.29. Counting them, both checkpoints find 94% of the parks; the
difference is in the arrays between 500 and 50,000 m². This recall favours v10 and v10
still loses: it trained on every Indian label outside the Gujarat box, so it is scored here
largely in-sample, while v5's only Indian training data is Gujarat's chips. 338 installations are found by v5
alone against 94 by v10 alone (McNemar p < 0.001). In Vietnam the localized checkpoint drew
fewer, larger candidates and kept its recall; v10 draws 64% fewer candidates at three times
the median area, holds about the same total area below the cap, merges about 1,250 more
model-drawn blobs above it and finds fewer mapped arrays. The diagnostic confirms the
holdout decision rather than qualifying it.
A compose defect, found here and fixed for every later country¶
Rewa Ultra Mega Solar (750 MW, fully mapped) came out of the ground-perimeter screen as
0% imaged. Its two cells were 87% empty. annual_composite kept the twelve scenes with
the lowest eo:cloud_cover, a property of the whole MGRS tile, and in India's dry season
dozens of scenes tie at 0.0%. For Rewa's cell all twelve came from tile 44QNM, which covers
11% of the cell, while equally cloud-free 44RNN scenes covering all of it ranked 15th and
below. A second defect shows up in the same composites: about 33,000 failed range requests
during India's compose, silently turned into zeros, left 1.3% of cells with at least one band
entirely missing, and on such a cell the model mostly detects nothing.
On a random sample of 3,000 Indian composites, 1.3% of cells have a tile-edge gap above 5%
and together they lose 0.79% of imaged area. Nationally that is small; for Rewa it removed a
750 MW park from Verified, because the ground cap described below keeps a perimeter above
5 km² only on imaging evidence. Both defects are fixed in imagery.py for every
composite built from 2026-10-10 on, and Rewa's cell recomposed with the fix is 0.0% empty.
India was not recomposited; the affected cells are
left for the next rebuild.
The ground-perimeter screen and the 5 km² cap¶
3,481 OSM ground perimeters of 50,000 m² or more (2,221 km² together): on average 98.6% of each is imaged, and the model detects PV over a median 98.5% of each. 3,370 screen as detected, 75 as worth a look, 36 as insufficiently imaged (since the widening; it was 3,365 and 41 before).
56 perimeters exceed the 5 km² cap (751 km²). The evidence gate introduced for Vietnam keeps a feature above the cap only when it is imaged and at least 50% detected: 47 are kept, among them Bhadla (48.3 km²), Pavagada (42.9), Kurnool (23.9), Ananthapuramu (20.8) and Charanka (14.8). Nine are dropped, and the gate is visibly doing its job on the two largest: the Khavda Renewable Energy Park outline (88.3 km², tagged 1,000 MW) and NTPC Khavda (62.0 km², 397.7 MW) are 28% and 32% detected now that both are imaged whole (19% and 22% of what was imaged before the widening), and their own capacity tags imply 0.011 and 0.006 kWp/m², i.e. outlines drawn around a planned zone that is mostly still desert. So are a third Khavda outline (23.3 km², 18% detected) and a 7.9 km² outline in Rajasthan with 0.06% detected. The other five are wrong drops, all on imaging rather than on evidence of absence: Rewa's two overlapping outlines, for the reason above, and three parks of 5.1 to 5.9 km² that are 76 to 94% detected where imaged but only 24 to 77% imaged.
Best now applies the same gate. As first published, the gate covered Verified only and
its drops came back through the model: postprocess substitutes a mapped outline for the
model candidate it matches, and density exempts OSM geometry from the 100,000 m²
cap, so the Khavda RE Park and NTPC Khavda outlines entered Best whole, 3,789 MWp in their
two cells (5.0% of that day's Best) against zero in Verified. density now applies the
gate's evidence rule on the model side as well: an outline above 5 km² that fails it
is credited at its area times the share of its imaged part the model detects, and an
outline with nothing imaged earns nothing. The two Khavda cells fell to 796.4 MWp
(30.7 of 150.2 km² credited; 1,122.9 MWp and 44.6 km² since the widening
imaged the rest of both outlines) and the Rajasthan outline from 199.4 MWp to zero. The
three partly imaged parks keep 76 to 94% of their area, since an unimaged part is a
compose gap, not evidence of absence. Refusing the exemption outright would have been wrong
the other way: the model's own polygons at Khavda are merged blobs above the cap, so a zone
with several GW operating would have dropped to almost nothing.
Verified now carries them at the same share (29 October). The model-side credit was
discounted twice: density prices every candidate of its size bin at the bin's p_real,
0.503 for the largest ground bin, so the 44.6 km² detected at Khavda reached Best as
1,122.9 MWp, half of what that area is worth at the land constant. With the outlines absent
from Verified, nothing restored the other half. prepare_national_osm_solar.py now keeps
such an outline in Verified at its detected share instead of dropping it, and Best takes it
through its per-cell floor: the two Khavda cells carry 2,230.0 MWp in both tiers. The
same rule floors the credit at the plants mapped inside an outline, which matters where the
cap's dissolve had merged a 3.1 to 3.8 km² park into the 5.1 to 5.9 km² site around
it; for India's three partly imaged parks the detected share is the larger figure anyway.
Seven outlines are credited, 58.6 of 190.3 km², adding 2,930.8 MWp to Verified. Only
Rewa still earns nothing, for want of imagery. The detected share is itself a floor at
Khavda: over the dark panel blocks inside both outlines the model lights up the block edges
and not their interiors, so more of each outline is built than 28% and 32%.
A mapped park outline is never rooftop. postprocess places a candidate by its overlap
with VIDA footprints, and VIDA traces a park's panel rows as buildings, so 101 of the
exempt outlines (50.5 km²) had been placed rooftop, converted at the module
constant and priced at the rooftop p_real. They held 2,891 of the 4,109 MWp the model
reported as rooftop, and they had also set the largest rooftop bin's p_real (0.318; 0.171
without them). The OSM layer already reclassified a rooftop feature this large as ground;
the candidate side now does the same, and the precision table was re-derived on the
corrected population.
The land constant holds here. Of the kept parks above 5 km², eleven carry a capacity tag: 9,658 MW on 214.7 km², 0.045 kWp/m² pooled (median 0.047, IQR 0.042 to 0.049) against the 0.05 the atlas assumes, which was calibrated on two Pakistani plants. Indian parks usually quote AC capacity, so the DC figure is somewhat higher, closer to the constant. This is the measurement Vietnam's page listed as missing; Germany's register put German plants at 0.081 and Zambia's two measured plants at 0.085, so the constant is not universal, but it fits the Indian utility-scale fleet.
Parks the model found that nobody has mapped¶
density keeps model outlines above 100,000 m² out of capacity
(postprocess.MAX_CANDIDATE_M2), because in Pakistan, where the rule was made, such outlines
were merged sheets of false positives on bright bare ground. In India they are mostly solar
parks. On 28 October the outlines above the cap with no mapped solar within 100 m (the
export's own new-lead rule; 1,789 outlines, 659.1 km²) were checked on imagery:
| outlines | area | real | |
|---|---|---|---|
| census: the 30 largest, 2.5 to 11.7 km² | 30 | 153.8 km² | 30 |
| sample: 60 drawn from the rest by area, without replacement | 60 | 51 | |
| of which in the six Himalayan states and territories | 2 | 0 |
Every sampled outline was judged on the November to March Sentinel-2 composite and on Esri
World Imagery with its capture date, by the owner on the disk review page
(scripts/oversize_review.py, four panels per outline). The owner's verdicts agree with the
assistant's first pass on 86 of 90; a joint recheck of the other four kept three as not PV
(a Himalayan slope, ploughed fields on Esri imagery of March 2026, and an outline that reads
as water where Esri is from 2019) and found the assistant wrong on one park. 40 of the 51
parks show panel rows on Esri; 11 show bare or freshly cleared ground on an Esri capture
from 2022 to mid-2025 and panel blocks on the composite, i.e. parks built since. The nine
that are not PV are two Himalayan slopes (one beside a glacial river), rock, the outline
that reads as water, dark ploughed fields twice, grassland and burnt scrub twice. Because
the sample is drawn by area, its share real (51 of 58 outside the Himalaya, 0.879, 90%
0.793 to 0.934) is an area share. The 30 largest Khavda, Bhadla,
Pavagada-sized outlines next to the mapped parks are all real: four of them, 42.1 km²,
are operating Khavda parks outside both mapped Khavda outlines.
The review is stored in India's calibration table (oversize_review, written by
scripts/oversize_review.py apply from results/india_oversize_review/review.csv). From 29
October to 1 November density admitted these outlines as ground, the census at full credit
and the rest at the sample's share, outside the six Himalayan states and territories: 1,650
outlines, 626.4 km² of outline credited as 569.4 km², adding 28,468 MWp to the
model's estimate and about 25,400 to Best. Since 1 November only an outline a person has
judged solar counts (owner), each whole, always as ground and with no recall correction: at
first the 81 parks of the review, 185.0 km² and 9,249 MWp. On 2 November the owner judged
all 1,550 outlines the lead screens keep on the same page, largest first: 1,346 parks
(392.2 km²) and 204 not (46.1 km²), none left unsure, 87% by count against the
sample's 0.879. That makes 1,427 parks, 577.1 km², 28,857 MWp of the model's estimate
(61,324.2 MWp), and Best 103,036.9 MWp. A judged park lies at least 100 m from every mapped
feature, so it adds to the mapped figure in Best's per-cell floor too (owner, 2 November); the
floor had been hiding 3,128 MWp of them in cells where the model underrates what is mapped.
Gujarat's Best is 16,379 MWp (7,800 before any outline was admitted, 15,601 under the sample's
share). The other 149 of the 1,789 were left out by the lead screens (steep ground, open ground
at low probability, outlines beyond the border), and count only if someone maps them.
Two things this does not settle. The land constant is applied to the model's outline, which runs about 12% larger than the mapped perimeter where both exist, so the admitted figure may read up to a tenth high. And 376 outlines above the cap are still excluded: 139 in the Himalaya and 237 within 100 m of mapped solar, whose mapped part counts from the map but whose unmapped remainder (about 48 km²) was not reviewed.
Widening the compose away from buildings¶
The first run imaged a cell only if it held at least 1,000 buildings or a mapped solar
feature, so a park built on empty land and not yet mapped could not be seen. On the owner's
request (22 October) ring_cells: 3 added every cell within three cells (about 33 km) of
that selection: 3,573 cells, composed between 22 and 25 October and run through the same
chain on the same checkpoint, labels, screen rule and imagery window
(scripts/run_india_ring_chain.sh). The ring is the only change. Measured before it ran,
97.3% of mapped ground-PV area already sat in selected cells, so the widening was
insurance rather than a known gap.
| before | after | |
|---|---|---|
| cells imaged | 25,579 | 29,171 (97.1% of the country) |
| Verified | 67,592.6 MWp | 67,592.6 MWp |
| Best | 72,271.1 MWp | 72,705.1 MWp |
model estimate (est_mwp_rc) |
32,868.2 MWp | 32,467.5 MWp |
| candidates | 95,381 | 104,968 |
Best rose by 434.0 MWp, from four sources:
- Khavda, imaged whole: about +330 MWp. Six of the eight mapped outline cells left uncomposed by the first run were at Khavda, so the RE Park and NTPC Khavda outlines were 80% and 46% imaged. Both are now fully imaged, the share of them the model detects rose from 30.7 to 44.6 km², and their two cells went from 796.4 to 1,122.9 MWp (Gujarat's Best +307.2 MWp). Every cell touched by a mapped outline now has imagery.
- Mountain false positives: about +220 MWp. Of the 249.6 MWp the model finds in the new cells, 221.1 MWp lies in six Himalayan states and territories. Their Best moved by: Arunachal Pradesh +76.7, Uttarakhand +52.9, Ladakh +42.7, Himachal Pradesh +23.6, Jammu and Kashmir +11.1 and Sikkim +9.2 MWp. On every high-scoring mountain cell inspected, the detections sit on shaded slopes and snow edges beside masked pixels, not on panels. They are 0.3% of Best, inside its interval. The page keeps them, the plausibility gate flags them, and no veto is applied yet.
- New cells elsewhere: about +23 MWp, mostly small detections in Rajasthan and Gujarat (and the parks below, which are leads, not capacity).
- A slightly lower precision floor everywhere: about -140 MWp. India's
p_realis the OSM-mapped share of candidates in each size bin, and the 9,572 new candidates are all unmapped, so every bin's share fell (the largest ground bin from 0.518 to 0.503). Outside Khavda, the model's estimate in the old cells fell by 976.8 MWp. Their Best fell by only 142.2 MWp, because most of those cells are floored at their Verified value.
The widening also did what it was for. Of the 9,566 new leads in the added cells, 126 are
model outlines above the 100,000 m² merge cap. Those counted as leads, not capacity,
until 29 October; the ones with no mapped solar nearby now count at the reviewed share
(above). Among them are a solar park west of Jaisalmer (70.31°E 27.06°N, a 1.2 km²
outline with no OpenStreetMap solar feature within 3 km) and a 5.7 km² outline near
Bikaner (73.23°E 28.33°N) next to a partly mapped park. Both show panel rows on the
composite. They are in india_pv_new_leads.geojson, and the Jaisalmer park is now counted.
Plausibility gate¶
earthpv check-density reports 21 fail and 10 suspect of 35 regions. All 21 fail the
ground-to-rooftop ratio above 5x, from Haryana (5.5x) to Rajasthan (173x) and Arunachal
Pradesh (625x); nationally the model's estimate is 59,979 MWp ground against 841 MWp
rooftop, 71x (31,555 against 841, 38x, before the unmapped parks were admitted).
MNRE's own split is 3.8x (125.65 GW against 33.41 GW). As in France, the gate
is firing on the missing rooftop denominator: the household programme's 3.6 kW systems are
below what this sensor can see, so every regional ratio is inflated. The ratios read worse
than on the first version of this page (12 fail, national 8.1x) because most of what the
model then called rooftop was park outlines (see the screen section above). Arunachal
Pradesh and Himachal Pradesh fail only since the widening, and there the gate is right:
their new ground-mount is mountain false positives
(below).
Two regions also fail the single-cell check, and each flagged cell holds a reviewed park: Bihar's cell at 86.2°E 25.1°N (36% of the state) is one of the 30 largest unmapped outlines, all parks, and West Bengal's at 87.1°E 22.7°N (28%) one of the sampled outlines with panel rows on Esri. The six regions that failed on concentration before (Pavagada in Karnataka, the Ananthapuramu park in Andhra Pradesh, mapped plants in Chhattisgarh, Kerala, Assam and Jharkhand) no longer do: the admitted parks spread each state's total over more cells. The check exists to catch ground-mount false positives on bright bare land; here the ground area is mapped plant outlines the screen shows detected over a median 98.5%, and model outlines a review found real. Published with the flags stated, per this project's precedent for a checked-genuine failure.
Candidate population¶
104,968 candidates: 32,575 rooftop, 25,402 ground-adjacent, 46,991 with no building,
median 1,699 m². 2,026 model-drawn candidates exceed the 100,000 m² merge cap.
1,650 of them, with no mapped solar within 100 m and outside the Himalaya, are admitted at
the reviewed share (626.4 km², credited as 569.4); the other 376 (11.4% of candidate
area, the largest 30.27 km²) stay excluded. A further 1,332 oversize candidates carry an
OSM-verified plant geometry and are exempt, all counted as ground, six of them at their
detected share (58.6 of 174.3 km²). The model's own estimate (est_mwp_rc) is
60,935.1 MWp (90% 40,222 to 88,581), 843.5 rooftop and 60,091.6 ground; with no recall
reference it equals the precision-weighted est_mwp_cal_total. 27.3 GW of it is the
OSM-outline candidates above the cap, each weighted by the largest ground bin's p_real of
0.503, and 28.5 GW the admitted outlines. The probability-weighted est_mwp_exp, which does
not use the candidate population, is 29,545.4 MWp.
Verified is almost all ground-mount. It is the hand-mapped layer at the two constants: 1,389.8 km² of dissolved ground perimeters (58.6 of them the credited share of the seven outlines above 5 km²) against 9.3 km² of rooftop polygons. Best adds 29,018.1 MWp on top, model detections outside anything Verified counts, most of it the admitted unmapped parks.
Solar-thermal is counted as PV on this page. OpenStreetMap tags concentrated-solar plants
and rooftop water heaters with the same generator:source=solar the label pull selects,
and India's labels were built before that was noticed (Morocco's, run next, turned out to
be half solar-thermal). It was measured the day after publication, by looking the label
elements up by OSM id (scripts/drop_solar_thermal.py --by-id), since the area scans the
other countries use failed on every public mirror at India's size: 253 of the 24,810 label
features are solar-thermal, 9.4 km² once dissolved, among them the Dhirubhai Ambani
(100 MW), Megha (50 MW) and Godawari (50 MW) concentrated-solar plants. Ten features of the
hand-mapped layer lie mostly inside them and carry 473 MWp at the two constants, about 0.7%
of Verified and of Best. They are not removed on this page: dropping the four model
candidates that sit on the same plants rewrites the candidate file, which rebuilds the
density stage over all 25,576 cells (about 31 hours) for a change well inside either
interval. The widening rebuilt it anyway, and ran the candidate filter, which changed
nothing: it drops candidates inside thermal elements already removed from the labels, and
India's labels never were. Every country run after India filters it
(scripts/drop_solar_thermal.py).
Against the MNRE register¶
MNRE's state-wise installed solar capacity, republished monthly by MoSPI's eSankhyiki
(macroindicators, product MNRE),
is India's register for this page: MW per state and month in four categories, ground-mounted,
rooftop (including PM Surya Ghar), the solar part of wind-solar hybrid plants, and
off-grid/KUSUM. scripts/validate_india_mnre.py fetches it through MoSPI's own MCP server and
compares it state by state with the atlas (results/india_mnre_validation/). The register
grew from 132.8 to 150.3 GW of solar between November 2025 and March 2026, the ends of the
imagery window, so the comparison is made at its centre, January 2026 (140.6 GW).
| this page | MNRE, January 2026 | ratio | |
|---|---|---|---|
| ground-mounted (+ hybrid solar), Best | 101,089 MWp | 110,619 MW | 0.91 |
| ground-mounted (+ hybrid solar), Verified | 68,789 MWp | 110,619 MW | 0.62 |
| rooftop | 1,830 MWp | 24,297 MW | 0.075 |
| off-grid / KUSUM | not measured | 5,634 MW | |
| all solar, Best | 102,919 MWp | 140,550 MW | 0.73 |
The ground ratio is 0.97 against November's register and 0.85 against March's. Registered utility capacity in India is mostly quoted AC and this page's in DC: India's own capacity-tagged parks put site area at 0.045 per AC kW against the 0.05 the page converts at, so on an AC basis the ground ratio is 0.82. The ground-mounted figure is about a fifth short. It was about 0.64 before any park above the merge cap was counted, 0.88 while the unjudged ones counted at the review sample's share (29 October to 1 November) and 0.73 with only the first review's 81 parks. What is left is mostly parks this page does not see: Rewa and the other unimaged outlines, the unmapped part of the 237 outlines that touch a mapped park, dark block interiors the model does not light up, and parks commissioned in the window that the median composite does not yet show.
The geography holds. Across the 19 states with at least 100 MW of registered utility PV, the rank correlation between Best and the register is 0.97, 16 states are within a factor of 1.5, and the median state is off by 17% (median absolute log ratio 0.15). The four largest are Rajasthan 32.7 GW against 35.0 (0.93), Gujarat 16.1 against 20.2 (0.80), Maharashtra 8.4 against 12.1 (0.69) and Tamil Nadu 9.0 against 10.3 (0.88). The largest shortfalls are Himachal Pradesh (0.41) and Maharashtra. The page is high in small states: Punjab 1.47, Haryana 1.61, Bihar 1.98 and, by far, Jharkhand, 232 MWp against 21 MW registered, of which 134 MWp is hand-mapped outlines; whether those are captive or mislabelled plants, or a gap in the register, is not settled here.
Rooftop is where the sensor stops. The register's 24.3 GW of rooftop is mostly household systems of a few kW, about 20 m² of panel each, and this page sees 7.5% of it, the large commercial roofs. The register does not geolocate units, so unlike Germany's it cannot measure the precision of individual candidates; it checks totals per state and month.
Against the old Gujarat page¶
The earlier Gujarat page reported 812.6 MWp (est_mwp_rc) over its bounding box,
of which Gujarat state was 765.0 (168.7 rooftop, 596.3 ground). The same estimator here
gives the state 11,988.1 MWp (93.3 rooftop, 11,894.7 ground), and the atlas puts it at
Verified 8,587.8 and Best 16,379.0 MWp over 1,617 cells (7,780.4 MWp and Best 12,139.7 with the
first review's 81 parks, 1 to 2 November; 11,579.8 MWp and Best 15,601.4 while
the unjudged parks above the merge cap counted at the review sample's share, 29 October to 1
November;
4,783.7 MWp, Verified 5,852.3 and Best 7,800.1 before any was admitted; 4,554.1 MWp and Best
7,492.9 over 1,423 cells before the widening).
Against the old page, almost all of the rise to 4,783.7 MWp is one rule. The Gujarat run (2026-08-07) excluded every candidate
above 100,000 m², including those carrying a mapped plant's outline; density began
exempting OSM geometry from the cap three days later. Those 136 candidates (156.3
km² credited) are about 3.9 GW of the new state figure, 1.1 GW of it the two Khavda
outlines at their detected share. The rest is a different checkpoint (v5, where the old
page used one since deleted) and a national precision table in place of Gujarat's own (the
largest ground bin's p_real is 0.518 here against 0.309).
Panel pose from Sentinel-2 glint (2026-11-02)¶
The India atlas now carries the panel-orientation section Pakistan's and France's have. It comes from a sample of 2,000 of India's 3,739 OSM-mapped installations of 1,000 m² or more, once nested outlines are dissolved and solar thermal is dropped: all 480 of the smallest class and 760 each of the two larger ones, spread across the country by 2-degree cell. Each installation's Sentinel-2 series covers October 2025 to September 2026. The method is the same.
| Installations sampled | Glinted at least once | Pose fitted | |
|---|---|---|---|
| All | 2,000 | 497 (24.8%) | 312 (15.6%) |
| Ground-mount | 1,546 | 26.6% | 16.6% |
| Rooftop | 454 | 18.9% | 12.1% |
| 1,000 to 5,000 m² | 480 | 11.9% | 7.7% |
| 5,000 to 50,000 m² | 760 | 19.1% | 12.5% |
| Over 50,000 m² | 760 | 38.8% | 23.7% |
The 15.6% describes the sample, not India. Large installations fit most often and the sample under-represents them (38% of the sample, 55% of the population). Weighted back to the real size classes the rate is 18.1%, against France's 20.2% and Pakistan's 23.2% at the same size.
This is the first atlas to read every large installation in parts. All 760 of those over 50,000 m² were also read in 100 m cells (Solar glint). That raised their fits from 110 to 180: 72 gained a pose, 2 lost one under the cell read's cloud veto, and eight show two or more orientations. So the chart has 321 points for 312 installations.
The poses form two clusters, and the second is new.
| Cluster | Points | Median azimuth | Median tilt (IQR) | Whole-outline spike dates |
|---|---|---|---|---|
| South-facing, azimuth 120° or more | 242 | 170° | 18.6° (16.1-20.5) | 80% October to December |
| East-facing, azimuth under 120° | 79 | 93° | 9.7° (6.4-12.5) | 87% April to June |
France has no fit below 129°, and Pakistan has 23 of 281 below 120°. India's east cluster is 25% of its points, 91% of them within 80 to 110°, and it is mostly southern: 51 of the 109 points south of 20°N against 28 of the 212 north of it.
That pattern could have been an artefact. From April to June the sun at overpass stands high and in the east, so any two bright dates agree on an east-facing, low-tilt plane by construction. The fits themselves are weaker than the south-facing ones: the plane predicts dates it does not spike on (median hit rate 0.75 against 1.00), and an east orientation covers a median 8.5% of its plant against 39%.
Imagery says most of it is real. Row direction was judged by eye on Esri imagery for 27 plants. A fixed south-facing array has rows running east to west.
| Fits viewed | Rows north-south | Rows east-west | Other |
|---|---|---|---|
| South-facing controls, random, azimuth 165° or more, at least half the plant | 0 | 6 | |
| East-facing, the 9 covering the largest share of their plant | 8 | 0 | 1 diagonal, hillside blocks, does not match its fit |
| East-facing, random, whole outline under 50,000 m² | 6 | 0 | |
| East-facing, random, under 20% of the plant | 2 | 0 | 3 unclear, 1 rooftop not judged |
North-south rows are what single-axis trackers look like: a tracker's panel normal stays in the east-west plane, so its azimuth stays near 90° whatever the date, and the fitted tilt is its roll at overpass rather than a fixed tilt. Trackers are an inference. No plant's mount type was checked against a record, and fixed racks facing east would look the same from above. Two more limits apply. The page's tilt interquartile range (12.4-19.9°) mixes the two clusters, so quote the south-facing one for fixed tilt. And the cluster sizes are not a tracker share, since the two kinds glint on different dates.
The imagery check was done by the assistant and has not yet been reviewed by the owner
(contact sheets and verdicts in data/glint/india2000_pose/east_check/, not in the
repository). A low-share east orientation should be read as unconfirmed.
No Indian false-fit control has been measured, as in
France. Every point names its OSM
installation in the atlas's tooltip and CSV download. The lookup on 2026-11-02 returned 313
of 314 OSM elements; the other was deleted since the pull or dropped by the mirror. Of those
returned, 53 carry a name and 14 an operator.
Operational notes¶
Compose built 25,576 of 25,590 selected cells between 25 September and 8 October, about 83 cells per hour sustained, with the network hardening described on the Vietnam page in place from the start. systemd-oomd killed the compose unit about once a day at its 12 GB cap (20 times in all) and the queue restarted it each time; a stretch of DNS failures on 1 October (the router's rotating IPv6 resolver) cost about 1,100 cell attempts that later passes recovered.
Training ran at a milestone (every label cell plus 3,000 density cells composited), and v5
inference then ran every six hours behind the still-running compose, so only the last
cells remained when compose finished. Postprocess needed --stream-buildings (per
0.25° chunk instead of a national building table) and took 23.7 hours. The host was
rebooted at 89% of the density stage, 28 hours in; density now records its candidate
fingerprint at the start of a first run, so an interrupted run resumes instead of starting
over.
The widening's 3,573 cells were composed between 22 and 25 October, at about 55 cells per
hour, with v5 inference running every three hours behind the compose. A wrapper relaunched
the compose unit after a network stall. Postprocess reused the published building join for
every 0.25° chunk whose candidates had not changed (--reuse-join), which brought it
from 23.7 hours to 4.9. The density stage then rebuilt every cell (--force, since the
candidate file had changed) in 38.8 hours. The run before the widening is kept outside the
repository for comparison.
What India needs next¶
A calibration quadrat in a rooftop-dense area. Almost all of India's rooftop capacity is below this page's floor. Gujarat leads the household programme by state, so a box there is the obvious first one. Check the imagery date before drawing it; see the quadrat protocol.
Recomposite the affected cells, Rewa first. Its two outlines (16.0 and 10.5 km²) are still unimaged; the widening added cells but rebuilt none.
A terrain veto for model candidates with no building nearby. The widening's mountain false positives sit on steep shaded slopes. A slope test like the one the farm ground-PV detector already applies (12° on Copernicus GLO-90) would likely remove them, but it is a new rule for every country's segmentation half and needs a full density rebuild.
The rest of the outlines above the cap. The 237 that touch mapped solar, whose unmapped remainder is still uncounted, are the next population to review, and the outline in Madhya Pradesh priced as water needs a current image.
Reproducing¶
pixi run python scripts/overpass_labels_chunked.py --bbox 68.0,6.7,97.5,37.1 \
--iso3 IND --name india --tiles 14x14 --timeout 300 --retries 8
systemd-run --user --collect --unit=earthpv-vn-in-queue -p WorkingDirectory="$PWD" \
-p LimitNOFILE=65536:65536 -p MemoryMax=4G bash scripts/run_vn_in_queue.sh
The queue composes India behind Vietnam and hands it to scripts/run_country_compute.sh
india (chips at the training milestone, training, the v5 comparison, incremental inference
and the atlas chain, behind marker files). The widening is ring_cells: 3 in
configs/aoi.yaml, a compose run, and then everything downstream of it:
systemd-run --user --collect --unit=earthpv-india-ring-chain -p WorkingDirectory="$PWD" \
-p LimitNOFILE=65536:65536 -p MemoryMax=14G bash scripts/run_india_ring_chain.sh
The two size rules of 29 October need no rebuild of the cell partials: the review goes into
the calibration table, the OSM layer is rebuilt with its screen, and density (without
--force) and the atlas re-run:
pixi run python scripts/oversize_review.py apply --aoi india \
--exclude-region "Uttarākhand" --exclude-region "Himāchal Pradesh" --exclude-region "Ladākh" \
--exclude-region "Jammu and Kashmīr" --exclude-region "Sikkim" \
--exclude-region "Arunāchal Pradesh" --reviewer "..."
pixi run python scripts/prepare_national_osm_solar.py --aoi india \
--labels data/labels/india_overpass_solar.parquet \
--keep-detected-screen results/india_osm_ground_screen/screen_full.csv
pixi run earthpv density --aoi india --districts
pixi run earthpv atlas --aoi india --osm-solar data/labels/india_national_osm_solar.parquet \
--include-offgrid-osm --imagery-date-range "Nov 2025 - Mar 2026"
The glint pose survey, then its section on the published atlas. It needs no rebuild, and
parts-analyze comes before osm-tags, because the lookup names every installation the
parts read posed:
python scripts/glint_pose_survey.py targets --name india2000 \
--source data/glint/india_pose/source_no_thermal.parquet --min-area 1000 --sample 2000
python scripts/glint_pose_survey.py pull --name india2000 --start 2025-10-01 --end 2026-10-01
python scripts/glint_pose_survey.py analyze --name india2000
SUM=data/glint/india2000_pose/summary.csv
python scripts/glint_pose_survey.py parts-pull --summary $SUM --start 2025-10-01 --end 2026-10-01
python scripts/glint_pose_survey.py parts-analyze --summary $SUM
python scripts/glint_pose_survey.py osm-tags --summary $SUM
python scripts/patch_atlas_pose.py results/india_pv_evidence_atlas.html \
docs/assets/interactive/india_pv_evidence_atlas.html --summary $SUM --country India \
--density-dir data/predictions/india/density --data-note "(...)"