AI Solar Panel

How to Measure Your Roof Without Getting on a Ladder

Every solar quote you’ve ever been sent contains a number somebody guessed. Usually it’s the pitch. Sometimes it’s the azimuth. Almost always it’s the usable area, because the salesperson counted the roof plane and not the roof minus the vent stack, minus the 300 mm you legally can’t build to at the verge, minus the shaded triangle the neighbour’s chimney throws across your bottom two rows every morning until half nine.

If you’re modelling your own system, that guess propagates. A 5° pitch error is worth roughly 1-2% of annual yield in the UK. A 20° azimuth error can be worth 3-5%. Getting the panel count wrong by one is worth 400-450 kWh a year. None of those are fatal on their own, but stack four of them and your payback calculation is off by a year and you don’t know which input did it.

So: measure it properly. From the ground, from your desk, in an afternoon. Here’s the method I use, tool by tool, with the honest error bar on each.

What you’re actually trying to produce

Four numbers per roof plane, in this format:

Plane: rear (main)
Pitch:        35° ± 2°
Azimuth:      172° (true) ± 3°
Gross area:   48.2 m² ± 1.5 m²
Usable area:  38.6 m² ± 2.0 m²  (after setbacks + obstructions)
Panel fit:    14 × 1722×1134 portrait, 2 rows of 7

Note the format. Every number carries its uncertainty, because you’re going to feed these into PVGIS or SAM and you want to know whether your output range is ±3% or ±12%. The pillar piece on forecasting what your roof will actually generate picks up from exactly this handoff point, so it’s worth getting the error bars right rather than pretending to a precision you haven’t earned.

Pitch: three methods, ranked by how much you’ll trust them

The phone inclinometer, used from inside the loft

This is the most accurate method available to a homeowner and almost nobody uses it, because everyone assumes you need to be on the roof. You don’t. Your rafters are parallel to your roof surface.

Go into the loft. Find a rafter (the sloping timber, not the horizontal ceiling joist). Put a straight edge along it, spanning at least 600 mm to average out any twist or bowing. Rest your phone on the straight edge and read the angle.

For the app: on iOS, Measure has a Level tab that reads to 0.1°. On Android, Bubble Level by Antti Halonen is the one I’ve found most consistent. Whatever you use, calibrate first on a surface you know is flat (a kitchen worktop, a windowsill you’ve checked with a spirit level) and note the offset. My phone reads 0.6° high on level, consistently, and I subtract it every time.

Take five readings on different rafters, spread across the plane. Here’s a real set from a 1930s semi:

Rafter 1:  35.4°
Rafter 2:  34.8°
Rafter 3:  35.1°
Rafter 4:  35.9°
Rafter 5:  35.2°
Mean:      35.3°   (minus 0.6° calibration = 34.7°)
Spread:    1.1°

Round to 35°. Accuracy budget: ±1°, and that’s dominated by the rafter timbers themselves not being perfectly straight rather than by the sensor. Good enough that pitch stops being a source of error in your model.

One caveat: if your loft has been converted or the rafters are sistered, doubled or sagging, the reading drifts. Check that your five readings agree within about 1.5°. If they don’t, something’s not straight and you should cross-check with another method.

Planning drawings and building control records

If any work has been done to the property, there may be a section drawing showing the roof profile with a dimensioned pitch. Search the local authority planning portal for the address. Most councils use Idox Public Access, and the URL pattern is usually publicaccess.<council>.gov.uk. Search by address, open any application, then look at the Documents tab for anything called “Proposed Elevations” or “Section A-A”.

What you’re after is either an annotated angle (sometimes drawn as “35° pitch”) or a dimensioned section you can measure off. If it’s dimensioned, you get pitch from ridge height above wall plate and half the span:

Ridge height above wall plate:  2,450 mm
Span (wall plate to wall plate): 7,000 mm
Half span:                       3,500 mm
Pitch = atan(2450 / 3500) = atan(0.7) = 34.99°

Accuracy budget: ±1° if dimensioned, ±3° if you’re scaling off a PDF. Scaling is where people go wrong. PDFs get resized, “not to scale” gets ignored, and a drawing that was 1:50 on A3 is something else entirely once it’s been through a scanner. If you’re scaling, find a known dimension on the same drawing (a standard door opening at 838 mm, a brick course at 75 mm) and check your ruler against it first.

Worth noting: these drawings show what was proposed, not necessarily what was built. Treat a drawing that agrees with your inclinometer as confirmation. Treat a disagreement as a reason to trust the inclinometer.

LiDAR tiles, for when you can’t get in the loft

The Environment Agency publishes national LiDAR coverage for England at 1 m and, in most populated areas, 50 cm resolution, free, under the Open Government Licence. Get it from the DEFRA Data Services Platform survey download tool. You want the DSM (Digital Surface Model), not the DTM. The DTM has buildings stripped out, which is the opposite of what you need.

Download the 5 km tile covering your postcode, open it in QGIS (free, and the raster tools you need are in the base install). Then:

  1. Load the .tif. If it comes as ASCII grid, QGIS reads that too.
  2. Zoom to your building. At 50 cm resolution a typical semi’s rear roof plane is maybe 20 × 12 pixels, which is workable.
  3. Use the Profile Tool plugin to draw a line from eaves to ridge, perpendicular to the ridge line.
  4. Read the height change and the horizontal distance off the profile.

Real example, 50 cm DSM, rear plane of a terraced house:

Point at eaves:   ground+4.85 m  (elevation 41.20 m)
Point at ridge:   ground+8.05 m  (elevation 44.40 m)
Horizontal run:   4.50 m
Rise:             3.20 m
Pitch = atan(3.20 / 4.50) = 35.4°

Accuracy budget: ±3° on 50 cm data, ±5° on 1 m data. The limit is edge effects. LiDAR returns at the ridge get smeared because the laser hits both planes, and eaves returns get contaminated by gutters, overhanging vegetation and the wall below. Pick your profile endpoints 1-1.5 m inside the actual roof edges and extrapolate, which is what the arithmetic above does.

Scotland has Remote Sensing data via the Scottish Remote Sensing Portal with patchier coverage. Wales is covered by DataMapWales at 1 m and 2 m. Northern Ireland is thinner: OpenDataNI has some, but you may be back to the inclinometer.

Azimuth: the one everyone gets wrong by 2°

Azimuth is where the magnetic-versus-true distinction bites, and where your phone compass quietly lies to you because it’s sitting next to a steel purlin.

Skip the compass. Use Google Earth Pro on desktop (free download, not the browser version, because you want the ruler tool with bearing readout).

Find your building. Switch to the highest-resolution imagery available, then use the historical imagery slider to find a date where the roof edges are crisp: summer afternoon imagery often has harsh shadows that obscure the ridge, while a flat overcast capture is much easier to trace. Now use Ruler → Line and draw along the ridge. Google Earth gives you the heading directly, in true north degrees.

Ridge heading (Google Earth Pro ruler): 82.4°
Roof faces perpendicular to ridge, on the south side:
Azimuth = 82.4° + 90° = 172.4°

So 172°, which is 8° east of due south. Good roof.

Two things to check. First, make sure you’ve picked the right perpendicular: adding 90° gives you one plane, subtracting gives the other, and which is which depends on ridge orientation. Sanity-check against the shadow direction in the imagery, or just against where the sun is when you stand in the garden at noon.

Second, verify the imagery isn’t offset. Google Earth’s aerial imagery in the UK is generally well-registered but I’ve seen 1-2 m shifts in rural areas. Cross-check the building footprint against OS OpenData’s OS Open Map – Local, or against the Ordnance Survey basemap in QGIS. If the footprints align, your bearing is trustworthy.

Accuracy budget: ±2° for a ridge line over 8 m, ±5° for a short ridge under 4 m. Longer line, smaller angular error from a given pixel-level tracing error. If your ridge is short, draw along the eaves line instead and take the mean of both.

For hipped roofs with no clean long edge, trace the ridge anyway and accept ±5°. A 5° azimuth error near due south costs you under 0.5% of annual yield, so it barely matters. The same error matters more on an east or west plane, where output changes faster with orientation, but still lands inside 1.5%.

Usable area, which is not the same as roof area

Gross plane area is easy: Google Earth’s polygon tool will give you a plan-view area, then divide by cos(pitch) to get true sloped area.

Plan area from Google Earth polygon:  39.5 m²
Pitch: 35°,  cos(35°) = 0.8192
True sloped area = 39.5 / 0.8192 = 48.2 m²

Now subtract. This is the part that separates a real number from a brochure number, and it’s entirely about knowing what you’re looking for.

Fire service setback. Approved Document B and most DNO/installer practice puts a clear zone at the perimeter. In practice: 300-400 mm at verges and eaves, and if the array exceeds certain dimensions you may need a clear route to the ridge. On a 7 m × 6.9 m plane, a 350 mm perimeter setback removes about 8.9 m² before you’ve placed a single panel.

Obstructions, counted from the ground. Walk around with a notebook. Soil vent pipe, bathroom extract terminal, boiler flue, satellite dish bracket, TV aerial, chimney, roof window, lead flashing runs. Each one blocks not just its own footprint but the panel it intrudes on. A 110 mm SVP sitting 1.2 m up from the eaves in the middle of the plane costs you one full panel, 2 m² of usable area and ~440 kWh/year.

Shading, which needs its own pass. Use Google Earth’s 3D buildings and the sun slider (the little sun icon in the toolbar), set to 21 December, and step through the day. That gets you the worst case for near shading from buildings. For trees, it’s less reliable, because Google’s tree models are approximate and deciduous canopy state varies. Measure tree height from the ground using your phone inclinometer and trigonometry:

Distance to tree base (paced or tape):  12.0 m
Inclinometer angle to treetop:          38°
Eye height:                              1.60 m
Tree height = 12.0 × tan(38°) + 1.60 = 9.38 + 1.60 = 10.98 m

Then compare against the winter sun elevation for your latitude. At 52°N, solar noon elevation on 21 December is about 15°. A tree 11 m tall casts a noon shadow 11 / tan(15°) = 41 m long. If it’s 12 m south of the house, that roof is in shadow at midwinter noon, full stop.

Worked total for the example plane:

Gross sloped area:           48.2 m²
Less perimeter setback:      -8.9 m²
Less SVP + one panel:        -2.0 m²
Less permanently shaded strip (bottom row, west end): -3.4 m²
Usable:                      33.9 m²
Panels at 1.95 m² each:      14 (with 2.6 m² spare, not enough for a 15th)

Accuracy budget on usable area: ±2 m², or about one panel. Almost all of that uncertainty is in the shading and setback judgement, not in the geometry. Which means if you want to tighten your model, don’t buy a better measuring tool. Spend the time on the shading pass instead.

Cross-checking, because one method is a guess and two is a measurement

Run at least two independent methods for pitch and reconcile them. Here’s what a real reconciliation looks like on the house I’ve been using:

InputMethod AMethod BAdopted
PitchLoft inclinometer: 34.7° ±1°LiDAR 50 cm DSM: 35.4° ±3°35° ±1°
AzimuthGE Pro ridge bearing: 172.4° ±2°Planning site plan north arrow: ~170° ±5°172° ±2°
Plan areaGE polygon: 39.5 m²Measured eaves length × slope from section: 40.1 m²39.8 m² ±0.8 m²

When the two methods agree inside their combined error bars, adopt the tighter one. When they don’t, something’s wrong with an assumption, and finding out what is more valuable than averaging them. On one job the LiDAR said 22° and the inclinometer said 35°: turns out the LiDAR profile had clipped a flat-roofed rear extension, not the main roof at all.

The last thing to do is write your accuracy budget down next to your adopted figures, because in three months when your model and your actual generation disagree by 6%, you’ll want to know whether 6% was inside your error bars all along or whether something real has changed. Panel count you can check against the invoice. Pitch, azimuth and shading you cannot re-measure from memory, and the note you didn’t take is the one you’ll need.