GIS · LiDAR · Python

Rooftop Solar Across Data Environments

One rooftop-solar method, two very different elevation datasets: 1 m airborne LiDAR in Austin, and a 30 m open global DSM in Kathmandu — where LiDAR does not exist. The finding is not which city has more sun, but how data resolution systematically 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.
01The question

Most rooftop-solar demos run a clean pipeline on a US city with high-quality LiDAR and stop there. But in most of the world — including Nepal — that ideal data does not exist. Open LiDAR for Kathmandu is simply not available.

So this project turns the data gap into the experiment: run the identical method where LiDAR exists (Austin, 1 m) and where it doesn't (Kathmandu, 30 m open DSM), then ask what is gained and lost.

The real question isn't "which city gets more sun" — it's how much does elevation-data resolution distort 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 — a footprint-level screen, not roof-facet design.
02From point cloud to surface

The Austin side starts from a raw 24.6-million-point USGS 3DEP LiDAR tile. In ArcGIS Pro the point cloud is filtered and rasterized into two 1 m surfaces: a DSM (first returns — roof and canopy tops) and a ground-filtered DTM (bare earth). Correct coordinate handling (EPSG 6343, metres, NAVD88) keeps slope and area honest.

Deep dive

The complete workflow — the LAZ-to-LAS conversion, the LAS Dataset to Raster parameters, the ground filtering, and the 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 — the same shared module for both cities.

Identical code runs both cities. Only the input surface and its resolution change — that is the methods-transfer design.

04The resolution-bias finding
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

Coarse open data doesn't just add noise — it adds directional bias. The 30 m DSM flattens roof pitch (40° → 4°), so it treats nearly every roof as an ideal flat panel and over-credits usable area. It also drops small buildings: only 13% of Kathmandu footprints survive, biasing the sample toward large roofs.

Together these inflate Kathmandu's per-building median above Austin's — an artifact of resolution, not a real difference.

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 rather than design-grade; the relative within-city and cross-resolution findings are the robust results.
  • The Kathmandu result is a footprint-level screen, not roof-facet design — 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.