GIS · LiDAR · Python

Rooftop Solar Potential: 1 m LiDAR vs a 30 m Open DSM

One rooftop-solar method, two elevation datasets: 1 m airborne LiDAR in Austin, and a 30 m open global DSM in Kathmandu, where no open LiDAR exists. The comparison measures how elevation-data resolution biases what the analysis can see.

USGS 3DEP LiDARArcGIS Pro · PDALPython · rasterio Copernicus GLO-30OpenStreetMap
Per-building rooftop solar potential, West Austin, from 1 m LiDAR
Per-building rooftop solar potential, West Austin, derived from a 1 m LiDAR DSM. Red = highest annual kWh.
01Two datasets

Rooftop-solar analyses are usually demonstrated on US cities with high-quality airborne LiDAR. In much of the world, including Nepal, that data does not exist: there is no open LiDAR for Kathmandu.

I ran the same method in both settings: Austin, where 1 m LiDAR is available, and Kathmandu, where a 30 m open DSM is the best available surface.

The comparison measures how much elevation-data resolution distorts a solar estimate, and in which direction.

Per-building rooftop solar screen, Kathmandu, from 30 m open DSM
Kathmandu, same method on a 30 m open DSM; the output is a footprint-level screen.
02From point cloud to surface

The Austin side starts from a raw 24.6-million-point USGS 3DEP LiDAR tile. In ArcGIS Pro I filtered and rasterized the point cloud into two 1 m surfaces: a DSM from first returns (roof and canopy tops) and a ground-filtered DTM (bare earth). Both surfaces are in EPSG 6343 with metre units and NAVD88 heights, so slope and area compute without unit conversion.

Deep dive

The complete workflow, from LAZ-to-LAS conversion through the LAS Dataset to Raster parameters, ground filtering, and CRS verification, documented step by step with screenshots.

Read the full LiDAR processing methodology
Digital Surface Model from LiDAR
DSM (1 m): roofs, trees, structures resolved
Digital Terrain Model from ground returns
DTM (1 m): ground-filtered bare earth
03Method
  1. Austin: process raw LiDAR (LAZ → LAS dataset → 1 m DSM/DTM) in ArcGIS Pro; verify CRS (EPSG 6343, metres).
  2. Kathmandu: download an open Copernicus GLO-30 DSM, reproject to UTM 45N (EPSG 32645) in Python.
  3. Both: derive slope and aspect from the DSM, pull OpenStreetMap building footprints, and aggregate per building (rasterio + geopandas).
  4. Estimate annual rooftop kWh per building: usable area × irradiation × aspect score × panel efficiency × performance ratio, using the same shared module for both cities.

Identical code runs both cities; only the input surface and its resolution change.

04What resolution changes
40.3° → 3.7°Mean modeled roof slope: LiDAR vs 30 m DSM
96% → 13%Building footprint survival rate
p ≈ 10⁻⁶⁸Distributions differ (Mann–Whitney U)
MetricAustin · 1 m LiDARKathmandu · 30 m DSM
Buildings analyzed1,728947
Footprint survival96.3%13.0%
Mean roof slope40.3°3.7°
Usable roof fraction0.471.00
Median kWh / building7,40414,355

The 30 m DSM introduces directional bias through two mechanisms. It flattens roof pitch (40° → 4°), so nearly every roof reads as flat and usable area is over-credited. It also drops small buildings: only 13% of Kathmandu footprints survive, which skews the sample toward large roofs.

Together these effects inflate Kathmandu's per-building median above Austin's. That gap is an artifact of resolution, not a real difference between the cities.

Deep dive

The full statistical comparison: distribution tests, the slope-flattening and footprint-survival mechanisms, and an advantages/disadvantages breakdown of each data environment.

Read the full comparative analysis
Slope, usable fraction, and footprint survival comparison
The bias mechanism: pitch flattening, usable-fraction inflation, small-building dropout
Distribution of per-building solar potential
Per-building solar distributions on shared axes
05Limitations
  • Global horizontal irradiation values are long-term annual GHI from the Global Solar Atlas (Austin 1,751; Kathmandu 1,775 kWh/m²/yr). The energy model is first-order, so absolute totals are indicative only; the relative within-city and cross-resolution findings are the robust results.
  • The Kathmandu result is a footprint-level screen; a 30 m DSM cannot resolve individual roof planes.
  • First-order energy model; no inter-building shading in the Python step.
  • OSM footprint completeness and the choice of footprint dataset materially affect Kathmandu totals.

Open the code & methodology

Reproducible Python pipeline, the full LiDAR processing methodology, and the comparative analysis on GitHub.